Форум русскоязычного сообщества Ubuntu


Считаете, что Ubuntu недостаточно дружелюбна к новичкам?
Помогите создать новое Руководство для новичков!

Автор Тема: Ошибка сегментирования  (Прочитано 1766 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Olechka555

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Ошибка сегментирования
« : 14 Сентября 2010, 07:37:22 »
При запуске выдает ошибку сегментирования. Подскажите в чем дело, плиз)

« Последнее редактирование: 14 Сентября 2010, 07:40:09 от Olechka555 »

Lifewalker

  • Гость
Re: Ошибка сегментирования
« Ответ #1 : 14 Сентября 2010, 08:23:54 »
Вопрос офигеть как полно сформулировано, но спортивного интересу ради я глянул.

  while( !inf.eof() ){
    getline( inf, st2009 );
    a2009[i] = st2009;
    i++;
  }

Память под строку st2009 сама выделяется? Вы читали хоть что-то про Си++? Вы пытаетесь прочитать из потока строку символов и присвоить её указателю на невыделенную строку. Конечно ошибка сегментироваия вываливается!

Оффлайн ierofant

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #2 : 14 Сентября 2010, 08:57:39 »
Да, вы правы, память сама выделяется! st2009, это никакой не указатель на строку. Смотрим его объявление и видим, что это объект std::string. Но каким образом используется функция getline, мне не понятно. Как вообще компилятор мог такой код пропустить? Смотрите описание функции getline http://www.cplusplus.com/reference/iostream/istream/getline/

Пользователь решил продолжить мысль 14 Сентября 2010, 09:18:42:
Прошу прощения, такая реализация функции действительно существует. Но и ошибку вашу я нашёл  :) Во время второго вызова getline (inf, st2010), должно быть getline (in, st2010);
« Последнее редактирование: 14 Сентября 2010, 20:01:49 от ierofant »

Lifewalker

  • Гость
Re: Ошибка сегментирования
« Ответ #3 : 14 Сентября 2010, 09:25:01 »
Решил любопытства ради скомпилить вашу программу и отладить её. Через 10 минут надоело :) Оказалось, я не настолько терпелив, чтобы кажды раз терпеть создание 21000 экзепляра класса string :) А почему именно 21000 а не 21000000? Ну так, интереса ради спрашиваю.

Оффлайн Olechka555

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #4 : 14 Сентября 2010, 19:03:28 »
извиняюсь за свой код)) в c++ я мало что понимаю.. до завтра надо на работе найти пропавшие исполнительные производства прошлого года) первый массив 2009 - это номера производств прошлого года их 21121, 2010 - соответственно этого их 21119.  2 пропали их и нужно вычислить.
как мне ее отладить подскажите плиз
P.S. Уважаемый Lifewalker, если вам лень разобраться зачем вообще что-то писать?
« Последнее редактирование: 14 Сентября 2010, 19:09:24 от Olechka555 »

Оффлайн ierofant

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #5 : 14 Сентября 2010, 19:17:52 »
Что вы имеете в виду под словом отладить? Что конкретно надо сделать?

Оффлайн VestniK

  • Активист
  • *
  • Сообщений: 594
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #6 : 14 Сентября 2010, 19:28:31 »
C++ не лучший способ решать подобную задачу, особенно при поверхностном знании оного. Если строки в файлах либо абсолютно идентичны, либо разные, то тут лучше в командной строке
sort file1.txt -o file1.sorted.txt
sort file2.txt -o file2.sorted.txt
diff file1.sorted.txt file2.sorted.txt
Я обычго вывод diff'а передаю ещё программе kompare которая сразу в двух панелях покажет локальные различия между файлами, но это уже дело вкуса.

Оффлайн ierofant

  • Любитель
  • *
  • Сообщений: 52
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #7 : 14 Сентября 2010, 19:33:38 »
#include <fstream>
#include <string>
#include <stdio.h>
#include <string>
#include <stdlib.h>
#include <iostream>
#pragma hdrstop
using namespace std;
//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
  ifstream inf( "часть1_2009.txt" );
  string st2009;
  string a2009[21122];
  int i=0;
  while( !inf.eof() ){
    getline( inf, st2009 );
    a2009[i] = st2009;
    i++;
  }

  ifstream in( "часть1_2010.txt" );
  string st2010;
  string a2010[21120];
  int j=0;
  while( !in.eof() ){
    getline( in, st2010 );
    a2010[j] = st2010;
    j++;
  }
  i=0,j=0;
  for(i=0;i<21122;i++)
  {
      for(j=0;j<21120;j++)
      {
        if(a2009[i]==a2010[j])
        {
            std::cout << "Concidence << 2009 num: " << i << "2010 num: " << j << std::endl;
            std::cout << "\t 2009 - " << a2009[i] << std::endl;
            std::cout << "\t 2010 - " << a2010[j] << std::endl;
        }
        
      }
  }
  
  return 0;
}

Я так понял что-то вроде этого вы хотели. Исправил вашу ошибку и сделал вывод совпадающих номеров. Что ещё нужно? Но это действительно не самый очевидный способ решения данной задачи.

Оффлайн Olechka555

  • Автор темы
  • Новичок
  • *
  • Сообщений: 14
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #8 : 14 Сентября 2010, 20:37:15 »
Всем спасибо) Производства найдены :)

Оффлайн alexander.pronin

  • Старожил
  • *
  • Сообщений: 2539
    • Просмотр профиля
Re: Ошибка сегментирования
« Ответ #9 : 15 Сентября 2010, 12:21:57 »
Хорошо, что производства нашлись.
Пора выходить из кризиса. ;D

 

Страница сгенерирована за 0.017 секунд. Запросов: 22.