Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Frozen Pinguin Гость
|
Добавлено: Чт Авг 21 2003 09:35 Заголовок сообщения: Проблемы с памятью (C под DOS) |
|
|
Написал программу... при попытке запустить выдает Stack Overflow (пытался компилировать на режимах от Medium до Huge на Borland Tubo C++ 3.0 и на QC (2.0, кажется). Динамическая память не используется, не динамические переменные в сумме занимают не больше 12 кб... Причем если освободить примерно 6 кб памяти (уменьшением массивов), то все работает нормально.
Почему так??? И что с этим делать?
Функции не принимают и не возвращают ничего крупнее double.
Кстати, еще вопрос: почему на любой модели coreleft() и farcoreleft() возвращают примерно 60кб? |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пт Авг 22 2003 08:34 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Была такая фигня. Только ошибка переполнения стека не возникала, просто данные портились. Попробуй сделать большие нединамические переменные статическими или динамическими, чтобы на стеке оставалось не более 2 кб.
А не всё ли равно сколько возвращает coreleft ? Ведь всё равно нельзя выделить блок больше одного сегмента (64кб) |
|
Вернуться к началу |
|
|
GREA
Зарегистрирован: 14.05.2003 Сообщения: 758 Откуда: Новосибирск
|
Добавлено: Сб Авг 23 2003 18:39 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Может, из-за многоуровневой (бесконечной)рекурсии (если есть). Проблему можно обойти, перезапустив среду. Но после одного выполнения баг повторится. |
|
Вернуться к началу |
|
|
Frozen Pinguin Гость
|
Добавлено: Пн Авг 25 2003 16:53 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Баг идет при первом выполнении. |
|
Вернуться к началу |
|
|
Frozen Pinguin Гость
|
Добавлено: Пн Авг 25 2003 16:56 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
>большие нединамические переменные статическими или динамическими, чтобы на стеке оставалось не более 2 кб.
а вот с этого места, пожалуйста, поподробнее... разве автоматические переменные занимают места больше, чем статические?
> А не всё ли равно сколько возвращает coreleft ? Ведь всё равно нельзя выделить блок больше одного сегмента (64кб)
Да нет... просто даже если я пытаюсь выделить много раз по чуть-чуть, он все равно не дает больше 64кб |
|
Вернуться к началу |
|
|
grayrat
Зарегистрирован: 30.06.2003 Сообщения: 189
|
Добавлено: Пн Авг 25 2003 17:31 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
> а вот с этого места, пожалуйста, поподробнее... разве автоматические переменные занимают места больше, чем статические?
Дело в том что статические переменные не используют стек, и вот это работает #include stdio.h #include stdlib.h
#define LEN 64000
int main() { static char s[ LEN ]; char t[ LEN ]; long i;
randomize(); for( i=0; i < LEN; i++ ) s[ i ] = rand();
for( i=0; i < LEN; i++ ) t[ i ] = s[ i ];
randomize(); for( i=0; i < LEN; i++ ) if( t[ i ] != char(rand()) ) return printf( "error at step %u\n", i );
return printf( "OK!\n" ); }
>Да нет... просто даже если я пытаюсь выделить много раз по чуть-чуть, он все равно не дает больше 64кб
А как пытаешься ? |
|
Вернуться к началу |
|
|
Frozen Pinguin Гость
|
Добавлено: Вт Авг 26 2003 16:24 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
> А как пытаешься ?
через ?alloc(), но сейчас примера программы нет
примеры будут позже, где-то через неделю, когда учиться уеду |
|
Вернуться к началу |
|
|
Chea Гость
|
Добавлено: Вт Авг 26 2003 17:37 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Изначально BCPP 3 дает стек стек ограниченного размера (16 или 8)Mb примерно так. Есть какие-то опции (уже точно не помню какие). Смотри там. Второе вроде бы при учебе от преподов звучало что существуют модификаторы для управления стеком. Как всегда у студентов все пролетает мимо ушей, поэтому больше не скажу. Смотри все что ставится для линковщика (начинается типа $ или -). 3. Стек использеется для передачи параметров при вызове функций и для локальных переменных. Попробуй другие способы передачи параметров и старайся избавится от больших локальных переменных (типа массивов) унеси их в кучу . |
|
Вернуться к началу |
|
|
Chea Гость
|
Добавлено: Вт Авг 26 2003 17:40 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Размер кучи по умолчанию 64К См. опции |
|
Вернуться к началу |
|
|
Chea Гость
|
Добавлено: Вт Авг 26 2003 17:42 Заголовок сообщения: Ошибочка читать Mb как Kb (-) |
|
|
. |
|
Вернуться к началу |
|
|
Frozen Pinguin Гость
|
Добавлено: Ср Авг 27 2003 16:34 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
1) спасибо, все так и есть 2) "унести в кучу" означает "описывать как глобальные"? |
|
Вернуться к началу |
|
|
Chea Гость
|
Добавлено: Чт Авг 28 2003 05:46 Заголовок сообщения: Унести в кучу - выделять в свободной памяти, а за ненадобностью удалять(-) |
|
|
. |
|
Вернуться к началу |
|
|
программист Гость
|
Добавлено: Пт Авг 29 2003 14:48 Заголовок сообщения: Re: Проблемы с памятью (C под DOS) |
|
|
Память тут не при чём. Переполняется стек вызова функций. (GREA правильно писал, только ошибка будет всплывать при ЛЮБОМ выполнении, даже первом). Проверь внимательно свою рекурсию на предмет бесконечных вызовов. Уверен, что ошибка в ней. |
|
Вернуться к началу |
|
|
|