Page 2 of 4

Re: Open Watcom

Posted: Sat Jan 26, 2008 8:28 pm
by Serge
andrew_programmer

У тебя ошибка в коде. Правильно fputc('a',f);

Re: Open Watcom

Posted: Sat Jan 26, 2008 9:48 pm
by andrew_programmer
У тебя ошибка в коде. Правильно fputc('a',f);
Точно. Я перепутал с функцией fprintf() :)
OPTION OFFSET=0
А где в IDE такая опция? Я что-то не нашёл.
pe2kos <file.exe> file
Нужно использовать pe2kos_path.exe или pe2kos_nopath.exe ?

Re: Open Watcom

Posted: Sat Jan 26, 2008 9:56 pm
by Gluk
а ты попробуй оба, на двух копиях файла..

Re: Open Watcom

Posted: Sun Jan 27, 2008 12:59 am
by Serge
andrew_programmer

Открываешь меню Options->Windows Linking Switches. Первая вкладка "Basic switches" в поле "Other options" пишешь OPTION OFFSET=0
В опциях компиляции выбираешь Register based calling.

Я сделал обработку математических исключений. Теперь в С можно устанавливать обработчик SIGFPE.
Добавил в библиотеку ваткомовский тест. В Win и Колибри результаты одинаковые. В Боше неправильно считается atan, в Qemu нет математических исключений. ftp://kolibrios.org/upload/clibr_02.7z

Re: Open Watcom

Posted: Sun Jan 27, 2008 1:32 pm
by andrew_programmer
Ура! Заработало!

Serge, большое спасибо за помощ.
Любопытствующий вопрос. Какие функции содержатся в kolibc.lib ?

Поэкспериментирую с оптимизациями в OpenWatcom.
P.S.
Рабочим оказался вариант с pe2kos_path.exe , а вариант с pe2kos_nopath.exe неработает.

Re: Open Watcom

Posted: Sun Jan 27, 2008 1:55 pm
by Serge
andrew_programmer
kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.

Re: Open Watcom

Posted: Sun Jan 27, 2008 5:14 pm
by andrew_programmer
Пытался скомпилировать при помощи OpenWatcom свою научную программу.
Естественно пришлось переделать компиляторо-зависимые вещи в программе.
Всё переделал.Компилирую. И тут возникает непредвиденная проблема.

В файле libGUI.h объявляются функции из libGUI. Например:

Code: Select all

void*  (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control);
Потом в libGUI.c эти функции линкуются. В программе вышеприведённая функция
вызывается так:

Code: Select all

CraeteBookmark( arguments )
Компиляция всех C файлов происходит нормально и создаются соответствующие obj
файлы. Но на этапе линковки возникает проблема. К именам функций из libGUI
добавляется символ "-". Поэтому линковщик пишет:

Code: Select all

Warning! W1027: file interface.obj(C:\kolibri\watcom\projects\CMspectra\interface.c): redefinition of _CraeteBookmark ignored

И так для всех функций libGUI, встречающихся в других obj файлах.
Ну и соответственно собрать эти obj файлы в exe файл он неможет.

Как решить проблему ?

Re: Open Watcom

Posted: Sun Jan 27, 2008 10:44 pm
by Serge
andrew_programmer

Ты объявил CraeteBookmark как указатель на функцию, то есть это переменная. При компиляции в каждом файле где есть строка #include "libgui.h" создаётся своя переменная а при линковке лишние игнорируются. Если CraeteBookmark действительно указатель объяви её extern void* (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control); Если функция написана на асме то должна сохранять значения ebx ecx edx esi edi ebp. Ватком очень на это расчитывает.

Re: Open Watcom

Posted: Sun Jan 27, 2008 11:59 pm
by Serge
Посмотрел документацию, ecx и edx сохранять не надо.

Re: Open Watcom

Posted: Mon Jan 28, 2008 7:29 pm
by Serge
pe2kos больше не нужен. Теперь можно линковать в программы в формате Колибри.

Это опции для линка: output raw op offset=0 op OBJALIGN=16 op STACK=4096 name имя_файла.exe

