Board.KolibriOS.org

Официальный форум KolibriOS
Текущее время: Вс дек 17, 2017 4:57 pm

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




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

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Цитата:
А что делают
LoadSpectr(file,info);
GetParametersLoadedSpectr(info); ?


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

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

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


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

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

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

Kolibri is best operation system in the world!


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

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


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

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

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


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

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

Kolibri is best operation system in the world!


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

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 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!


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

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

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


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

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

Отправил.

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

Kolibri is best operation system in the world!


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

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

У меня нет kolibrisys.lib


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

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

Отправил.

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

Kolibri is best operation system in the world!


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

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

Код:
//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 байт вместе с завершающим нулём Я заменил эту часть на
Код:
          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.


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

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

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

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


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

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


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

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

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

Kolibri is best operation system in the world!


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

Зарегистрирован: Чт май 19, 2005 4:43 pm
Сообщения: 896
Обнаружилась ещё одна проблема, которая, как мне кажется, связана с libC.

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

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


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

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

Проводил эксперименты с кодом и обнаружил странные вещи.
Я менял положение финкции 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;
  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!


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

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

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

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

Kolibri is best operation system in the world!


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

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

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

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


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

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


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

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость


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

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