Board.KolibriOS.org

Official KolibriOS board
It is currently Fri Apr 19, 2019 9:42 am

All times are UTC+03:00




Post new topic  Reply to topic  [ 56 posts ]  Go to page Previous 1 2 3 4
Author Message
 Post subject: Re: Open Watcom
PostPosted: Thu Feb 07, 2008 11:54 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
Я думаю что твой разрушает кучу malloс



Непонял. Что понимается под фразой,-"твой разрушает". Мой кто? Что ? Я использую malloc из Clib, а не свой собственный.

Quote:
Одиночные структуры лучше располагать в стеке.


Какие именно структуры ? Что нужно сделать, чтобы они были в стеке ?


P.S.
Извиняюсь за свою дотошность и любопытство. :)

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


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 08, 2008 9:10 am 
Offline
Kernel Developer

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

Твой код. Я так думаю. Где-то в CreateInterface. Там все структуры создаются malloc хотя это не массивы структур и их можно разместить в стеке. Любая ошибка в работе с указателями может повредить кучу после чего возможны такие трудноуловимые ошибки.


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

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
Твой код. Я так думаю. Где-то в CreateInterface.


Я доработал функцию CreateInterface(). Там сейчас просто нечему разрушать указатели. Единственное из-за чего может сейчас неработать эта функция - неправильное выделение кучи malloc() -ом(если куча до этого разрушена). Даже с новой функцией CreateInterface() перестановка функции LoadSpectra() ведёт всё к тем же последствиям. Значит, если куча и разрушается, то до функции CreateInterface().

Quote:
Там все структуры создаются malloc хотя это не массивы структур и их можно разместить в стеке.


Насколько я понимаю занесение структуры в стек с нужным выравниванием делается через #pragma pack(push,number) , где вместо number выравнивание. Я попробовал это сделать для одной структуры через #pragma pack(push,1) . Программа работала. А вот когда я такое сделал ещё для другой структуры, то программа стала вылетать. В чём я неправ ?
И ещё вопрос. Если я занёс структуру в стек, то она там будет всё время работы программы? А если вовремя работы программы после использования структуры её нужно удалить из стека, то что делать ? Я думаю, что это как-то делается через #pragma pack(pop), но вот как - я непонял. Help в OpenWatcom-ме этого не объясняет и Help в MSVC тоже.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 08, 2008 5:10 pm 
Offline

Joined: Mon May 01, 2006 10:12 pm
Posts: 349
В стэк сам ты её врядли заносишь, этим занимается компилер, за освобождением он тоже в состоянии сам проследить. Ты наверно не там ошибки ищешь. pop восстанивит выравнивание, дефолтное или которое было до этого (насколько я понимаю)

_________________
Image


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 08, 2008 5:21 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Quote:
стэк сам ты её врядли заносишь, этим занимается компилер,


Я это знаю. Только немогу понять почему у меня код вылетает. Я пробовал ставить #pragma pack(pop) после структур. Всёравно непомогает.

Подожду ответа Serge-а. Он всё знает. :)

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 08, 2008 5:45 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Забыл сказать. Упакованные структуры я объявляю как указатели и при этом не выделяю для них память через malloc.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Fri Feb 08, 2008 6:49 pm 
Offline
User avatar

Joined: Thu May 19, 2005 4:43 pm
Posts: 896
Разобрался в чём дело. При сохранении структур в стеке нужно объявлять структуры в программе как переменные и работать с ними соответственно.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Feb 09, 2008 2:32 am 
Offline
Kernel Developer

Joined: Wed Mar 08, 2006 6:25 pm
Posts: 3952
andrew_programmer
Размещение в стеке - создание локальной переменной. Ты объявляешь указатель на структуру struct ControlButton *ButtonTrueRestore; и потом выделяешь память для неё через malloc а надо сразу создавать экземпляр структуры в стеке struct ControlButton ButtonTrueRestore. Указатель имеет смысл если это будет массив заранее неизвестного размера. Другой пример
char *names_of_bookmarks1[]={"SINGLET","DOUBLET","SIXTET","P(H)","OTHER"};
Этот массив указателей локальный и компилятор честно создаёт его в стеке, копирует туда адреса строк, хотя в этом нет необходимости. Объяви эти массивы static. Это уменьшит размер кода и упростит его. Явных приведений типа лучше избегать. Если InfoForButton.text хранит указатель на строку то пусть это будет char *, а не unsigned int. Ещё одна проблема огромное количество предупреждений при компиляции. Среди них могут быть действительно важные но они просто тонут в общей массе.
Этот код проверяет кучу. У меня всё нормально, значит ошибка в другом месте.
Code:
    switch( _heapchk() ) {
    case _HEAPOK:
      printf( "OK - heap is good\n" );
      break;
    case _HEAPEMPTY:
      printf( "OK - heap is empty\n" );
      break;
    case _HEAPBADBEGIN:

      printf( "ERROR - heap is damaged\n" );
      break;
    case _HEAPBADNODE:
      printf( "ERROR - bad node in heap\n" );
      break;
    }


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Feb 09, 2008 1:32 pm 
Offline
User avatar

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

