C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Преобразование типов
** Artur
Отправлено: 08.09.2005, 15:15


Не зарегистрирован







unsigned char ch[10];
*(unsigned long*) (&ch[1]) = 0xAD;

что это может значить??? и почему написали так???
Идеи и предложения есть???
Guest
Отправлено: 08.09.2005, 15:50


Не зарегистрирован







Запись 8-ми байтов по адресу ch+1
Навороты служат для правильного преобразования типов.
Guest
Отправлено: 08.09.2005, 15:53


Не зарегистрирован







Более того 0D 0A (так будет в памяти) возможно означает конец строки.
vvoid
Отправлено: 08.09.2005, 18:16


Машинист паровоза

Группа: Участник
Сообщений: 171



QUOTE
Более того 0D 0A (так будет в памяти) возможно означает конец строки.

Какое 0D0A? Нифига подобного 0D0A — это два байта, а 0xAD — один.
Если предположить, что сначала
ch = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00},
то после выполнения этой операции будет так:
ch = {0x00,0xAD,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}

PS* Не проверял, но 99% даю. smile.gif

Отредактировано vvoid — 08/09/2005, 18:16
AVC
Отправлено: 09.09.2005, 08:47


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE
Какое 0D0A? Нифига подобного 0D0A — это два байта, а 0xAD — один.

Ага. Я стормозил. (Крутит пальцем в ладошке)

Отредактировано AVC — 09/09/2005, 07:48
** Admin
Отправлено: 09.09.2005, 20:45


Не зарегистрирован







Подобным образом приходилось работать с приборами.
У них в памяти помещались и программа и данные,
все это дело читалось/писалось/обрабатывалось.

Поэтому часто приходилось прибегать или к конструкциям типа

CODE

const unsigned int NameZoneRazm = 65536;

union NameZone{    // Зона имен (каталог) 1024 * 64
byte bf[NameZoneRazm];
struct{
   int isRec;                          // признак наличия
   char Name[32];               // имя
   char WDate[10];             // дата
   short firstRec;                 // номер первой дочерней записи
   short countRec;              // кол-во дочерних записей
   short tipRec;                   // тип записи (fffe — дата, fff8 — dir)
   short NumNextRec;         // номер след.объекта (ffff — послед.объект в группе)
   short ParentNum;           // номер родителя (ffff — Root)
   byte Pusto[8];                // -- запас пока пусто ---
      }ud[1024];
}nz;


и работать с этой памятью то как с массивом байт
CODE
byte bf[]
,
то как с конкретными данными типа nz.ud[25].Name
и приводить типы как в указанной вами конструкции -
работать с байтами

CODE

unsigned int CountByte = endFat — bf + 1;   // определяем кол-во байт
if(CountByte%16) CountByte = (CountByte/16)*16 + 16;  // выравниваем по 16 байтам в плюс


или

CODE

buf++;  
buf = (char*)((((int)buf) + 1)& 0xFFFFFFFE); // реальная конструкция из программы
//или
buf++;  buf = (char*)((((int)buf) + 3)& 0xFFFFFFFC);



Вернуться в Вопросы программирования в C++Builder