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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 16.03.2013, 13:24   #1
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию Сортировка массива строк.Компилируется, но вылетает.

В файле f1.dat содержатся 5550 строк, самая длинная из которых 648 символов, нужно их отсортировать методом пузырька по алфавиту и вывести в f2.dat.
Моё решение состоит в следующем:
1)создаём массив строк нужного размера
2)создаём массив указателей размером равным количеству строк
3)считываем данные в массив строк
4)расставляем указатели на каждую строку по порядку(далее обращаемся к строкам через них)
5)сортируем массив указателей методом пузырька
6)выводим массив строк через указатели в файл f2.dat
Компилируется без ошибок, но при запуске вылетает.Вылет происходит сразу при входе в main. Отладчик пишет, что программа вызвала нарушение доступа(ошибку сигментации).
Жопой чувствую, что ошибка в какой то мелочи, но второй день не могу её найти. Ткните носом
Код:
///////////////////////////////////////////////////////////////////////
/*Сортировка col строк вместимостью до len символов из файла f1.dat, */
/*сортировка по алфавиту методом пузырька, вывод в f2.dat            */
///////////////////////////////////////////////////////////////////////

#include <stdio.h>
#include <conio.h>
#include <locale.h>
#include <string.h>
#define len 650//длина строки
#define col 5550//количество строк

main()
{
setlocale(LC_ALL,"RUS");
FILE *fp;
char *ps[col], *temp;
int i, j;
char s[col][len];
fp = fopen("..\\resources\\f1.dat","r");
	if(fp == NULL)
	{
	printf("Нет файла данных");
	getch();
	return 1;
	}
	for(i = 0;i < col;i++) fgets(s[i],len,fp);//записываем строки из файла в массив строк
fclose(fp);
	for(i = 0;i < col;i++) ps[i] = s[i];//расставляем указатели на каждую строку
	for(i = 0;i < col - 1;i++)//сортируем указатели методом пузырька
	{
		for(j = col - 1;j > i;j--)
		{
			if(strcmp(ps[j - 1],ps[j]) > 0)
			{
			temp = ps[j];
			ps[j] = ps[j - 1];
			ps[j - 1] = temp;
			}
		}
	}
fp = fopen("..\\resources\\f2.dat","w");
	for(i = 0;i < col;i++) fprintf(fp,"%s",ps[i]);//выводим строки в файл по отсортированным указателям
fclose(fp);
printf("Готово");
getch();
}
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 16.03.2013, 13:43   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
Жопой чувствую
А лучше бы моском:
Код:
char *ps[col]
...
for(i = 0;i < col;i++) ps[i] = s[i];
А где получение памяти для массива ps и его элементов?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.03.2013, 14:10   #3
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Цитата:
А лучше бы моском
Он пока в пасивном режиме
Цитата:
А где получение памяти для массива ps и его элементов?
Увы в книжке этого нет, или я не так вас понял. А как это организовать? Научите бестолочь, если не сложно
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 16.03.2013, 14:26   #4
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

int main(). Дальше не смотрел.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 16.03.2013, 14:50   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Тебе нужно помимо сказанного в посте 4 еще и отладку по шагам проделать, чтоб понять где на какой строке ошибка.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.03.2013, 15:23   #6
BDA
МегаМодератор
СуперМодератор
 
Аватар для BDA
 
Регистрация: 09.11.2010
Сообщений: 7,285
По умолчанию

Stilet, не соглашусь - зачем выделять память? Это же массив указателей, которые ссылаются на области памяти другого массива. Отладка определенно нужна.

Че Гевара, неплохо бы "чистить" строки после занесения в массив, т.к. на конце строки сохраняются символы переноса. Получается, что одна и та же строка в середине файла и в конце будет отличаться последними байтами.
Кстати, на маленьком тестовом файле программа работает (GCC Code::Blocks). Только вывод работает не совсем так, как нужно, как раз из-за сохраненных символов переноса, т.е. последняя строка "склеивается" с какой-то другой из-за отсутствия у нее этих самых символов.
Попробуйте чуть увеличить len (на несколько символов) для того, чтобы считывать 648 символов строки, 1-2 символа переноса, и было место для нулевого байта.
Еще одно предположение - программа не может выделить 5550 * 650 байт, т.е. нужно динамически выделять память под массив.
Еще одно - добился падения программы, когда указал количество строчек больше, чем есть в файле. Вообще, мне не нравится такая жесткая привязка как к длине строки, так и к количеству строк.
Может оказаться, что все предположения верны
Пишите язык программирования - это форум программистов, а не экстрасенсов. (<= это подпись )

Последний раз редактировалось BDA; 16.03.2013 в 15:51.
BDA вне форума Ответить с цитированием
Старый 16.03.2013, 15:32   #7
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
int main()
Без разницы, ничего не меняет.
Цитата:
Сообщение от Stilet Посмотреть сообщение
char *ps[col]=new char[col];
Не помогло.
Цитата:
Сообщение от Stilet Посмотреть сообщение
Тебе нужно помимо сказанного в посте 4 еще и отладку по шагам проделать, чтоб понять где на какой строке ошибка.
В первую очередь сделал, ошибка вылетает сразу после запуска отладчика.
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 16.03.2013, 15:59   #8
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,792
По умолчанию

Цитата:
ошибка вылетает сразу после запуска отладчика.
А ты как отладчик то запускаешь?.
Не может твоя программа вылетать сразу же, если только не повреждены используемые у тебя хедеры.
Цитата:
не соглашусь
Ты прав, я как-то упустил из виду что автор индексирует массив, что есть хорошей идеей.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.03.2013, 18:14   #9
Че Гевара
Форумчанин
 
Аватар для Че Гевара
 
Регистрация: 25.09.2012
Сообщений: 182
По умолчанию

Цитата:
Сообщение от BDA Посмотреть сообщение
Еще одно предположение - программа не может выделить 5550 * 650 байт, т.е. нужно динамически выделять память под массив.
похоже так и есть, опытным путём я выяснил, что так можно отсортировать не более 3170 строк, иначе программа будет падать.
Всем спасибо))))))))
Отладка кода вдвое сложнее, чем его написание. Так что если вы пишете код настолько умно, насколько можете, то вы по определению недостаточно сообразительны, чтобы его отлаживать.
Brian W. Kernighan.
Че Гевара вне форума Ответить с цитированием
Старый 16.03.2013, 18:25   #10
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,964
По умолчанию

Цитата:
Сообщение от Че Гевара Посмотреть сообщение
Без разницы, ничего не меняет.

Не помогло.

В первую очередь сделал, ошибка вылетает сразу после запуска отладчика.
Я прокомпилил твой код, нашёл это. Дальше разбираться не стал (копаться в чужом коде за "просто так", желания не возникло). Тем болеее, что он, для меня , ценности не представляет.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Ответ


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

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
delphi потоки, компилируется и вылетает. drozd_amm Помощь студентам 1 25.12.2012 21:46
Сортировка массива строк МихаилБ Помощь студентам 2 25.06.2011 21:41
сортировка массива строк. daruwanov Общие вопросы C/C++ 6 21.09.2010 19:57
сортировка массива строк в Си SpLIne Общие вопросы C/C++ 2 15.04.2010 16:17
Сортировка массива строк StanPBH Помощь студентам 9 24.04.2007 00:34