Преобразование типов
У меня есть типизированный файл, залитый сишной программой. У меня есть только структура. И там данные, которые по определению должны быть числовыми (ну например, число, или номер месяца), хранятся как char, или там unsigned char. Ну, я типы данных на дельфевые поменял - по размеру все сходится, строковые данные достаются - а вот что с этими числами делать - не ясно. Че только уже не пробовал - все муть какая-то!
Хелп, люди!
У меня есть типизированный файл, залитый сишной программой. У меня есть только структура. И там данные, которые по определению должны быть числовыми (ну например, число, или номер месяца), хранятся как char, или там unsigned char. Ну, я типы данных на дельфевые поменял - по размеру все сходится, строковые данные достаются - а вот что с этими числами делать - не ясно. Че только уже не пробовал - все муть какая-то!
Кинь изначальную структуру на Си и свою структуру на Делфи. Может где типы неправильные поставил.
Кинь изначальную структуру на Си и свою структуру на Делфи. Может где типы неправильные поставил.
Сейчас пишу из другого места, так что точно кинуть не могу, но я все проверил раз десять.
Та прога была 16-ти битная
Короче типы я сопоставил так:
long - longint
char[10] - array [1..10] of char
unsigned int - word
int - smallint
char - shortint
Ну не в этом дело. Вот char - нормально достается. А вот что делать со всеми этими int'ами - че то не пойму - он такое достает, что мама не горюй!
Кинь изначальную структуру на Си и свою структуру на Делфи. Может где типы неправильные поставил.
Да! Забыл сказать - я уже все типы данных, которые по размеру подходят, перепробовал. Вместо shortint можно и char ставить, и byte, да все что угодно. Ну и с остальными то же.
Тут дело не в этом... А вот в чем?
Да! Забыл сказать - я уже все типы данных, которые по размеру подходят, перепробовал. Вместо shortint можно и char ставить, и byte, да все что угодно. Ну и с остальными то же.
Тут дело не в этом... А вот в чем?
Может дело в коде, который читает данные?
Может дело в коде, который читает данные?
Ну, может быть. Хотя тут вроде все просто:
Есть структура, в которую я читаю:
type
TImpData = record
id:LongInt;
FIO:array [1..46] of char;
Year:Word;
Month:ShortInt;
Day:ShortInt;
;
Потом создаю переменные:
F: File of TImpData;
FS: TImpData;
Ну а потом читаю:
AssignFile(F, OpenFileDlg.FileName);
Reset(F);
Seek(F, Form1.scrlFileScrollBar.Position-1);
//Ну это он номер из скроллбара берет. Но
//если не менять - то 1
Read(F, FS);
//Ну и например
edtMonth.Text:= inttostr(fs.Month);
Вот с этими Word и ShortInt - ничего не получается :(
end;
Вот с этими Word и ShortInt - ничего не получается
Хм... На мой взгляд, тоже все нормально.
Может я чего не досмотрел?
Если твои данные не секретные, кинь мне файл и описание структуры на Си на мыло. sagittarius_masu (че та там) hotbox (здесь точка) ru
Хм... На мой взгляд, тоже все нормально.
Может я чего не досмотрел?
Если твои данные не секретные, кинь мне файл и описание структуры на Си на мыло. sagittarius_masu (че та там) hotbox (здесь точка) ru
Спасибо за предложение! Однако вариант этот оставим на крайний случай - хочется пока самому разобраться! :)
Вот, я вроде нашел проблему: эта зараза что-то странное делает со структурой.
Короче, происходит следующее:
Если написано, например:
type
FIO:array [1..47] of char;
end;
То sizeof даст 47 - это вполне логично
При
type
FIO:array [1..47] of char;
Year:shortint;
end;
sizeof даст 48 - это тоже логично
Но вот при
type
FIO:array [1..48] of char;
Year:Smallint;
end;
размер становится уже 50.
При этом получается, как бы, что расползается предыдущая переменная - я проверял это по тому как он читает байты, сверяясь с шестнадцатиричным редактором.
Что ж это он творит то????
Оказалось, что чтобы он такой хренью не занимался, нужно ему доказать, что память нужно экономить с помощью слова packed.
Все стало на свои места!
Огромное спасибо за помощь!!!