Тут размещают свои топики новички в С/С++.

Тема в разделе "LANGS.C", создана пользователем nitrotoluol, 4 мар 2007.

  1. _DEN_

    _DEN_ DEN

    Публикаций:
    0
    Регистрация:
    8 окт 2003
    Сообщения:
    5.383
    Адрес:
    Йобастан
    dr_dred

    директива #include полностью равноценна простому вставливанию одного файла в дгугой. Единица сборки это общий файл, который получается после всех #include
     
  2. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    Очередные грабли...

    Допустим есть следующее поле структуры

    unsigned short length;

    и переменная packet_length, в которой находится размер IP пакета.

    После заполнения этого(и соответственно всех остальных) поля заношу структуру в буфер с помощью memcpy и пересылаю пакет. Но поскольку в памяти данные хранятся "наоборот", то пакет получается весом не 21Ch, к примеру, а 1C02h, что создает некоторые неудобства:) Так можно как-то "культурно" (с помощью С) обойти эту проблему, или же нужно все делать "вручную"? Сразу извиняюсь за тупой вопрос.
     
  3. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
  4. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    mov ax, length
    xchg al, ah
     
  5. lukash

    lukash New Member

    Публикаций:
    0
    Регистрация:
    31 авг 2006
    Сообщения:
    142
    n0name
    censored

    Спасибо, понял.
     
  6. Ss_oO0

    Ss_oO0 New Member

    Публикаций:
    0
    Регистрация:
    11 ноя 2006
    Сообщения:
    65
    Объясните новичку... В файле Xlib.h имеем следующее:
    Код (Text):
    1. struct _XDisplay;               /* Forward declare before use for C++ */
    2.  
    3. #ifndef XLIB_ILLEGAL_ACCESS
    4. typedef struct _XDisplay Display;
    5. #endif
    6.  
    7. typedef struct
    8. #ifdef XLIB_ILLEGAL_ACCESS
    9. _XDisplay
    10. #endif
    11. {
    12.         ...
    13.         int proto_major_version;/* major version of server's X protocol */
    14.         ...
    15. }
    16. #ifdef XLIB_ILLEGAL_ACCESS
    17. Display,
    18. #endif
    19. *_XPrivDisplay;
    В своей проге подключаю Xlib.h. При этом объявление
    Display *dpy;
    вполне корректно и переменную dpy можно передавать в функции, однако
    доступ к полям структуры получить не могу:
    printf("proto_major_version = %d\n",dpy->proto_major_version);
    вызывает
    error: dereferencing pointer to incomplete type

    Доступ можно получить, только если в опциях компилятора (gcc) указывать
    -DXLIB_ILLEGAL_ACCESS=1

    Как это возможно? Ведь если XLIB_ILLEGAL_ACCESS не определена, то в Xlib.h
    получаем
    Код (Text):
    1. struct _XDisplay;
    2. typedef struct _XDisplay Display;
    3. typedef struct
    4. {
    5.         ...
    6.         int proto_major_version;/* major version of server's X protocol */
    7.         ...
    8. }
    9. *_XPrivDisplay;
    Однако ниже этого определения в Xlib.h тип Display уже используется.
     
  7. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    Преобразование типов FARPROC

    Почему не компилируется код
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. int main( )
    5. {
    6.     HMODULE hNTDLL = GetModuleHandle(TEXT("ntdll.dll"));
    7.     printf( "ntdll.dll = %p\n", hNTDLL);
    8.  
    9.     pZw = (FARPROC)GetProcAddress(hNTDLL, TEXT("ZwQuerySystemInformation"));
    10.    
    11.     return 0;
    12. }
    в typedef.h farproc определен как

    typedef int (FAR WINAPI *FARPROC)();

    Как можно преобразовать возвращаемое значение не используя typedef
    И как определять тогда pZw (int pZw или int *pZw)
     
  8. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    novIce
    Потому, что не определена переменная pZw.

    Например, используя явное приведение типов непосредственно в коде
    Код (Text):
    1. #include <stdio.h>
    2. #include <windows.h>
    3.  
    4. int main( )
    5. {
    6.     int *pZw = NULL;
    7.     HMODULE hNTDLL = GetModuleHandle(TEXT("ntdll.dll"));
    8.     printf( "ntdll.dll = %p\n", hNTDLL);
    9.  
    10.     pZw = (int *)GetProcAddress(hNTDLL, TEXT("ZwQuerySystemInformation"));
    11.    
    12.     return 0;
    13. }
     
  9. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Ss_oO0
    для возможности обращения к полям структуры через объявление
    Код (Text):
    1. typedef struct _XDisplay Display;
    2. //...
    3. Display DsplStruct;
    саму struct _XDisplay необходимо сначала определить.
    Однако, в случае если истинно
    Код (Text):
    1. #ifndef XLIB_ILLEGAL_ACCESS
    то возможно обьявить указатель на подобный тип таким образом:
    Код (Text):
    1. _XPrivDisplay dpy;
    (т.к. структура в данном случае определяется)
    Далее инициализировать его неким адресом памяти(Ptr):
    Код (Text):
    1. dpy = (_XPrivDisplay)Ptr;
    и спокойно себе использовать:
    Код (Text):
    1. printf("proto_major_version = %d\n",dpy->proto_major_version);
     
  10. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    novIce
    Лучше использовать typedef, т.к. с ним понятней. Хоть без него можно записать кратко, но новичку трудно будет разобрать конструкцию.

    Код (Text):
    1. // требуемая функция выглядит так: BOOL CloseHandle(HANDLE hObject);
    2. // делаем новый тип: указатель на эту функцию
    3. typedef BOOL (WINAPI *PCloseHandle)(HANDLE); // winapi - т.к. stdcall
    4.  
    5. // работаем
    6. HMODULE hLib = GetModuleHandleA("kernel32.dll");
    7. PCloseHandle p = (PCloseHandle)GetProcAddress(hLib, "CloseHandle");
    8. BOOL status = p(my_handle); // собственно вызов
     
  11. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    Если использовать макрос FARPROC (typedef int (FAR WINAPI *FARPROC)();) будет так если я правильно его понял - это тот же дальний указатель и приведение типов будет примерно такое:

    #include <stdio.h>
    #include <windows.h>

    int main( )
    {
    FARPROC *pZw = NULL;
    HMODULE hNTDLL = GetModuleHandle(TEXT("ntdll.dll"));
    printf( "ntdll.dll = %p\n", hNTDLL);

    pZw = (FARPROC)GetProcAddress(hNTDLL, TEXT("ZwQuerySystemInformation"));
    printf ("pZw = %p\n", pZw);

    return 0;
    }

    Почему не отображается адрес PZw? Опять что то не так.
     
  12. mathio

    mathio New Member

    Публикаций:
    0
    Регистрация:
    16 июн 2007
    Сообщения:
    110
    Во-первых, правильно в этом случае писать так:
    FARPROC pZw = NULL;
    а во-вторых, всё должно работать ;)
     
  13. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    Да вернее FARPROC pZw = NULL;
    Все компилиться но адрес не отображается (00000000) вот что не понятно
     
  14. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    макрос TEXT в топку. GetProcAddress бывает тольок Multi-byte.
     
  15. novIce

    novIce New Member

    Публикаций:
    0
    Регистрация:
    14 июн 2004
    Сообщения:
    45
    Адрес:
    Russia
    n0name
    Млин ну не мог ты раньше этого сказать так и есть.

    Всем спасибо!
     
  16. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    А компилятор ничего не сказал по этому поводу? В случае юникода он бы не пропустил такой код.
     
  17. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    Всем привет.
    Задание для курсовой создать RLE-архиватор. Алгоритм архиватора знаю, не знаю как подключить рисунок и пронумеровать его пикселы по порядку.
     
  18. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Храните рисунок в своем формате, тогда точно будете знать как пискели распологаются, в каком порядке идут байты, каков размер хидера и т.д.
     
  19. Susel

    Susel New Member

    Публикаций:
    0
    Регистрация:
    22 май 2007
    Сообщения:
    7
    Т.е. в своем?
    Если я, к примеру, хочу архивировать .bmp-файлы, что мне стоит сделать для загрузки файла?

    #include "fstream"
    ...
    ifstream op_file;
    ...
    op_file.open("picture.bmp")

    Сойдет?

    И поподробнее, пожалуйста, с порядком пикселов.
     
  20. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Тем самым Вы открыли файл, далее нужно прочитать заголовок, выделить необходимую память, считать изображение, обработать его, если и необходимо записать.