Решено: Borland C vs GCC проблема

Модератор: Модераторы разделов

Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Решено: Borland C vs GCC проблема

Сообщение Supervisor »

есть код

Код: Выделить всё

typedef struct TypeBuf
{
  unsigned char Private[4];
  unsigned char TypeCall[4];
  unsigned char NumberA[20];
  unsigned char NumberB[20];
  unsigned char Reserved1[4];
  unsigned char DateTime[8];
  unsigned char Dlit[4];
  unsigned char AdditionaInfo[32];
  unsigned char Reserved2[4];
}

....... skipped .......

Var1 = (struct TypeBuf *) buf;

....... skipped .......

double *DateTime;
DateTime = (double *)Var1->DateTime;
fprintf(output, "%f", *DateTime);


Структура заполняется из файла, проблема в следующем на Борладн С все работает замечательно и число типа double выводжится корректно (Борладн С под ДОС), при компимяции этого же кода GCC под Sun Solaris выводится вместо числа типа double белиберда.....


а теперь внимание вопрос: чде чего надо поковырять, или как изменить код чтобы это работало под Sun Solaris?
Спасибо сказали:
d_n_k
Сообщения: 636
ОС: Gentoo GNU/Linux

Re: Решено: Borland C vs GCC проблема

Сообщение d_n_k »

посмотреть на порядок байт
посмотреть на выравнивание структуры

выкинуть поле unsigned char DateTime[8]; и поставить номальное double DateTime

если очень сильно надо char[], то натяни union приэтом учитываю порядок следования байт
все сказанное есть имхо...
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Решено: Borland C vs GCC проблема

Сообщение Supervisor »

d_n_k писал(а):
12.10.2007 11:14
если очень сильно надо char[], то натяни union приэтом учитываю порядок следования байт


А вот про это если моно поподробнее....
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Borland C vs GCC проблема

Сообщение drBatty »

Supervisor писал(а):
12.10.2007 10:49
есть код

DateTime = (double *)Var1->DateTime;
Структура заполняется из файла,
а теперь внимание вопрос: чде чего надо поковырять, или как изменить код чтобы это работало под Sun Solaris?
проблема в том, что формат double не везде одинаковый, и даже его размер может быть не 8, а 6 или 10. Я бы перевёл число в текстовый формат(fprintf(out_file, "%g", Var)), а потом считал это число из файла. Текстовый формат везде одинаковый.
ЗЫЖ точно не помню, как задаются числа double в printf, посмотри документацию к своему компилятору, может не %g, а %f будет лучше.
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Решено: Borland C vs GCC проблема

Сообщение Supervisor »

drBatty писал(а):
12.10.2007 11:25
Supervisor писал(а):
12.10.2007 10:49
есть код

DateTime = (double *)Var1->DateTime;
Структура заполняется из файла,
а теперь внимание вопрос: чде чего надо поковырять, или как изменить код чтобы это работало под Sun Solaris?
проблема в том, что формат double не везде одинаковый, и даже его размер может быть не 8, а 6 или 10. Я бы перевёл число в текстовый формат(fprintf(out_file, "%g", Var)), а потом считал это число из файла. Текстовый формат везде одинаковый.
ЗЫЖ точно не помню, как задаются числа double в printf, посмотри документацию к своему компилятору, может не %g, а %f будет лучше.



Проблема в том что этот double (Дата и время в формате TDateTime Delphi) читается из бинарного файла (формат которого изменить низя :cray: ) 8 байт, а затем мне нужно его вывести в текстовый файл но уже в нормальном строковом виде.....
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Решено: Borland C vs GCC проблема

Сообщение sergio »

Supervisor писал(а):
12.10.2007 11:34
Проблема в том что этот double (Дата и время в формате TDateTime Delphi) читается из бинарного файла (формат которого изменить низя :cray: ) 8 байт, а затем мне нужно его вывести в текстовый файл но уже в нормальном строковом виде.....

Солярис-т о на чем стоит, е-мое? На спарке? Если да - на них BE порядок байт вроде был... А как там представлены FP числа надо доки бы поглядеть, но допустим также. (Но я бы на это не рассчитывал...) Тогда надо эти восемь байт пересвопить в обратном порядке, и уже их прочитать как дабл.

Если Солярис на x86 стоит - то не понял, откуда проблема.
А то можно записать в пустой файл дабл на одной платформе и на другой, и вывести почарово значения и сравнить. Это если доки читать лень. :)
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Borland C vs GCC проблема

Сообщение drBatty »

Supervisor писал(а):
12.10.2007 11:34
Проблема в том что этот double (Дата и время в формате TDateTime Delphi) читается из бинарного файла (формат которого изменить низя :cray: )