В меню Targets->Target options->Execute after добавить kpack.exe имя_файла.exe имя_файла

Размер стека можно устанавливать по необходимости, но меньше 4Кб не стоит. Проверку стека можно включить в опциях компиляции. Если не указать name имя_файла.exe то линковщик создаст файл с расширением .bin, а wmake сообщит что не удалось создать .exe

Я поправил заголовочные файлы, 1.7а теперь компилирует библиотеки

Re: Open Watcom

Posted: Tue Jan 29, 2008 2:37 am
by andrew_programmer
Я поправил заголовочные файлы, 1.7а теперь компилирует библиотеки
Действительно компилируются! Здорово!
pe2kos больше не нужен. Теперь можно линковать в программы в формате Колибри.

Это опции для линка: output raw op offset=0 op OBJALIGN=16 op STACK=4096 name имя_файла.exe

В меню Targets->Target options->Execute after добавить kpack.exe имя_файла.exe имя_файла

Размер стека можно устанавливать по необходимости, но меньше 4Кб не стоит. Проверку стека можно включить в опциях компиляции. Если не указать name имя_файла.exe то линковщик создаст файл с расширением .bin, а wmake сообщит что не удалось создать .exe
Опробовал. Работает!

P.S.
Разрабатывать при помощи Watcom-а стало также удобно, как и при помощи GCC. А если ещё учесть, что у Watcom-а libC более приличная, то его можно считать самым лучшим инструментом для разработки на C под KolibriOS.
Serge, желаю удачи.

Re: Open Watcom

Posted: Tue Jan 29, 2008 5:20 pm
by SHREDER
Такой вопрос, можно ли юзать STL в при компиляции с OpenWatcom. А конкретно меня интересует map.
В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.

Re: Open Watcom

Posted: Wed Jan 30, 2008 12:14 am
by Serge
SHREDER

Я не знаю. Для Колибри наверное потребуется портировать часть runtime-кода. Одной Clib скорее всего не хватит.

Re: Open Watcom

Posted: Fri Feb 01, 2008 3:46 am
by andrew_programmer
Уже несколько дней пытаюсь заставить работать скомпилированную OpenWatcom-ом мою
научную программу. Для работы программы используются функции из libC и минимум
прямых обращений к системным функциям(функции из файла kolibrisys.h)
Необходимые обёртки системных функций я переделал под OpenWatcom. Это объектные
файлы формата MS COFF.Регистры в ассемблерных функциях сохраняются в стеке, чтобы
не возникало конфликтов с кодом, генерируемым Watcom-ом.Структуры упакованы через
#pragma pack(1). Я компилировал Watcom-ом тестовую программу, использующую libGUI,
она работает.
В коде моей программы нет ничего специфичного для компилятора.C код программы
платформенно независим.
Сама программа компилируется.Я открываю ей файл со спектром и программа вылетает.
Я выискивал место вылета программы. И пришёл к выводу - дело не в моей программе,а
в компиляторе OpenWatcom или в libC...

Вот в чём дело.
Загрузка спектра и вычсисление начальных параметров из спектра происходит в функции
LoadSpectra. Если раскоментировать часть кода, выводящую проверочную информацию в
файл и скомпилировать, то проверочная информация показывает, что спектр загружается
правильно и начальные параметры из него опрееляются правильно. Вот код функции:

Code: Select all