Спасибо за советы.

Quote:
Ты объявляешь указатель на структуру struct ControlButton *ButtonTrueRestore; и потом выделяешь память для неё через malloc а надо сразу создавать экземпляр структуры в стеке struct ControlButton ButtonTrueRestore. Указатель имеет смысл если это будет массив заранее неизвестного размера.


Я так и сделал вчера - работает.
Quote:
Другой пример
char *names_of_bookmarks1[]={"SINGLET","DOUBLET","SIXTET","P(H)","OTHER"};
Этот массив указателей локальный и компилятор честно создаёт его в стеке, копирует туда адреса строк, хотя в этом нет необходимости. Объяви эти массивы static. Это уменьшит размер кода и упростит его.


Сделаю.
Quote:
Ещё одна проблема огромное количество предупреждений при компиляции. Среди них могут быть действительно важные но они просто тонут в общей массе.


При самой первой компиляции их было в разы больше. Но я просмотрел каждое сообщение компилятора. И оставил только те, которые неважны(типа "ненайден прототип для функции"). Там ещё есть сообщения про переопределения функций libGUI, но как сделать, чтобы он правильно понял идею - непонятно. Но главное, что код с функциями libGUI работает как и должно работать.

Quote:
Этот код проверяет кучу. У меня всё нормально, значит ошибка в другом месте.


Только вот в каком другом... Но я всётаки хочу добить эту проблему.
Мне хочется сделать OpenWatcom основным инструментом для разработки научных программ для KolibriOS. Тем более что, как показывают тесты, моя научная программа, скомпилированная Watcom-ом работает на 40% быстрее, чем скомпилированная GCC. Причём в варианте с GCC уже первый уровень оптимизации приводит к неработоспособности программы, а у OpenWatcom-а с этим всё впорядке.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Feb 09, 2008 5:05 pm 
Offline
User avatar

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

Ха!
Не там собака была зарыта, где её искали! (поговорка)
Я нашёл истинную причину! :D :D :D

И так, как было дело.
Я почистил код программы, так что компилятору просто не к чему было придраться. А код всёравно глючил. Проблема возникала при открытии файла для сохранения результатов вычислений. Причём результаты вычислений P(H) сохрнялись(там открывалось 2 файла), а результаты дискретной обработки нет(там один файл открывался).
Уменя компиляция происходила с опцией "fastest possible cod" , а под стек выделялось 10Kb. Я решил скомпилировать код вообще без оптимизации. Скомпилировал. Попробовал вычислить программой P(H) - работает. Попробывал обработать дискретный спектр - вылетает уже на этапе старта алгоритма. И при этом на доске отладки появляется сообщение "stack overflow"(переполнение стека). Я выделил под стек 16 Kb -мало. Выделил 64Kb - код заработал без ошибок(нет глюков!).

Большое спасибо за советы!
Теперь можно по нормальному программировать.

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

Kolibri is best operation system in the world!


Top
   
 Post subject: Re: Open Watcom
PostPosted: Sat Mar 01, 2008 1:40 am 
Offline

Joined: Thu Dec 21, 2006 10:51 am
Posts: 88
andrew_programmer wrote:
Разобрался в чём дело. При сохранении структур в стеке нужно объявлять структуры в программе как переменные и работать с ними соответственно.


Обычный прикол С

struct A {
int a;
int b;
};
struct A a;
struct A b;
A *p = (A*)malloc(sizeof(A));
free(p);
return 0;


При создании переменной в стеке нужно указывать слово struct. Это в плюсах можно этого не делать :) а в си будет плохо.

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


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

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