Page 3 of 4
Re: Open Watcom
Posted: Fri Feb 01, 2008 1:37 pm
by andrew_programmer
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?
Функция
LoadSpectr(file,info) загружает из файла спектр. Если расскомментировать проверочный код:
Code: Select all
//f=fopen("spectra.txt","wb");
//for(i=0;i<1000;i++) {fprintf(f,"\n\r%d = |%6.1f|",i,info->spectr[i]);}
который выводит в файл значения загруженного спектра, то видно, что спектр загружается правильно.
Функция
GetParametersLoadedSpectr(info); получает из загруженного спектра параметры, необходимые для построения спектра и расчёта параметров спектра(заносит их в структуру info). Эта функция тоже работает правильно. Потом происходит заполнение структуры plot, на основе занесённых в структуру info данных. И как показывает проверочный вывод данных из этой структуры - структура plot заполняется правильно. А если эти же структуры прочитать сразу же после выхода из функции, то данные оказываются неверными.
если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.
Проверял. Значения указателей структур lorents(она же info в функции LoadSpectra) и plot до и после вызова - сохраняются. Тоесть указатели не разрушаются. Похоже неправильно работает адресация полей структуры после вызова.
Re: Open Watcom
Posted: Fri Feb 01, 2008 3:37 pm
by andrew_programmer
Я проверил адреса полей структур. Я реализовал вывод адресов полей структуры внутри функции LoadSpectra()
и после вызова функции. Почему-то после вызова функции адреса полей структуры info смещаются на 4 байта,
а структуры plot на 7 байт. Из-за этого читаются неправильные данные. Только вот почему происходит смещение адресов - непонятно.
Re: Open Watcom
Posted: Fri Feb 01, 2008 7:02 pm
by Serge
andrew_programmer
Почему-то после вызова функции адреса полей структуры info смещаются на 4 байта,а структуры plot на 7 байт
А до вызова ? Скорее всего это разные опции выравнивания при компиляции. Выравнивание по умолчанию 8 байт. После int смещение будет 4 после char 7 байт. Это легко проверить если посмотреть дизассемблированный листинг. В Ide открываешь на файле контекстное меню правой кнопкой мыши Disassemble -> Edit disassemble.
Если скинешь мне все исходники я смогу проверить другие варианты.
Re: Open Watcom
Posted: Fri Feb 01, 2008 11:17 pm
by andrew_programmer
Вывод адресов структуры показал, что до вызова функции и после вызова адреса полей совпадают. А вот в самой функции адреса смещаются. В IDE я выбрал опцию
1 byte aligment вместо
Default byte aligment и проблема с адресами структур исчезла. Потом я упаковал все структуры через
#pragma pack(1) и вернул
Default byte aligment. Теперь проблемы со смещением нет. Но появилась другая проблема
После создания интерфейса вызывается функция Plot() , которая строит спектры(экспериментальные, теоретические и т.д.). Экспериментальный спектр строится нормально, а потом где-то в функции Plot() из-за чего-то происходит вылет. Понятия не имею - где и почему.
Если скинешь мне все исходники я смогу проверить другие варианты.
Исходники конечно могу скинуть. Главное знать куда скидывать - электронного ящика в профиле нет.
P.S
Мда... Сам язык программирования C платформенно независим, а вот программа, написанная на нём и разработанная определённым компилятором, зависит от этого компилятора. Получается, что, то что компилируется и работает с одним компилятором, может не работать с другим
Вот такие "пироги" ....
Re: Open Watcom
Posted: Sat Feb 02, 2008 9:20 pm
by andrew_programmer
Я выяснил, почему происходит вылет программы в функции Plot().
В файле kolibrisys.h реализованы несколько макросов: va_list,va_start,va_end.
OpenWatcom не ругается на эти макросы - он просто генерирует неправильный код.
В результате функции vsnprintf() передаётся неправильный лист параметров и происходит
вылет программы. Хотя эти же самые макросы компилируются GCC и работают правильно.
Я закомментировал эти макросы и использовал макросы из stdarg.h(поставляется
вместе с Watcom-ом).Функция Plot() вылетать перестала. Сейчас продолжаю разбираться
с другими приколами компилятора OpenWatcom.
Re: Open Watcom
Posted: Sun Feb 03, 2008 12:03 am
by Serge
andrew_programmer
Это потому что Ватком передаёт часть параметров в регистрах. Вообще если пользуешься стандартными макросами и заголовочными файлами надо всегда брать родные.
Мой ящик ion2<собака>mail.ru
Re: Open Watcom
Posted: Sun Feb 03, 2008 2:39 pm
by andrew_programmer
Serge
Отправил.
Re: Open Watcom
Posted: Mon Feb 04, 2008 12:41 am
by Serge
andrew_programmer
У меня нет kolibrisys.lib
Re: Open Watcom
Posted: Mon Feb 04, 2008 1:45 am
by andrew_programmer
Я как раз об этом толькочто вспомнил.
Когда собирал архив, старался ничего не забыть. И как на зло забыл положить библиотеку kolibrisystem.lib
Отправил.
Re: Open Watcom
Posted: Mon Feb 04, 2008 1:55 pm
by Serge
andrew_programmer
Code: Select all
//find simbol '/'
i=1023;
while(filename[i]!='/')
{i--;}
//copy name
for(j=0;j<=i;j++)
{
outfilename[j]=filename[j];
}
for(j=0;j<14;j++)
{
outfilename[i+j+1]=name[j];
}
Этот код не работает. Длина командной строки 256 байт вместе с завершающим нулём Я заменил эту часть на
Code: Select all
char *p;
int pathsize;
//check for file colibrovka.txt
outfilename=malloc(256);
p = strrchr(filename,'/');
if(p != 0)
{
pathsize = p-filename+1;
memcpy(outfilename, filename, pathsize);
memcpy(outfilename+pathsize, name, 15);
}
else
memcpy(outfilename, name, 15);
С этими исправлениями программа загружается.
Во-вторых SendMessage просто убийца для программ на С. Не сохраняет ни одного регистра, меняет esi и edi.
Re: Open Watcom
Posted: Mon Feb 04, 2008 4:29 pm
by andrew_programmer
Serge
Большое спасибо!
Наконец-то программа заработала.
Этот код не работает. Длина командной строки 256 байт вместе с завершающим нулём
Мне почему-то казалось, что 1024. Видно GCC как-то перестраховывался от этой ошибки. Я подправил код и в других местах - теперь всё работает.
Во-вторых SendMessage просто убийца для программ на С. Не сохраняет ни одного регистра, меняет esi и edi.
Я недавно добавлял в libGUI сохранение регистров после входа в функции. Во все функции добавил, а про SendMessage() забыл.
Добавлю.
Ещё раз большое спасибо.
Re: Open Watcom
Posted: Tue Feb 05, 2008 11:47 pm
by andrew_programmer
Обнаружилась ещё одна проблема, которая, как мне кажется, связана с libC.
Если в любой части функции LoadSpectr() вставить код открытия и закрытия какого-либо файла, то с указателями происходит что-то непонятное. После заполнения структур для libGUI данные в них оказываются какие-то другие. Хотя если код открытия и закрытия какого-либо файла убрать, то структуры заполняются правильно.
Вот я в код добавляю открытие закрытие файла:
Code: Select all
//load spectr from file to memory
buffer=malloc(60*1024);
f=fopen(filename,"rb");
if (f!=NULL)
{
i=0;
while((j=fgetc(f))!=EOF)
{
buffer[i]=j;
i++;
}
fclose(f);
}
else
{
free(buffer);
return(-1);
}
buf_size=i-1;
/*
f=fopen("autorun.dat","rb");
fclose(f);
*/
Если код раскомментировать, то программа работать небудет, а если оставить закомментированным, то программа работает.
Re: Open Watcom
Posted: Thu Feb 07, 2008 2:18 pm
by andrew_programmer
Serge
Проводил эксперименты с кодом и обнаружил странные вещи.
Я менял положение финкции LoadSpectra() в коде программы. С точки зрения логики работы программы это не имеет никакого значения. А вот с точки зрения генерации кода, свободного от ошибок, как оказалось, имеет.
Вот часть кода :
Code: Select all
int main(int argc, char **argv)
{
char exit_status;
struct WINDOW *win;
struct SCREEN *scr;
struct PLOTINFO *plot;
struct lorents_information *lorents;
struct X *x_c;
struct HEADER *Parend;
struct MESSAGE *Message;
struct process_table_entry *ProcessInformation;
struct ControlBookmark2 *Bookmark2;
struct ControlProgressbar *CalculationProgress;
dword *controls;
dword x,y,mouse_buttons;
int i;
int key;
int count_iteration;
float step_iteration;
unsigned char sound_end_calculation[]={150,64,0,0,0};
char *pathspectr;
char *ptr;
char c;
FILE* f;
pathspectr=argv[1];
win=malloc(sizeof(struct WINDOW));
lorents=malloc(sizeof(struct lorents_information));
x_c=malloc(sizeof(struct X));
scr=malloc(sizeof(struct SCREEN));
plot=malloc(sizeof(struct PLOTINFO));
// variant 1
// LoadSpectra(pathspectr,lorents,plot,scr);
_ksys_set_wanted_events(0x67);
count_iteration=0;
Init_libGUI();
win->posx=WINDOW_POSX;
win->posy=WINDOW_POSY;
win->sizex=WINDOW_SIZEX;
win->sizey=WINDOW_SIZEY;
draw_window(win);
// variant 2
// LoadSpectra(pathspectr,lorents,plot,scr);
controls=malloc(TOTAL_NUMBERS_OF_CONTROLS*100);
Parend=(struct HEADER *)malloc(sizeof(struct HEADER));
Message=(struct MESSAGE *)malloc(sizeof(struct MESSAGE));
ProcessInformation=malloc(sizeof(struct process_table_entry));
// variant 3 (work variant)
LoadSpectra(pathspectr,lorents,plot,scr);
CraeteInterface(controls,Parend,win,scr,plot);
DisplayInformation(controls,lorents);
Message->type=MESSAGE_FULL_REDRAW_ALL;
Message->arg1=0;
Message->arg2=0;
Message->arg3=0;
SendMessage(Parend,Message);
Если раскомментировать первый вариант, то программа вылетает из-за неправильного содержимого структур для libGUI(почему-то меняется содержимое заполняемых структур).
Если раскоментировать второй вариант,то структуры для libGUI заполняются правильно, если в директории,где находится программа, нет файла colibrovka.txt (тоесть, если не загружается этот файл).
В случае третьего варианта расположения функции, программа работает так, как ей и положено работать согласно коду программы.
Почему происходят такие странные вещи - я покачто не выяснил.
Re: Open Watcom
Posted: Thu Feb 07, 2008 8:01 pm
by andrew_programmer
В новой версии libC для OpenWatcom-а, что на нашем SVN, в проекте установлена модель памяти small. А чем она отличается от flat ? Её можно применять для выделения больших объёмов памяти в сотни мегабайт ?
Я просматривал дизассемблированный листинг кода, сгенерированного watcom-ом, там в вычислениях с плавающей запятой часто встречается строка call __CHP . Что это такое ?
Re: Open Watcom
Posted: Thu Feb 07, 2008 10:26 pm
by Serge
andrew_programmer
Для NT small=flat. Означает отсутствие дальних указателей sel:offset. __CHP оболочка для frndint.
Я думаю что твой разрушает кучу malloс. Одиночные структуры лучше располагать в стеке.