Тогда тебе придётся самому разобраться в формате TDateTime Delphi и написать конвертор этого формата. Я думаю, что формат там обычный: число секунд от 01.01.1970 в том виде, как его понимает сопроцессор 8087, вобщем-то там ничего сложного и выходящего за пределы школьной программы нет, вроде шесть байтов мантиссы и пару байт порядка(m*2^p). Можно сделать конвертор на том-же TurboC(или даже на gcc под x86) и преобразовать эту дату в формат 64х битового целого без знака. Зато в следующий раз не будешь сувать в файл числа в таких форматах :)
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Решено: Borland C vs GCC проблема

Сообщение Supervisor »

sergio писал(а):
12.10.2007 12:02
Солярис-т о на чем стоит, е-мое? На спарке? Если да - на них BE порядок байт вроде был... А как там представлены FP числа надо доки бы поглядеть, но допустим также. (Но я бы на это не рассчитывал...) Тогда надо эти восемь байт пересвопить в обратном порядке, и уже их прочитать как дабл.



Ага на спарке....

такс... пересвопить это т.е. 1 байт станет 8-м, 2-ой станет 7-м и т.д. правильно я понял?

Ура!!!!!!!! заработало! Спасибо за совет про пересвопливание :drinks:

Зато в следующий раз не будешь сувать в файл числа в таких форматах


Эхххх.... ято не я в этот файл сую числа в таких форматах...
Спасибо сказали:
Аватара пользователя
drBatty
Сообщения: 8735
Статус: GPG ID: 4DFBD1D6 дом горит, козёл не видит...
ОС: Slackware-current

Re: Решено: Borland C vs GCC проблема

Сообщение drBatty »

sergio писал(а):
12.10.2007 12:02
А то можно записать в пустой файл дабл на одной платформе и на другой, и вывести почарово значения и сравнить. Это если доки читать лень. :)

Угу, я выводил на stdout:

Код: Выделить всё

int main(int argc, char *argv[])
{
      double x = 1234567890.0;
    union
    {
        double db;
        unsigned char b[sizeof(double)];
    }u;
    u.db = x;
    for(int j = 0; j < sizeof(double); j++)
        printf("%d,", u.b[j]);
    printf("\n---------------------\n");
    printf("%d\n%f\n", sizeof(double), u.db);

  return EXIT_SUCCESS;
}
0,0,128,180,128,101,210,65,
---------------------
8
1234567890.000000
Насколько я помню, для быстрого перевода не очень большого целого числа существует грязный хак: надо умножить это число на какое-то MAGIC_CONST(ессно непомню какое) и взять часть байтов. Курить доки к "программированию сопроцессора i8087 на ассемблере".
http://emulek.blogspot.ru/ Windows Must Die
Учебник по sed зеркало в github

Скоро придёт
Осень
Спасибо сказали:
sergio
Сообщения: 436
Статус: Интересующийся новичок
ОС: Debian GNU/Linux 4 & 5

Re: Решено: Borland C vs GCC проблема

Сообщение sergio »

Supervisor писал(а):
12.10.2007 12:19
Ура!!!!!!!! заработало! Спасибо за совет про пересвопливание :drinks:
Эхххх.... ято не я в этот файл сую числа в таких форматах...

Бойтесь, чтоб там каких-нибудь тонких различий в представлении даблов на двух платформах не оказалось... а то сотворите еще одну проблему Y2K. :crazy:
Но ваще конешно хороший вопрос, кто ж это догадался хранить датувремя в виде даблов... :happy:
Debian GNU/Linux 4 -- AMD Athlon64 3000+ / Asus 7600GS -- Gnome
Debian GNU/Linux 5 -- Dell (Vostro) 500 (Celeron M560 / iGM965) -- Gnome
Спасибо сказали:
Supervisor
Сообщения: 147
ОС: Sabayon ~x86

Re: Решено: Borland C vs GCC проблема

Сообщение Supervisor »

sergio писал(а):
12.10.2007 13:59
Но ваще конешно хороший вопрос, кто ж это догадался хранить датувремя в виде даблов... :happy:


Эээээээээ...... есть одна контора чье оборудование у нас стоит :crazy:
Спасибо сказали:
v04bvs
Сообщения: 636
ОС: Debian GNU/Linux

Re: Решено: Borland C vs GCC проблема

Сообщение v04bvs »

sergio писал(а):
12.10.2007 13:59
Но ваще конешно хороший вопрос, кто ж это догадался хранить датувремя в виде даблов... :happy:

http://www.delphibasics.co.uk/RTL.asp?Name=TDateTime

Идиотский формат. А тех, кто додумался его в бинарном виде дампить - выгнать за профнепригодность.
Спасибо сказали: