Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 31.07.2009, 08:41   #1
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию Программа на C вылетает по непонятным причинам

Синтаксически, на первый взгляд, все правильно. Программа ведет себя очень странно. Код успешно компилируется. Ошибки возникают при выполнении. Один и тот же код вылетал в течение 2х дней на разных строках программы, на таких командах как system("PAUSE"), malloc, fopen, getc(stdin), return 0. После перезагрузки компьютера или редактора ошибки исчезали без всяческих модификаций кода таким же чудесным образом, как и появлялись. В данный момент программа выдает неизвестную ошибку после окончания. Программа запускалась тремя разными способами: из редактора devcpp, в devcpp-шном дебаггере, c помощью bat- файла. Один и тот же экзешник мог нормально сработать в devcpp, но выдать ошибку при запуске из bat-файла или наоборот. В данный момент программа выдает ошибку после окончания при запуске из devcpp или с помощью bat-файла, и нормально заканчивается в дебагере. Единственное, что смущает, после работы дебагера в отчете встречается строчка "frames-invalid". Глюки в разных вариациях повторяются уже на третьем компьютере. Причем один и тот же код на разных компах порождает разные глюки. Выглядят они обычно так: ошибка сегментации, неизвестная ошибка, ошибка редактора devcpp, или просто программа молча завершается после какой-то строки с вышеперечисленными командами. Что можно было бы предпринять? Переходить в вижалстудио и пробовать там, с надеждой что проблема в редакторе? Хотя за 2 месяца работы в нем, такие проблемы возникли в первый раз.
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 08:45   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Где-то портишь память скорее всего
Black Fregat вне форума Ответить с цитированием
Старый 31.07.2009, 08:56   #3
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию

Например, как?
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 08:56   #4
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию

Друг сказал, что frames-invalid в дебагере означает неправильную работу со стеком, что-то типа того, что дебагер не может распознать границы команд и послал меня в вижал студио.
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 08:57   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Lavisa, кот в студию.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 31.07.2009, 09:21   #6
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию

ок тока он большой, думаю ограничиться функцией main, на просторах которой разворачивается действо в данный момент. Мда, вот бы еще форматирование в посте исправить.

Код:
#include "main.h"
// For more comments look up main.h 
FR_struct fr_arr[ FR_ARR_SIZE ];
// Глобальный массив структур, описывающих функций по определению типа сокращения

FCH_struct fch_arr[ FCH_ARR_NUM_ROWS ][ FCH_ARR_NUM_COLUMNS ];
// Глобальный массив структур, описывающих функции по определению подтипа сокращения
int miss_words = 0,
// Глобальная переменна, 1 - слова расшифровки могут быть пропущены
// 0 - слова расшифровки пропускать нельзя    
all_alignments = 1,
//глобальная переменная, 1 - должны быть сгенерированы все возможные 
// выравнивания 0 - только первое выравнивание    
comp_word = 0,
// Глобальная переменная, должны ли учитываться сложные слова. 1 - должны 
// 0 - нет
    
lern = 1;  
 // Глобальная переменная, показывающая должен ли текущий запуск программы  
// повлиять на значения статистики  
    
        
char *func_seq;     
// Глобальная переменная, строка, задающая порядок применения функций 
// определения типа и подтипа     
     
FILE    *file_ptr_stat;
// Глобальная переменная - имя файла со статистикой  
                
//-------------------------------------------------------------------------

int main( int argc, char** argv )

// argv[1] задает источник ввода параметров, C - из командной строки, 
// F - из файла

