Модераторы: bsa
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Ошибка с памятю, вылетает программа, помогите испр 
V
    Опции темы
Killer_13
Дата 19.11.2010, 13:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Здравтсв.
Вот такая программка, она пока не вся готова, но уже должна работать.

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

Вылетает в строке 28 *.cpp

Если оч глупая ошибка - прошу не пинать, а то запутался с этими звездочками.. smilesmilesmile

main

Код

//-------------------------------------------------------------------------------
// Testprogramm 0 fьr die Klasse TextObject
//
// Prof. Dr.-Ing. B. Lang
// (c) FH Osnabrueck
// OOP-Praktikum
//-------------------------------------------------------------------------------
#include <iostream>
using namespace std;
#include "TextObject.h"

int main() {
    try {
        TextObject t("test.txt");
        cout<<t[2][2]<<endl;
        
        //t.SetFilename("P5_Test0.txt");
//
//        // Kreuz in die Datei einschreiben
//        for (int i = 0; i < 10; i++) {
//            t[i][i] = '*';
//        }
//        for (int i = 0; i < 10; i++) {
//            t[i][10 - i - 1] = '*';
//        }
//
//        // Parabeln in die Datei einschreiben
//        for (int i = 0; i < 100; i++) {
//            int j = i - 50;
//            t[j * j][i] = 'x';
//            t[i][j * j] = 'o';
//        }
//
//        // Info zum Text
//        cout << "Der Text besteht aus " << t << " Zeilen" << endl;
//        for (int i = 0; i < t; i++) {
//            if (0 != int(t[i])) {
//                cout << "  Zeile " << i << " besteht aus " << int(t[i]) << " Zeichen" << endl;
//            }
//        }

    } catch (TextObject::OutOfBounds) {
        cerr << "Feldgrenzenverletzung" << endl;
    } catch (...) {
        cerr << "Unbekannte Ausnahme" << endl;
    }
}




*.cpp

Код

using namespace std;
#include "TextObject.h"
#include <fstream>
#include <iostream>
#include <iomanip>

TextObject::TextObject(char* Filename) {

    ifstream datei(Filename);
    string row;

    filename = Filename;
    lines = 0;
    size = 0;
    t=NULL;

    TextLine *newLine;
    if (!datei.is_open())
        cerr << "Datei konnte nicht zum lesen nicht geoeffnet werden!" << endl;

    while (!datei.eof()) {

        getline(datei, row, '\n');
        char* line = const_cast<char*> (row.c_str());
        newLine = new TextLine(line);
        if (lines == 0)
        {
           ///////////////////////////////////////////////////////*t = newLine;
            expand(50);
        } else if (size <= lines)
            expand(size);
        t[lines] = newLine;
        ++lines;
    }
}

TextObject::TextLine::TextLine(char* tl) {
    columns = static_cast<string> (tl).length();
    l=new char[columns+1];
    for (int i = 0; i < columns; ++i)
        tl[i] = l[i];
    l[columns]='\0';
}

void TextObject::expand(int s) {

    size += s;
    TextLine **array = new TextLine*[size];
    for (int i = 0; i <= lines; ++i)
        array[i] = t[i];
    for (int i = lines; i <= size; ++i)
        array[i] = NULL;


    delete []t;
    t = array;
}

TextObject::TextLine& TextObject::operator [](int line) {

    return *t[line];
}

char& TextObject::TextLine::operator [](int column) {

        if (column < 0)
            throw TextObject::OutOfBounds();
        else if (column > columns) {
                    char * tempArr = new char[column + 1];
            for (int i = 0; i <= columns; ++i)
                tempArr[i] = l[i];
            for (int i = columns; i <= column; ++i)
                tempArr[i] = ' ';
            tempArr[column + 1] = '\0';
            delete[]l;
            l = tempArr;
        }
        return l[column];
    
}

TextObject::~TextObject() {

}

TextObject::TextLine::~TextLine() {
}



*.h

Код

//-------------------------------------------------------------------------------
// Klasse TextObject zur Manipulation von Textdateien mittels
// zweidimensionalem Feldzugriff
//
// Prof. Dr.-Ing. B. Lang
// (c) FH Osnabrueck
// OOP-Praktikum
//-------------------------------------------------------------------------------
#ifndef _TextObject_h_
#define _TextObject_h_

class TextObject 
{
 public:
  class TextLine;
 private:
  TextLine **t;
  int size;
  int lines;
  char* filename;
  void expand(int s);
 public:
  class OutOfBounds {};
  TextObject();
  TextObject(char* Filename);
  TextObject(TextObject&);
  ~TextObject();
  TextObject& operator= (TextObject&);
  void SetFilename(char* Filename);
  TextLine& operator [] (int line);
  operator int () const { return lines; }
  int MaxColumns () const;
};

class TextObject::TextLine {
  char* l;
  int   columns;
 public:
  TextLine();
  TextLine(char* tl);
  TextLine(TextLine&);
  ~TextLine();
  TextLine& operator= (TextLine&);
  char& operator [] (int column);
  operator int () const { return columns; }
  operator const char* () const { return l; }
};

#endif



пасиб.

Это сообщение отредактировал(а) Killer_13 - 19.11.2010, 13:44
PM MAIL   Вверх
bsa
Дата 19.11.2010, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



Во-первых, у тебя строка 28 закомментирована. Как тогда вылетает?
Во-вторых, если ее раскомментировать, то будет вылетать всегда, так как t - это "указатель в никуда". А присвоить "нукуда" значение нельзя.

Почитай тут про указатели.
PM   Вверх
Killer_13
Дата 20.11.2010, 03:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Брррр, потому и закоментировал. smile
Запутался чуток с указателями, я вроде зануляю его в начале... или. Ну 0 так я ему хочу присвоить адрес, чтоб он не показывал в никуда...
Ща ругать будете... :(:(:
PM MAIL   Вверх
bsa
Дата 22.11.2010, 01:03 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 85
Всего: 196



NULL - это и есть "в никуда". А если не инициализировать, то "непонятно куда". Разницу чувствуешь?

Итак. раз ты пишешь на С++, то я рекомендую тебе обратить свой взор на std::vector и std::string. Они бы решили твою проблему гораздо более красиво. Если же по заданию их использовать нельзя, то тогда тебе необходимо понять, что такое у тебя t. Это указатель на указатель. Т.е. предполагается, что он будет указывать на массив указателей на TextLine. Соответственно, прежде чем разыменовывать этот указатель, ты должен выделить память под массив... Читай статью, на которую я дал тебе ссылку выше.
PM   Вверх
Killer_13
Дата 22.11.2010, 01:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 12.1.2008
Где: Germany

Репутация: 1
Всего: 1



Пасиб большое. smile
Разобрался, прекрасно понимаю, что со string эт можно более красиво сделать, но.. в задании стоит char :(:(:(..
2 дня посидели разгреблись, нашли ошибки и так д.. smile
Все работает, на счет указателя на массив указателей прекрасно понимаю.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Для новичков | Следующая тема »


 




[ Время генерации скрипта: 0.0578 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.