Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вт дек 12, 2017 8:42 pm

Часовой пояс: UTC+03:00




Начать новую тему  Ответить на тему  [ 56 сообщений ]  На страницу Пред. 1 2 3 4 След.
Автор Сообщение
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Сб янв 26, 2008 8:28 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
andrew_programmer

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


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Сб янв 26, 2008 9:48 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Цитата:
У тебя ошибка в коде. Правильно 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!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Сб янв 26, 2008 9:56 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Пн апр 16, 2007 6:38 pm
Сообщения: 1222
а ты попробуй оба, на двух копиях файла..

_________________
И мы уже давно не пешки,
Мы пули, мы орлы, и решки!
Война ютит бинарный код,
Умри, или иди вперед!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Вс янв 27, 2008 12:59 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
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
СообщениеДобавлено: Вс янв 27, 2008 1:32 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Ура! Заработало!

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

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

_________________
KolibriOS-перспективная ос!

Kolibri is best operation system in the world!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Вс янв 27, 2008 1:55 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
andrew_programmer
kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Вс янв 27, 2008 5:14 pm 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Пытался скомпилировать при помощи OpenWatcom свою научную программу.
Естественно пришлось переделать компиляторо-зависимые вещи в программе.
Всё переделал.Компилирую. И тут возникает непредвиденная проблема.

В файле libGUI.h объявляются функции из libGUI. Например:
Код:
void*  (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control);


Потом в libGUI.c эти функции линкуются. В программе вышеприведённая функция
вызывается так:
Код:
CraeteBookmark( arguments )


Компиляция всех C файлов происходит нормально и создаются соответствующие obj
файлы. Но на этапе линковки возникает проблема. К именам функций из libGUI
добавляется символ "-". Поэтому линковщик пишет:
Код:
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!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Вс янв 27, 2008 10:44 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
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
СообщениеДобавлено: Вс янв 27, 2008 11:59 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
Посмотрел документацию, ecx и edx сохранять не надо.


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Пн янв 28, 2008 7:29 pm 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
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
СообщениеДобавлено: Вт янв 29, 2008 2:37 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Цитата:
Я поправил заголовочные файлы, 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!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Вт янв 29, 2008 5:20 pm 
Не в сети

Зарегистрирован: Чт дек 21, 2006 10:51 am
Сообщения: 88
Такой вопрос, можно ли юзать STL в при компиляции с OpenWatcom. А конкретно меня интересует map.
В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.

_________________
Если бы строители строили здания, так же как программисты пишут программы первый же залетевший дятел разрушил бы цивилизацию.


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Ср янв 30, 2008 12:14 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
SHREDER

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


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Пт фев 01, 2008 3:46 am 
Не в сети
Аватара пользователя

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Уже несколько дней пытаюсь заставить работать скомпилированную OpenWatcom-ом мою
научную программу. Для работы программы используются функции из libC и минимум
прямых обращений к системным функциям(функции из файла kolibrisys.h)
Необходимые обёртки системных функций я переделал под OpenWatcom. Это объектные
файлы формата MS COFF.Регистры в ассемблерных функциях сохраняются в стеке, чтобы
не возникало конфликтов с кодом, генерируемым Watcom-ом.Структуры упакованы через
#pragma pack(1). Я компилировал Watcom-ом тестовую программу, использующую libGUI,
она работает.
В коде моей программы нет ничего специфичного для компилятора.C код программы
платформенно независим.
Сама программа компилируется.Я открываю ей файл со спектром и программа вылетает.
Я выискивал место вылета программы. И пришёл к выводу - дело не в моей программе,а
в компиляторе OpenWatcom или в libC...

Вот в чём дело.
Загрузка спектра и вычсисление начальных параметров из спектра происходит в функции
LoadSpectra. Если раскоментировать часть кода, выводящую проверочную информацию в
файл и скомпилировать, то проверочная информация показывает, что спектр загружается
правильно и начальные параметры из него опрееляются правильно. Вот код функции:
Код:
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 и запись параметров в другой файл:
Код:
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!


Вернуться к началу
 Заголовок сообщения: Re: Open Watcom
СообщениеДобавлено: Пт фев 01, 2008 7:55 am 
Не в сети
Kernel Developer

Зарегистрирован: Ср мар 08, 2006 6:25 pm
Сообщения: 3929
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?

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


Вернуться к началу
Показать сообщения за:  Поле сортировки  
Начать новую тему  Ответить на тему  [ 56 сообщений ]  На страницу Пред. 1 2 3 4 След.

Часовой пояс: UTC+03:00


Кто сейчас на конференции

Сейчас этот форум просматривают: Bing [Bot] и 1 гость


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Limited
Русская поддержка phpBB