// argv[2] - задает значение переменной all_alignments
// argv[3] - задает значение параметра miss_words
// argv[4] - задает значение параметра comp_word
// argv[5] - задает значение параметра func_seq 
{   
         
int lib_res_id, // Значение, возвращаемое библиотечной функцией res_id; // Значение, возвращаемое функцией char *str_sf, // Pointer to the current short form // Указатель на строку краткой формы *str_ff, // указатель на строку полной формы *str_dil, // Указатель на строку разделителей *str_num; // Указатель на строку, содержащую запись числа, параметр strtol() SF_struct *sf_struct_list; // Указатель на список, в котором хранятся части преобразованной // краткой формы FF_struct *ff_struct_list; // Указатель на список, к котором хранятся части преобразованной // полной формы FILE *file_ptr_r; // Указател на файл, содержащий список кратких и полных форм
//========================================================

Последний раз редактировалось Sazary; 31.07.2009 в 15:54.
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 09:22   #7
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию

Код:
if ( argc < NUMPARAM + 1 ) // Если параметров меньше NUMPARAM
print_error( MAIN_NUMPARAM_ERR );
all_alignments = ( int )strtol( argv[2], &str_num, 10 ); // Присвоить значение переменной all_alignments if (
( all_alignments != 0 ) && ( all_alignments != 1 ) || ( strlen( str_num ) > 0 )
) // Если переменная all_alignments хранит не булевское значение
print_error( MAIN_ALLAPARAM_ERR );
miss_words = ( int )strtol( argv[3], &str_num, 10 ); // Присвоить значение переменной miss_words if (
( miss_words != 0 ) && ( miss_words != 1 )|| ( strlen( str_num ) > 0 )
) // Если переменная miss_words хранит не булевское значение
print_error( MAIN_MISSWPARAM_ERR );
comp_word = ( int )strtol( argv[4], &str_num, 10 ); // Присвоить значение переменной comp_word if (
( comp_word != 0 ) && ( comp_word != 1 )|| ( strlen( str_num ) > 0 )
) // Если переменная comp_word хранит не булевское значение
print_error( MAIN_COMPWPARAM_ERR );
lern = ( int )strtol( argv[5], &str_num, 10 ); // Присвоить значение переменной lern if (
( lern != 0 ) && ( lern != 1 )|| ( strlen( str_num ) > 0 )
) // Если переменная lern хранит не булевское значение
print_error( MAIN_LERNPARAM_ERR );
file_ptr_stat = fopen( "statini.txt", "r" ); // Открытие файла статистики if( file_ptr_stat == 0 )
print_error( MAIN_STATF_ERR );
fr_array_ini(); // Инициализировать массив функций определения типа fch_array_ini(); // Инициализация массива функций проверки подтипа load_stat(); // Загрузить статистику из файла stat_init.txt и сохранить ее // в массиве fch_arr

Последний раз редактировалось Sazary; 31.07.2009 в 15:55.
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 09:22   #8
Lavisa
Пользователь
 
Регистрация: 28.12.2008
Сообщений: 28
По умолчанию

Код:
func_seq = ( char* )malloc( STRBUF ); // Выделение памяти для строки func_seq if ( func_seq == NULL )
print_error( MAIN_MEM_ERR );
lib_res_id = sprintf( func_seq, "%s", argv[6] ); // Записать строку func_seq if ( lib_res_id < 0 )
print_error( MAIN_SPRINTF_ERR );
if ( *func_seq == 'D' ) // Если строка func_seq содержит единственную букву 'D' {
if ( comp_word ) // Если нужно учитывать сложные слова
sprintf( func_seq, "%s", DEFAULT_FUNC_SEQ_COMP_W ); // Записать строку func_seq по умолчанию
else
sprintf( func_seq, "%s", DEFAULT_FUNC_SEQ ); // Записать строку func_seq по умолчанию
} else if ( *func_seq == 'S' ) // Если строка func_seq содержит единственную букву 'S' {
form_func_seq_string(); // Сформировать строку func_seq согласно статистике
}
Продолжение дальше

Последний раз редактировалось Sazary; 31.07.2009 в 15:56.
Lavisa вне форума Ответить с цитированием
Старый 31.07.2009, 09:39   #9
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
all_alignments = ( int )strtol( argv[2], &str_num, 10 );
Мне вот сразу интересно стало - а где проверяется количество аргументов? Что-то я не увидел...
И что это за Print_error...
I'm learning to live...

Последний раз редактировалось Stilet; 31.07.2009 в 09:45.
Stilet вне форума Ответить с цитированием
Старый 31.07.2009, 09:44   #10
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Вот проверка количества:
Код:
if ( argc < NUMPARAM + 1 )
// Если параметров меньше NUMPARAM
print_error( MAIN_NUMPARAM_ERR );

all_alignments = ( int )strtol( argv[2], &str_num, 10 );
Только print_error отработает, а прога дальше на выполнение пойдет в любом случае и что будет в argv[2] никто не знает
pu4koff вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
По каким причинам антивирусы палят не вирусы?? Вавел из ГМТУ Свободное общение 14 01.07.2009 12:45
Вылетает ошибка jon_free Операционные системы общие вопросы 3 29.06.2009 23:30
Прога вылетает Fi11eR Паскаль, Turbo Pascal, PascalABC.NET 4 18.06.2009 19:56
Еще одна проблема с непонятным файлом в реестре DeKot Безопасность, Шифрование 10 08.06.2009 00:04
вылетает ошибка! Алёна Общие вопросы Delphi 20 17.05.2007 06:57