Open Watcom

High-level languages programming questions
  • У тебя ошибка в коде. Правильно fputc('a',f);
    Точно. Я перепутал с функцией fprintf() :)
    OPTION OFFSET=0
    А где в IDE такая опция? Я что-то не нашёл.
    pe2kos <file.exe> file
    Нужно использовать pe2kos_path.exe или pe2kos_nopath.exe ?
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • а ты попробуй оба, на двух копиях файла..
    И мы уже давно не пешки,
    Мы пули, мы орлы, и решки!
    Война ютит бинарный код,
    Умри, или иди вперед!
  • 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
  • Ура! Заработало!

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

    Поэкспериментирую с оптимизациями в OpenWatcom.
    P.S.
    Рабочим оказался вариант с pe2kos_path.exe , а вариант с pe2kos_nopath.exe неработает.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • andrew_programmer
    kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.
  • Пытался скомпилировать при помощи 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 файл он неможет.

    Как решить проблему ?
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • andrew_programmer

    Ты объявил CraeteBookmark как указатель на функцию, то есть это переменная. При компиляции в каждом файле где есть строка #include "libgui.h" создаётся своя переменная а при линковке лишние игнорируются. Если CraeteBookmark действительно указатель объяви её extern void* (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control); Если функция написана на асме то должна сохранять значения ebx ecx edx esi edi ebp. Ватком очень на это расчитывает.
  • Посмотрел документацию, ecx и edx сохранять не надо.
  • 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а теперь компилирует библиотеки
  • Я поправил заголовочные файлы, 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, желаю удачи.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • Такой вопрос, можно ли юзать STL в при компиляции с OpenWatcom. А конкретно меня интересует map.
    В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.
    Если бы строители строили здания, так же как программисты пишут программы первый же залетевший дятел разрушил бы цивилизацию.
  • SHREDER

    Я не знаю. Для Колибри наверное потребуется портировать часть runtime-кода. Одной Clib скорее всего не хватит.
  • Уже несколько дней пытаюсь заставить работать скомпилированную 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 тут непричём.
    KolibriOS-перспективная ос!
    Kolibri is best operation system in the world!
  • А что делают
    LoadSpectr(file,info);
    GetParametersLoadedSpectr(info); ?

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

    Users browsing this forum: No registered users and 3 guests