Форум программистов, компьютерный форум CyberForum.ru

Не работает вывод двумерного массива через метод класса - C++

Восстановить пароль Регистрация
 
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 00:49     Не работает вывод двумерного массива через метод класса #1
При обращении к методу getStringSymbol и getAllStrings прога вылетает, помогите пожалуйста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
#include "stdafx.h"
#include "iostream"
#include "string.h"
#include "stdio.h"
#include "locale"
 
using std::cout;
using std::cin;
 
//---------------------
// Объявление класса
//---------------------
class CStrings
{
  private: 
      int size;
      char **str;
 
  public:
      CStrings();
      CStrings(int rows);
 
      void  inputStrings();       
      void  getString(int row);
      void  getStringSymbol(int row, int index);
      void  getAllStrings();
      int   getSize(){return size;}
      ~CStrings();
};
 
//---------------------
// Функции
//---------------------
int Menus(void);
void stringsAmount(CStrings &st);
void inputStrings(CStrings &st);
void outputStrings(CStrings &st);
void outputSymbol(CStrings &st);
 
//---------------------
// Описание ф-ций класса
//---------------------
 
CStrings::CStrings()
{
    size = 1;
    str = new char* [size]; // Кол-во строк
      for (int i = 0; i < size; i++)
          str[i] = new char [80];   
}
 
CStrings::CStrings(int rows)
{
    size = rows;
    str = new char* [size]; // Кол-во строк
    for (int i = 0; i < size; i++)
    {
       str[i] = new char [80];      
    }
}
 
CStrings::~CStrings()
{   
    for(int i = 0; i < size; i++)
    {
        delete [] str[i];
    }
    delete [] str;
}
 
void CStrings::inputStrings()
{
    cin.ignore(100, '\n');
    
    try
    {
        for(int i = 0; i < getSize(); i++)
        {
            char *s = new char[80];
            cin.getline(s, 80);         
        }
    }
    catch(char* exception)
    {
        cout << exception;
    }
}
 
void CStrings::getString(int row)
{
    for(int i = 0; i < 80; i++)
    printf("Строка №%d\n%c", row, this->str[row][i]);   
    printf("\n");
}
 
