andrew_programmer
У тебя ошибка в коде. Правильно fputc('a',f);
Open Watcom
Точно. Я перепутал с функцией fprintf()У тебя ошибка в коде. Правильно fputc('a',f);
А где в IDE такая опция? Я что-то не нашёл.OPTION OFFSET=0
Нужно использовать pe2kos_path.exe или pe2kos_nopath.exe ?pe2kos <file.exe> file
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
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
Открываешь меню 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 неработает.
Serge, большое спасибо за помощ.
Любопытствующий вопрос. Какие функции содержатся в kolibc.lib ?
Поэкспериментирую с оптимизациями в OpenWatcom.
P.S.
Рабочим оказался вариант с pe2kos_path.exe , а вариант с pe2kos_nopath.exe неработает.
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
andrew_programmer
kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.
kolibc.lib попала по ошибке. Там был небольшой набор файловых С функций для компиляции Doom. Теперь она не нужна.
Пытался скомпилировать при помощи OpenWatcom свою научную программу.
Естественно пришлось переделать компиляторо-зависимые вещи в программе.
Всё переделал.Компилирую. И тут возникает непредвиденная проблема.
В файле libGUI.h объявляются функции из libGUI. Например:
Потом в libGUI.c эти функции линкуются. В программе вышеприведённая функция
вызывается так:
Компиляция всех C файлов происходит нормально и создаются соответствующие obj
файлы. Но на этапе линковки возникает проблема. К именам функций из libGUI
добавляется символ "-". Поэтому линковщик пишет:
И так для всех функций libGUI, встречающихся в других obj файлах.
Ну и соответственно собрать эти obj файлы в exe файл он неможет.
Как решить проблему ?
Естественно пришлось переделать компиляторо-зависимые вещи в программе.
Всё переделал.Компилирую. И тут возникает непредвиденная проблема.
В файле libGUI.h объявляются функции из libGUI. Например:
Code: Select all
void* (_stdcall *CraeteBookmark)(struct HEADER *Parend,void *Control);
вызывается так:
Code: Select all
CraeteBookmark( arguments )
файлы. Но на этапе линковки возникает проблема. К именам функций из 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!
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. Ватком очень на это расчитывает.
Ты объявил 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а теперь компилирует библиотеки
Это опции для линка: 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!
Kolibri is best operation system in the world!
Такой вопрос, можно ли юзать STL в при компиляции с OpenWatcom. А конкретно меня интересует map.
В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.
В gcc пока что нельзя если не юзать minuetLibC, который откровенно ужаный. В нем праблы заключаются в отсутвии new.h и Allocator не компилится.
Если бы строители строили здания, так же как программисты пишут программы первый же залетевший дятел разрушил бы цивилизацию.
SHREDER
Я не знаю. Для Колибри наверное потребуется портировать часть runtime-кода. Одной Clib скорее всего не хватит.
Я не знаю. Для Колибри наверное потребуется портировать часть runtime-кода. Одной Clib скорее всего не хватит.
Уже несколько дней пытаюсь заставить работать скомпилированную OpenWatcom-ом мою
научную программу. Для работы программы используются функции из libC и минимум
прямых обращений к системным функциям(функции из файла kolibrisys.h)
Необходимые обёртки системных функций я переделал под OpenWatcom. Это объектные
файлы формата MS COFF.Регистры в ассемблерных функциях сохраняются в стеке, чтобы
не возникало конфликтов с кодом, генерируемым Watcom-ом.Структуры упакованы через
#pragma pack(1). Я компилировал Watcom-ом тестовую программу, использующую libGUI,
она работает.
В коде моей программы нет ничего специфичного для компилятора.C код программы
платформенно независим.
Сама программа компилируется.Я открываю ей файл со спектром и программа вылетает.
Я выискивал место вылета программы. И пришёл к выводу - дело не в моей программе,а
в компиляторе OpenWatcom или в libC...
Вот в чём дело.
Загрузка спектра и вычсисление начальных параметров из спектра происходит в функции
LoadSpectra. Если раскоментировать часть кода, выводящую проверочную информацию в
файл и скомпилировать, то проверочная информация показывает, что спектр загружается
правильно и начальные параметры из него опрееляются правильно. Вот код функции:
Но! Если сразу же после вызова функции LoadSpectra вывести этиже параметры(из тех же
структур) в другой файл, то они окажутся совершенно другими. Это значит, что чтение
данных происходит из другой области памяти. При компиляции GCC такой проблемы не
возникает. Как вы видели программа нормально работает.
Вот код, где происходит вызов функции LoadSpectra и запись параметров в другой файл:
Как видно вызов функции LoadSpectra происходит ещё до создания интерфейса, поэтому
функции libGUI тут непричём.
научную программу. Для работы программы используются функции из 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);
*/
}
структур) в другой файл, то они окажутся совершенно другими. Это значит, что чтение
данных происходит из другой области памяти. При компиляции 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");
функции libGUI тут непричём.
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!
Kolibri is best operation system in the world!
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?
если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?
если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.
Who is online
Users browsing this forum: No registered users and 1 guest