void LoadSpectra(char *file,struct lorents_information *info,struct PLOTINFO *plot,struct SCREEN *scr)
{
       int    i;
       FILE* f;
       
        info->spectr=malloc(SPECTRA_BUFFER_SIZE);
        info->spectr_theoretical=malloc(SPECTRA_BUFFER_SIZE);
        info->spectr_restored=malloc(SPECTRA_BUFFER_SIZE);
        info->P_H=malloc(SPECTRA_BUFFER_SIZE);

        LoadSpectr(file,info);
        GetParametersLoadedSpectr(info);
        //f=fopen("spectra.txt","wb"); 
       //for(i=0;i<1000;i++) {fprintf(f,"\n\r%d = |%6.1f|",i,info->spectr[i]);}
       
        plot->type_plot=PLOT_SPECTRA_N_EXPERIMENTAL;
        plot->Nmin=info->Nmin;
        plot->Naverege=info->Nbusis;
        plot->Nmax=info->Nmax;
        plot->Nspectr=info->spectr;
        plot->Nspectr_theoretical=info->spectr_theoretical;
        plot->ChannelMax=info->length_spectr-1;
        plot->ChannelMin=0;
        plot->ChannelNull=info->ChannelNull;
        plot->VelosityMax=info->vmax;
        plot->VelosityMin=info->vmin;
        plot->Pmax=1.0;
        plot->Pmin=info->Nmin/info->Nmax;
        
        scr->PlotP_H=MODE_SHOW_SPECTR;
	/*
       fprintf(f,"\n info->Nmin=%6.6f",info->Nmin);
       fprintf(f,"\n info->Nbusis=%6.6f",info->Nbusis);
       fprintf(f,"\n info->Nmax=%6.6f",info->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",info->vmax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",info->vmin);

       fprintf(f,"\n plot->Nmin=%6.6f",plot->Nmin);
       fprintf(f,"\n plot->Naverege=%6.6f", plot->Naverege);
       fprintf(f,"\n plot->Nmax=%6.6f",plot->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",plot->VelosityMax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",plot->VelosityMin);
        
       fclose(f);
	*/
}
Но! Если сразу же после вызова функции LoadSpectra вывести этиже параметры(из тех же
структур) в другой файл, то они окажутся совершенно другими. Это значит, что чтение
данных происходит из другой области памяти. При компиляции GCC такой проблемы не
возникает. Как вы видели программа нормально работает.
Вот код, где происходит вызов функции 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;
  FILE*                                          f;

  pathspectr=argv[1];
  printf("\n\rpath=%s",pathspectr);
  _ksys_set_wanted_events(0x67);
  
  count_iteration=0;

  printf("\n\rbegin init libGUI");
  Init_libGUI();
  printf("\n\rlibGUI initialized succesfull.");
  
  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));

  win->posx=WINDOW_POSX;
  win->posy=WINDOW_POSY;
  win->sizex=WINDOW_SIZEX;
  win->sizey=WINDOW_SIZEY;

  printf("\n\rbegin load spectra");
  LoadSpectra(pathspectr,lorents,plot,scr); //------------------------------------------------

    f=fopen("info.txt","wb");
       fprintf(f,"\n info->Nmin=%6.6f",lorents->Nmin);
       fprintf(f,"\n info->Nbusis=%6.6f",lorents->Nbusis);
       fprintf(f,"\n info->Nmax=%6.6f",lorents->Nmax);
       fprintf(f,"\n plot->ChannelMax=%6.6f",plot->ChannelMax);
       fprintf(f,"\n plot->ChannelNull=%6.6f",plot->ChannelNull);
       fprintf(f,"\n plot->VelosityMax=info->vmax;=%6.6f",plot->VelosityMax);
       fprintf(f,"\n plot->VelosityMin=info->vmin=%6.6f",plot->VelosityMin);

       fclose(f);
       
  printf("\n\rspectra loaded");
  draw_window(win);
  
  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));

  printf("\n\rbegin create interface");
  CraeteInterface(controls,Parend,win,scr,plot);
  printf("\n\rinterface created");
  printf("\n\rbegin display information");
  DisplayInformation(controls,lorents);
  printf("\n\rinformation displayed");
 
  Message->type=MESSAGE_FULL_REDRAW_ALL;
  Message->arg1=0;
  Message->arg2=0;
  Message->arg3=0;

  printf("\n\rbegin send first message");
  SendMessage(Parend,Message);
  printf("\n\rmessage sended");
Как видно вызов функции LoadSpectra происходит ещё до создания интерфейса, поэтому
функции libGUI тут непричём.

Re: Open Watcom

Posted: Fri Feb 01, 2008 7:55 am
by Serge
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?

если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.