void CStrings::getStringSymbol(int row, int index)
{
    printf("Строка №%d, Символ №%d          -   %c\n", row+1, index+1, this->str[row][index];
}
 
void CStrings::getAllStrings()
{
    for(int i = 0; i < this->getSize(); i++)
        for(int j = 0; j < 80; j++)
        {
            printf("%c\n", this->str[i][j]);
        }   
}
 
 
void _tmain(int argc, _TCHAR* argv[])
{   
    setlocale(LC_ALL, "rus");
    CStrings st;
 
    while (true)
    {
        std::cout << st.getSize();
        switch(Menus())
        {
        case 1: stringsAmount(st); break;
        case 2: inputStrings(st); break;
        case 3: outputStrings(st); break;
        case 6: outputSymbol(st); break;
        case 8: exit(0);
        }
    }
}
 
//---------------------
// Описание функций
//---------------------
void stringsAmount(CStrings &st)
{
    int number_of_strings;
    printf("Введите количество строк: ");
    std::cin >> number_of_strings;
    st = CStrings(number_of_strings);
    //st->setMaxStrings(number_of_strings); 
}
 
void inputStrings(CStrings &st) {st.inputStrings(); }
void outputStrings(CStrings &st) {st.getAllStrings(); }
 
void outputSymbol(CStrings &st)
{
    int r=0, ind=0;
    std::cout << "Введите номер строки и индекс через ',':   ";
    scanf_s("%d%*c%d", &r, &ind); cout << '\n';
    st.getStringSymbol(r-1, ind-1);
}
 
int Menus(void)
{
    int choice;
    std::cout << "1. Введите количество строк\n2. Введите строки\n3. Вывести все строки\n4. Поэлементное слияние строк\n";
    std::cout << "5. Слияние двух строк с искл. повт. элем.\n6. Вывод элем. строки по индексу\n7. Вывод всех строк\n8. Выход\n";
    std::cin >> choice;
    return choice;
}
Добавлено через 45 минут
Понял что ввод не верный, попробовал сделать так, тоже вылетает
C++
1
2
3
4
5
6
7
8
void CStrings::inputStrings()
{   
    for(int i = 0; i < this->getSize(); i++)
    {       
        //gets_s(&str[i][0], 80);
        cin.getline(&str[i][0], 80);
    }   
}
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 01:42     Не работает вывод двумерного массива через метод класса #2
C++
1
2
3
4
5
6
7
8
void CStrings::inputStrings()
{   
    for(int i = 0; i < this->getSize(); i++)
    {       
        //gets_s(&str[i][0], 80);
        cin.getline(str[i], 80);
    }   
}
Добавлено через 3 минуты
C++
1
2
3
4
5
6
void CStrings::getAllStrings()
{
    for(int i = 0; i < this->getSize(); i++)
        printf("%s\n", this->str[i]);
           
}
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 01:54  [ТС]     Не работает вывод двумерного массива через метод класса #3
alsav22, К сожалению не работает..(

Добавлено через 4 минуты
Решил сделать так, вылет из-за копирования, в чем может быть ошибка?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
void CStrings::inputStrings()
{   
    cin.ignore(100, '\n');
    for(int i = 0; i < this->getSize(); i++)
    {       
        string* s;      
        s = new string [80];
        getline(cin, *s);
        const char* c = new char[s->length()];
        c = s->c_str();
        strcpy_s(str[i], strlen(c)+1, c);
        delete [] s;        
    }   
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:09     Не работает вывод двумерного массива через метод класса #4
Цитата Сообщение от HUSTLIN Посмотреть сообщение
К сожалению не работает..(
Что, собственно, не работает? Я написал, как правильно читать и выводить строки.

Добавлено через 1 минуту
Цитата Сообщение от HUSTLIN Посмотреть сообщение
string* s;
Откуда-то std::string появились...
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:09  [ТС]     Не работает вывод двумерного массива через метод класса #5
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Что, собственно, не работает?
Ввод не работает, а дальше пока что проверить не как)
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:15     Не работает вывод двумерного массива через метод класса #6
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
void CStrings::inputStrings()
{
    cin.ignore(100, '\n');
    
    try
    {
        for(int i = 0; i < getSize(); i++)
        {
            //char *s = new char[80];
            cin.getline(str[i], 80);         
        }
    }
    catch(char* exception)
    {
        cout << exception;
    }
}
Добавлено через 1 минуту
Цитата Сообщение от HUSTLIN Посмотреть сообщение
Ввод не работает, а дальше пока что проверить не как)
Так и писать нужно, а не так (в ответ на код):
Цитата Сообщение от HUSTLIN Посмотреть сообщение
alsav22, К сожалению не работает..(
Я же не ввод выкладывал.
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:16  [ТС]     Не работает вывод двумерного массива через метод класса #7
alsav22, также после ввода первой строки - вылетает(
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:32     Не работает вывод двумерного массива через метод класса #8
Память выделена под str? main() покажите.
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:33  [ТС]     Не работает вывод двумерного массива через метод класса #9
alsav22, в первом сообщении полный код программы
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:34     Не работает вывод двумерного массива через метод класса #10
Отладчиком умеете пользоваться? Ставьте остановку в inputStrings() и смотрите: инициализирован указатель или нет.

Добавлено через 38 секунд
Цитата Сообщение от HUSTLIN Посмотреть сообщение
в первом сообщении полный код программы
Увидел main().
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:42  [ТС]     Не работает вывод двумерного массива через метод класса #11
alsav22, в watch`e поставил Name на str, в поле Value написано - str CXX0069: Error: variable needs stack frame

что это значит?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:43     Не работает вывод двумерного массива через метод класса #12
Мой вариант ввода нормально работает, вылета нет. Это если сразу ввод строк выбрать. Значит причина вылета в других функциях. Что в меню выбираете, когда вылетает?
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:47  [ТС]     Не работает вывод двумерного массива через метод класса #13
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Мой вариант ввода нормально работает, вылета нет. Это если сразу ввод строк выбрать. Значит причина вылета в других функциях. Что в меню выбираете, когда вылетает?
Сперва выбираю 1, т.е. ввожу количество строк, потом 2 ввод строк, и происходит вылет
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:48     Не работает вывод двумерного массива через метод класса #14
Сообщение было отмечено автором темы, экспертом или модератором как ответ
В stringsAmount() есть присваивание:
C++
1
st = CStrings(number_of_strings);
Значит нужен явный оператор присваивания, а значит и явный конструктор копирования.
http://ru.wikipedia.org/wiki/Правило...граммирование)
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:56  [ТС]     Не работает вывод двумерного массива через метод класса #15
alsav22, Написал оператор копирования
C++
1
2
3
4
5
6
7
8
9
10
11
CStrings::CStrings(CStrings &st)
{
    size = st.getSize();
    str = new char* [size];
    for (int i = 0; i < size; i++)
    {
       str[i] = new char [80];
       for(int j = 0; j < 80; j++)
          str[i][j] = st.str[i][j];
    }
}
Что еще нужно сделать?

Добавлено через 1 минуту
Еще возник вопрос, правильно ли описан конструктор по-умолчанию?
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:58     Не работает вывод двумерного массива через метод класса #16
Цитата Сообщение от HUSTLIN Посмотреть сообщение
Что еще нужно сделать?
...
Цитата Сообщение от alsav22 Посмотреть сообщение
Значит нужен явный оператор присваивания,
Добавлено через 2 минуты
Цитата Сообщение от HUSTLIN Посмотреть сообщение
Еще возник вопрос, правильно ли описан конструктор по-умолчанию?
Ошибок там нет.
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 03:10  [ТС]     Не работает вывод двумерного массива через метод класса #17
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Значит нужен явный оператор присваивания
Не знаю правильно ли, но вот:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
CStrings & operator = (const CStrings &st)
      {
        if (this != &st) 
        {
            this->size = st.size;
            str = new char* [size];
            for (int i = 0; i < size; i++)
            {
               str[i] = new char [80];
               for(int j = 0; j < 80; j++)
                  this->str[i][j] = st.str[i][j];
            }       
        } 
        return *this;
      }
Добавлено через 1 минуту
При вводе не вылетает, но не работает вывод

Добавлено через 2 минуты
Вывод символа строки по индексу getStringSymbol() работает
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 03:27     Не работает вывод двумерного массива через метод класса #18
Цитата Сообщение от HUSTLIN Посмотреть сообщение
Не знаю правильно ли, но вот:
Оссобождение старой памяти (как в деструкторе) нужно сделать.

Добавлено через 2 минуты
Цитата Сообщение от HUSTLIN Посмотреть сообщение
но не работает вывод
Вывод исправили?
C++
1
2
3
4
5
void CStrings::getAllStrings()
{
    for(int i = 0; i < this->getSize(); i++)
        printf("%s\n", this->str[i]);
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 03:30     Не работает вывод двумерного массива через метод класса
Еще ссылки по теме:

C++ Не работает метод класса
C++ Не работает метод класса
C++ Ввод/вывод, метод класса

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 03:30  [ТС]     Не работает вывод двумерного массива через метод класса #19
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Вывод исправили?
Да, теперь работает)) Большое спасибо, Вы меня здорово выручили)
Yandex
Объявления
13.06.2014, 03:30     Не работает вывод двумерного массива через метод класса
Ответ Создать тему
Опции темы

Текущее время: 09:40. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru