приведения типов

Тема в разделе "LANGS.C", создана пользователем ptl, 8 мар 2010.

  1. ptl

    ptl New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    7
    доброе время суток,
    почему первое склеивает строки, а второе нет?
    Код (Text):
    1. char buf[16];
    2. char *p=buf;
    3. *p = 'a';
    4. p++;
    5. *p = 'b';
    6. p=buf;
    7. printf(  "'%s' \n",buf);
    Код (Text):
    1. char buf[16];
    2. char buf2[10];
    3. char *p=buf;
    4. *p = buf2[3];
    5. p++;
    6. *p = buf2[6];
    7. p=buf;
    8. printf(  "'%s' \n",buf);
    9. printf(  "'%d' \n",buf);
    собственно нужно из файлика данные в хексе считать в 1 троку 2 байта, т.е. склеить 0x20 0xA8 в одно значение, а потом перевести в DEC.
     
  2. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    нужно сделать что-то типа такого
    WORD temp = *(WORD*)buf;
    printf( "'%d' \n",temp);
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ptl
    а 0 в конце строки кто ставить будет?
    > printf( "'%d' \n",buf);
    вам покажет адрес этого самого buf в десятичном знаковом виде.
    чтобы сделать
    > т.е. склеить 0x20 0xA8 в одно значение, а потом перевести в DEC
    надо
    WORD temp = *(WORD*)buf; // (c) Asterix
    но лучше
    DWORD temp = 0xffff & *(DWORD*)buf; // поскольку printf в стек забрасывает дворды
     
  4. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    qqwe
    компилятор сам разрулит, так что ставим
    printf( "'%d' \n",*(WORD*)buf);
    и все =)
     
  5. osox

    osox New Member

    Публикаций:
    0
    Регистрация:
    13 ноя 2009
    Сообщения:
    280
    ptl

    WORD buff;
    fread(&buff, sizeof(buff), 1, fin);

    зачем читать как текст а потом кастить в другой тип ?
     
  6. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    osox
    локальные переменные не обнуляются при выделении. и когда пушаются - верхнее слово не обнуляется тоже, вроде.
     
  7. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    qqwe
    обнуляется ;)
     
  8. Asterix

    Asterix New Member

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

    Код (Text):
    1. .text:004010B8                 xor     eax, eax
    2. .text:004010BA                 lea     ecx, [esp+4Ch+var_3C]
    3. .text:004010BE                 mov     ax, [ebp+0]
    4. .text:004010C2                 mov     [esp+4Ch+var_3C], 0
    5. .text:004010C7                 push    eax
    6. .text:004010C8                 push    offset aU       ; "%u"
    7. .text:004010CD                 push    offset aS04x    ; "%s%04x"
    8. .text:004010D2                 push    ecx             ; LPSTR
    9. .text:004010D3                 call    ebx ; wsprintfA
     
  9. ptl

    ptl New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    7
    странно, но если я делаю вот так, то в итоге вижу только то что было в buf2[3], после сдвига на байт ничего невидно.
    Код (Text):
    1. char buf[16];
    2. char buf2[10];
    3. fread(buf2,sizeof(char),10,File);
    4. char *p=buf;
    5. *p = buf2[3];
    6. p++;
    7. *p = buf2[6];
    8. p=buf;
    9. printf(  "'%x' \n",*(char*)buf);
     
  10. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    Asterix
    гм, проверил и по вашему варианту и по варианту osox, действительно все обнуляется нормально.. к чему бы это?
    (или это уже паранойя пошла видеть возможность ошибки кругом? закончу это - возьму перекур на недельку, посмотрю есть ли вокруг люди или уже одни марсиане)
     
  11. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    ptl
    странно, что вам странно. вы выводите что?
    первый (0вой) байт вашего буфа. а равен он чему?
    и чего вы хотите? все работает как вы написали, хотя
    не лучшее решение
     
  12. ptl

    ptl New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    7
    с первым прблемы нет, я не вижу второй, который я положил туда с buf2[6];
     
  13. ptl

    ptl New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    7
    но в отдельности из buf2[3] и buf2[6] я вижу правильные данные т.е. пр printf("%x%x\n",buf2[3],buf2[6]);
     
  14. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ptl
    как вы его увидите если выводите 1 байт(printf( "'%x' \n",*(char*)buf);) ?
     
  15. ptl

    ptl New Member

    Публикаций:
    0
    Регистрация:
    1 фев 2010
    Сообщения:
    7
    хм, тогда как объединить 2 значения в хекс в одно? что-бы можно было юзать это как одно число?
    buf2[3] тут 0х05
    buf2[6] а тут 0хА6
    объединить в 0х5А6
     
  16. Asterix

    Asterix New Member

    Публикаций:
    0
    Регистрация:
    25 фев 2003
    Сообщения:
    3.576
    ptl
    у вас в буфере уже лежат два байта, очевидно что осталось вывести их на экран
    printf( "%04x\n",*(unsigned short*)buf);