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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 05.03.2011, 20:14   #1
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию Ошибка сегментирования при вызове strcat

На линуксе этот код работает безотказно, здесь же, на winXP c Visual C++ 6.0 неведомо почему происходит ошибка сегментирования, когда я вызоваю strcat.

Код:
void map::save(char filename[20]){
	char extension[] = {".map\0"};
	
	strcat(filename, extension);
	
	ofstream ofile(filename);
	if(ofile.fail()){
		cerr << "Error loading file " << filename << endl;
		exit(1);
	}
	else{
		ofile << tileset_name << endl;
		ofile << tile_size << endl;
		ofile << map_size_x << endl;
		ofile << map_size_y << endl;


		ofile.close();
		cout << "Data succesfully saved." << endl;
	}
}
В пингвинятнике всё сохраняется и бойко работает. Здесь же стопорится не пойми на чём.

Я использую массив вместо указателя, потому что это всё ещё надо в файл сохранить. Да и с массивами на лине работало. В чём дело?
Кипящий чайник вне форума Ответить с цитированием
Старый 05.03.2011, 20:28   #2
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Если длина filename + extension >= 20 выйдешь за пределы буфера. Надо проверять длины, а лучше использовать std:string
Д_М вне форума Ответить с цитированием
Старый 05.03.2011, 20:34   #3
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Цитата:
Сообщение от Д_М Посмотреть сообщение
Если длина filename + extension >= 20 выйдешь за пределы буфера. Надо проверять длины,
Имя карты "test" - 4 символа, плюс нуль-символ, получается 5.
Расширение ".map" - 4 символа, плюс нуль-символ, получается 5.

А на всё-провсё у нас 20 символов.

Как минимум половина буфера свободна.

Цитата:
Сообщение от Д_М Посмотреть сообщение
а лучше использовать std:string
Я хотел бы, но даже С++-ые файловые функции требуют тип char* для имени файла. Ну и массивы char тоже сойдут. Но не string, увы.
Кипящий чайник вне форума Ответить с цитированием
Старый 05.03.2011, 20:42   #4
Д_М
Пользователь
 
Регистрация: 02.02.2011
Сообщений: 92
По умолчанию

Цитата:
Имя карты "test" - 4 символа, плюс нуль-символ, получается 5.
Расширение ".map" - 4 символа, плюс нуль-символ, получается 5.

А на всё-провсё у нас 20 символов.

Как минимум половина буфера свободна.
Ну тогда не знаю, в отладчике смотри...

Цитата:
Я хотел бы, но даже С++-ые файловые функции требуют тип char* для имени файла. Ну и массивы char тоже сойдут. Но не string, увы.
Код:
srtring s(filename);
s+= ".map";

fopen(s.c_str(), ...);
Д_М вне форума Ответить с цитированием
Старый 05.03.2011, 20:49   #5
Кипящий чайник
Форумчанин
 
Регистрация: 17.12.2009
Сообщений: 101
По умолчанию

Код:
fopen(s.c_str(), ...);
АГА!!!!! Вот, значит, какой член класса содержит символы!
Кипящий чайник вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Ошибка при вызове openFileDialog ---FISHER--- C# (си шарп) 7 02.03.2011 13:25
beginthread, ошибка при вызове Dreanks Помощь студентам 2 28.10.2010 14:09
Ошибка компиляции при вызове подпрограммы Android_ua Общие вопросы C/C++ 4 02.03.2010 12:20