Board.KolibriOS.org

Official KolibriOS board
It is currently Sat May 25, 2019 12:31 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 56 posts ]  Go to page Previous 1 2 3 4 Next
Author Message
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 1:37 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?


Функция LoadSpectr(file,info) загружает из файла спектр. Если расскомментировать проверочный код:
Code:
        //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 заполняется правильно. А если эти же структуры прочитать сразу же после выхода из функции, то данные оказываются неверными.
Quote:
если lorents ( наверное Lorentz ?) хранится в регистре то значение может теряться внутри вызовов. Проверь значение указателя до и после вызовова LoadSpectra.

Проверял. Значения указателей структур lorents(она же info в функции LoadSpectra) и plot до и после вызова - сохраняются. Тоесть указатели не разрушаются. Похоже неправильно работает адресация полей структуры после вызова.

_________________
KolibriOS-перспективная ос!
Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 3:37 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Я проверил адреса полей структур. Я реализовал вывод адресов полей структуры внутри функции LoadSpectra()
и после вызова функции. Почему-то после вызова функции адреса полей структуры info смещаются на 4 байта,
а структуры plot на 7 байт. Из-за этого читаются неправильные данные. Только вот почему происходит смещение адресов - непонятно.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 7:02 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
Quote:
Почему-то после вызова функции адреса полей структуры info смещаются на 4 байта,а структуры plot на 7 байт
А до вызова ? Скорее всего это разные опции выравнивания при компиляции. Выравнивание по умолчанию 8 байт. После int смещение будет 4 после char 7 байт. Это легко проверить если посмотреть дизассемблированный листинг. В Ide открываешь на файле контекстное меню правой кнопкой мыши Disassemble -> Edit disassemble.
Если скинешь мне все исходники я смогу проверить другие варианты.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 01, 2008 11:17 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Вывод адресов структуры показал, что до вызова функции и после вызова адреса полей совпадают. А вот в самой функции адреса смещаются. В IDE я выбрал опцию 1 byte aligment вместо Default byte aligment и проблема с адресами структур исчезла. Потом я упаковал все структуры через #pragma pack(1) и вернул Default byte aligment. Теперь проблемы со смещением нет. Но появилась другая проблема :) После создания интерфейса вызывается функция Plot() , которая строит спектры(экспериментальные, теоретические и т.д.). Экспериментальный спектр строится нормально, а потом где-то в функции Plot() из-за чего-то происходит вылет. Понятия не имею - где и почему.

Quote:
Если скинешь мне все исходники я смогу проверить другие варианты.


Исходники конечно могу скинуть. Главное знать куда скидывать - электронного ящика в профиле нет. :)
P.S
Мда... Сам язык программирования C платформенно независим, а вот программа, написанная на нём и разработанная определённым компилятором, зависит от этого компилятора. Получается, что, то что компилируется и работает с одним компилятором, может не работать с другим :( Вот такие "пироги" ....

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Feb 02, 2008 9:20 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Я выяснил, почему происходит вылет программы в функции Plot().
В файле kolibrisys.h реализованы несколько макросов: va_list,va_start,va_end.
OpenWatcom не ругается на эти макросы - он просто генерирует неправильный код.
В результате функции vsnprintf() передаётся неправильный лист параметров и происходит
вылет программы. Хотя эти же самые макросы компилируются GCC и работают правильно.
Я закомментировал эти макросы и использовал макросы из stdarg.h(поставляется
вместе с Watcom-ом).Функция Plot() вылетать перестала. Сейчас продолжаю разбираться
с другими приколами компилятора OpenWatcom.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Feb 03, 2008 12:03 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
Это потому что Ватком передаёт часть параметров в регистрах. Вообще если пользуешься стандартными макросами и заголовочными файлами надо всегда брать родные.

Мой ящик ion2<собака>mail.ru


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sun Feb 03, 2008 2:39 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Serge

Отправил.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Mon Feb 04, 2008 12:41 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

У меня нет kolibrisys.lib


Top
   
 Post subject: Re: Open Watcom
PostPosted: Mon Feb 04, 2008 1:45 am 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Я как раз об этом толькочто вспомнил.
Когда собирал архив, старался ничего не забыть. И как на зло забыл положить библиотеку kolibrisystem.lib

Отправил.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Mon Feb 04, 2008 1:55 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

Code:
//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:
          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.


Top
   
 Post subject: Re: Open Watcom
PostPosted: Mon Feb 04, 2008 4:29 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Serge

Большое спасибо!
Наконец-то программа заработала.

Quote:
Этот код не работает. Длина командной строки 256 байт вместе с завершающим нулём


Мне почему-то казалось, что 1024. Видно GCC как-то перестраховывался от этой ошибки. Я подправил код и в других местах - теперь всё работает.

Quote:
Во-вторых SendMessage просто убийца для программ на С. Не сохраняет ни одного регистра, меняет esi и edi.


Я недавно добавлял в libGUI сохранение регистров после входа в функции. Во все функции добавил, а про SendMessage() забыл.
Добавлю.

Ещё раз большое спасибо.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Tue Feb 05, 2008 11:47 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Обнаружилась ещё одна проблема, которая, как мне кажется, связана с libC.

Если в любой части функции LoadSpectr() вставить код открытия и закрытия какого-либо файла, то с указателями происходит что-то непонятное. После заполнения структур для libGUI данные в них оказываются какие-то другие. Хотя если код открытия и закрытия какого-либо файла убрать, то структуры заполняются правильно.

Вот я в код добавляю открытие закрытие файла:
Code:
        //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);
        */


Если код раскомментировать, то программа работать небудет, а если оставить закомментированным, то программа работает.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Thu Feb 07, 2008 2:18 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Serge

Проводил эксперименты с кодом и обнаружил странные вещи.
Я менял положение финкции LoadSpectra() в коде программы. С точки зрения логики работы программы это не имеет никакого значения. А вот с точки зрения генерации кода, свободного от ошибок, как оказалось, имеет.

Вот часть кода :
Code:
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 (тоесть, если не загружается этот файл).

В случае третьего варианта расположения функции, программа работает так, как ей и положено работать согласно коду программы.

Почему происходят такие странные вещи - я покачто не выяснил.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Thu Feb 07, 2008 8:01 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
В новой версии libC для OpenWatcom-а, что на нашем SVN, в проекте установлена модель памяти small. А чем она отличается от flat ? Её можно применять для выделения больших объёмов памяти в сотни мегабайт ?

Я просматривал дизассемблированный листинг кода, сгенерированного watcom-ом, там в вычислениях с плавающей запятой часто встречается строка call __CHP . Что это такое ?

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Thu Feb 07, 2008 10:26 pm 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer

Для NT small=flat. Означает отсутствие дальних указателей sel:offset. __CHP оболочка для frndint.

Я думаю что твой разрушает кучу malloс. Одиночные структуры лучше располагать в стеке.


Top
   
Display posts from previous:  Sort by  
Post new topic  Reply to topic  [ 56 posts ]  Go to page Previous 1 2 3 4 Next

All times are UTC+03:00


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Limited