Ошибка переполнения стека в C, перед любым шагом - PullRequest
1 голос
/ 07 июня 2011

Когда я пытаюсь отладить свою программу на C и даже до того, как компилятор начинает выполнять любую строку, я получаю «Необработанное исключение в 0x00468867 в HistsToFields.exe: 0xC00000FD: переполнение стека.»

Я понятия не имею, как определить проблему, поскольку программа даже не начала выполнять какую-либо строку (или, по крайней мере, это то, что я вижу в окне отладки компилятора). Как я могу определить причину переполнения, если в моей программе еще не выполнено ни одной строки? «Когда прерывается отладчик, он указывает на строку в chkstk.asm»

Я использую Microsoft Visual Studio 2008 на win7.

Я установил резервный размер стека на 300000000

PS: программа, которая раньше выполнялась нормально, но на другом компьютере.

У меня есть база данных (120000 x 60) в формате csv, мне нужно изменить ее на разделенную пробелами. Программа (которую я сам не написал) определяет структуру выходного файла:

`struct  OutputFileContents {
    char    Filename[LINE_LEN];
    char    Title[LINE_LEN];
    int NVar;
    char    VarName[MAX_NVAR][LINE_LEN];
    char    ZoneTitle[LINE_LEN];
    int     NI;
    int     NJ;
    int     NK;
    double  Datums[MAX_NVAR];
    double  Data[MAX_NVAR][MAX_NPOINT];`  

Этот последний массив «Data [] []» содержит все выходные данные. отсюда и огромный размер. Этот размер массива "MAX_NPOINT" устанавливается в исходном файле заголовка в проекте, и этот заголовок используется несколькими программами в проектах.

Большое спасибо заранее. Ахмад.

1 Ответ

3 голосов
/ 07 июня 2011

Во-первых, IDE! = Компилятор! = Отладчик.

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

Что касается того, почему отладчик не работает ... не знаю.Слишком мало ОЗУ установлено?32-битная или 64-битная платформа?Бесконечная рекурсия в построении статических переменных?На самом деле не могу сказать, не глядя на вещи, которые вы нам не показывали, такие как источник, спецификации среды и т. Д.

Редактировать: В случае, если подсказка пропущена: глобальные / статические данныеобъекты создаются до начала выполнения main().Бесконечная (или просто слишком глубокая) рекурсия в этих конструкторах может вызвать переполнение стека.(Я предполагаю C ++ вместо C, поскольку в сообщении об ошибке, которое вы указали, указано «необработанное исключение».)

Edit 2: Вы добавили, что у вас есть «база данных», которую нужно преобразоватьв космическом пространстве.Не видя остальной части вашего кода: Попытка выполнить все преобразования за один раз в памяти не является хорошей идеей.Прочитайте запись, конвертируйте ее, запишите.Повторение.Если вам нужны такие вещи, как «самая длинная запись», чтобы определить формат вывода, выполните итерацию по входным данным только для чтения, чтобы найти размеры вывода, а затем повторите итерацию, выполняя фактическое преобразование.

...