c #define ?

Тема в разделе "WASM.UNIX", создана пользователем vdk, 9 дек 2004.

  1. vdk

    vdk New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2003
    Сообщения:
    18
    Код (Text):
    1. #define int x[]
    2. #define int *y
    3. x a; y b;




    если кто знает подскажите, чем тип переменной а отличается от типа переменной b
     
  2. intuit

    intuit New Member

    Публикаций:
    0
    Регистрация:
    1 июн 2003
    Сообщения:
    28
    ничем.
     
  3. shameel

    shameel New Member

    Публикаций:
    0
    Регистрация:
    6 дек 2004
    Сообщения:
    25
    Адрес:
    Kazakhstan
    Наверное, чтобы это комрилировалось без ошибок должно выглядеть так:



    typedef int x[];

    typedef int *y;

    x a;

    y b;



    А вообще имя массива это константный указатель.
     
  4. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    #define int x[]

    #define int *y

    x a; y b;




    разве так можно? Я бы понял если бы

    #define y int *



    С иксом вообще непонятно.
     
  5. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    насчет "ничем" я бы поспорил.

    вот код:
    Код (Text):
    1.  
    2. int x[5];
    3. int *y;
    4.  
    5. x[2] = 1;
    6. y[2] = 1;
    7.  


    а вот что генерирует компилятор:
    Код (Text):
    1.  
    2. ; Line 7
    3.     mov DWORD PTR _x$[ebp+8], 1
    4. ; Line 8
    5.     mov eax, DWORD PTR _y$[ebp]
    6.     mov DWORD PTR [eax+8], 1
    7.  


    разница огромная, и при связывании модулей на C и ассемблере я на этом несколько раз подъ...ошибался в общем.
     
  6. AsmGuru62

    AsmGuru62 Member

    Публикаций:
    0
    Регистрация:
    12 сен 2002
    Сообщения:
    689
    Адрес:
    Toronto
    И ещё sizeof() выдаст разный размер для таких переменных:
    Код (Text):
    1.  
    2. int a [] = { 4, 12, 8 }; // sizeof (a)=12
    3. int *b = { 4, 12, 8 }; // sizeof (b)=4
    4.  
     
  7. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Очень паскудная практика программирования - использовать #define в таком виде...
     
  8. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    володь, я думаю вопрос был не в дефайне а именно в разнице между двумя объявлениями. по крайней мере я именно так его понял. Хотя согласен - как минимум typedef - за такие дефайны руки отрывать надо.
     
  9. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    ** А вообще имя массива это константный указатель.

    как видишь, компилятор находит еще одну разницу :)
     
  10. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169




    int a [] = { 4, 12, 8 }; // sizeof (a)=12

    int *b = { 4, 12, 8 }; // sizeof (b)=4







    Э-э-э! AsmGuru62 - ты это чего? В одном случае имеем объявление массива из трех переменных по четыре байта каждая - итого 12. Во втором имеем указатель на массив из int - т.е. 4 байта... Так что тут разница ого-го какая!
     
  11. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    infern0

    по крайней мере я именно так его понял.



    Ты его правильно понял. Это я с оффтопом влез ;)
     
  12. S_T_A_S_

    S_T_A_S_ New Member

    Публикаций:
    0
    Регистрация:
    27 окт 2003
    Сообщения:
    1.754
    #define int x[]

    #define int *y



    Эта хрень вообще должна ошибку препроцессора вызывать, т.к. сначала макрос int определяется как x[], а потом переопределяется как *y. Переопределение макросов невозможно.
     
  13. letopisec

    letopisec New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2004
    Сообщения:
    228
    кроме того имя для макроса совершенно не удачное
     
  14. Artem

    Artem New Member

    Публикаций:
    0
    Регистрация:
    21 июл 2003
    Сообщения:
    29
    Адрес:
    Russia
    Код (Text):
    1. typedef int x[];
    2. typedef int *y;
    Здесь типы x и y ничем не отличаются.

    А вот здесь смысл уже немного другой:
    Код (Text):
    1. typedef int x[5];


    infern0
    Код (Text):
    1. int x[5];
    2. int *y;
    Ну так x - массив из 5 элементов, а y - просто указатель, разница очевидна.



    AsmGuru62

    А такой вариант у меня вообще не компилится:
    Код (Text):
    1. int *b = { 4, 12, 8 };
     
  15. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    Подумал я что ветка подходящая чтоб спросить...

    Как в C задать массив одинаковых элементов определенной длины, т.е. что в masm выглядело бы так:

    sBuff db 260 dup ("1")

    и желательно ещё в конце буфера задать 0, т.е. чтоб получилась zero string
     
  16. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    char sBuff[260]="111111111111... и так до 260 :)";
     
  17. vdk

    vdk New Member

    Публикаций:
    0
    Регистрация:
    18 дек 2003
    Сообщения:
    18
    All

    вместо #define, конечно должно быть typedef

    вобщем я уже разобрался (не без вашей помоши) почему неполучалось заменить переменную типа x на переменную типа y
     
  18. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    volodya

    > и так до 260 :)



    Не, это не прикольно, неужели C настолько туп.

    В том же питоне можно написать например так:

    win32api.OutputDebugString("%s" * 50)

    как тоже самое сделать на C ?
     
  19. volodya

    volodya wasm.ru

    Публикаций:
    0
    Регистрация:
    22 апр 2003
    Сообщения:
    1.169
    Как тебе сказать... Теперь уже задумался всерьез... Нет, насколько я знаю, в С нет аналогов dup, times и т.п. Поэтому тебе придется поступать через 屁股. Например, вот так:



    char sBuff[260];

    memset( buffer, '1', 260 );



    Это уродливо, но ни до какой директивы препроцессора я так и не додумался :dntknw: