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

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

  1. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    Есть такой код:

    Код (Text):
    1. #include "windows.h"
    2.  
    3. int buff[260];
    4.  
    5. int main(int argc, char* argv[])
    6. {
    7.    int var = 123;
    8.    int cbWritten;
    9.    int* pnt;
    10.  
    11.    pnt = &var;
    12.  
    13.    wsprintfA((char*)&buff,"var  = %d \npnt  = %Xh \n*pnt = %d",var,pnt,*pnt);
    14.    WriteConsole(GetStdHandle(-11),(char*)&buff,lstrlen((char*)&buff),(unsigned long*)&cbWritten,NULL);
    15.  
    16.    return 0;
    17. }
    Всё работает. Но:

    Если например ф-и WriteConsole не указать что у 4-го параметра тип (unsigned long*), то компилятор пишет:

    Конечно ничего не мешает обьявить переменную именно такого типа сразу. Но где же тогда преобразование
    типов. Ведь оба типа (int и unsigned long) по 4 байта, оба целые. Что не так?
     
  2. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    y4eNick
    Код (Text):
    1. WriteConsole(
    2.   GetStdHandle(STD_OUTPUT_HANDLE),
    3.   (const VOID*)buff,
    4.   (DWORD)lstrlen((LPCTSTR)buff),
    5.   (LPDWORD)&cbWritten,
    6.   NULL
    7.   );
     
  3. n0name

    n0name New Member

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

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    y4eNick
    численные типы неявно преобразуются, указатели на них - нет
    размер int не определен и плавает от платформы к платформе, да и long, насколько я понимаю, не обязан быть равен именно 4
     
  5. clone

    clone New Member

    Публикаций:
    0
    Регистрация:
    4 июл 2006
    Сообщения:
    84
    n0name
    Стандарт не накладывает такого ограничения. В стандарте для всех целочисленных типов указан минимальный размер:

    sizeof(char) >= 8 bit
    sizeof(short) >= 16 bit
    sizeof(int) >= 16 bit
    sizeof(long) >= 32 bit

    Т.о. int, в зависимости от платформы, может совпадать как с short, так и с long и даже (гипотетически) с обоими одновременно.
     
  6. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    int может преобразовываться к unsigned long, но int* не может преобразовывается к unsigned long*. ISO/IEC 14882-98 см. 4.5 и 4.10. Стандарт, однако :)
     
  7. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Для любителей писать всякие хаки ;) (пускай крис стырит в Х :)))):
    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int main(int argc, char ** argv) {
    4.  const int c = 0;
    5.  int * p = (int*)&c;
    6.  
    7.  printf("%d\n", c);
    8.  (*p)++;
    9.  printf("%d %d\n", c, ++(*p));
    10. }
    11.  
    12. /* [EOF] */
    Задача: не пользуясь компилятором сказать, что будет выведено на экран, в случае компиляции как С так и С++ компилятором? (ключ /TC, /TP соответственно для cl, -x c/-x c++ для g++). Объяснить почему будет так, а не иначе.
     
  8. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    censored
    Имхо,

    0
    2 2

    потому что аргументы запихиваются справа налево... сначала второй инкремент до двойки, потом оба раза двойка запихивается.
     
  9. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Great
    для ++ будут другие цифры
     
  10. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    censored
    догадываюсь, раз ты спросил для разных... ща попробую собрать и посмотреть :)
     
  11. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    в cpp скорее всего 0 2
    в c.. а какая разница?
    *тоже пошел смотреть*
     
  12. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    да, так и есть. проверил
     
  13. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    гм.. а в c не так
    и че сие значит?
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    угу, насчет си я был прав - 2 2.
    хз) особенности преобразования указателя на const int =)
     
  15. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    по-моему, просто особенности компиляторов..
    или это как-то отражено в стандарте?
     
  16. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    :)
     
  17. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    если бы все компиляторы еще им следовали.... эх
     
  18. Nouzui

    Nouzui New Member

    Публикаций:
    0
    Регистрация:
    17 ноя 2006
    Сообщения:
    856
    не, ну что вместо переменной типа const пихается ее начальное значение, я был в курсе, но вот что это только в cpp..
     
  19. Ustus

    Ustus New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2005
    Сообщения:
    834
    Адрес:
    Харьков
    Nouzui
    а как же :)
    5.2.11
    т.е. делайте, что хотите, но за последствия мы не отвечаем. :)

    а в стандартном Си вообще раньше "const" не было. Его заимствовали из плюс-плюса...
     
  20. y4eNick

    y4eNick New Member

    Публикаций:
    0
    Регистрация:
    17 фев 2007
    Сообщения:
    37
    Хм. Не лазить же каждый раз в MSDN проверять тип параметра. Если тип неизвестен (скажем, всётаки лень смотреть
    MSDN или ещё какие обстаятельства) как быть тогда?

    censored писал:
    Это и есть решение?