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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
#1

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

13.06.2014, 00:49. Просмотров 470. Ответов 18
Метки нет (Все метки)

При обращении к методу 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);
    }   
}
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.06.2014, 00:49
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Не работает вывод двумерного массива через метод класса (C++):

Метод-член класса для создания одномерного массива из отрицательных элементов двумерного динамического массива - C++
Помогите, пожалуйста, нужно разработать метод-член класса для создания одномерного массива из отрицательных элементов двумерного...

Функции двумерного массива. Транспонировать матрицу через ввод вывод функции двумерного массива. - C++
Транспонировать матрицу через ввод вывод функции двумерного массива.Сначала вывести ее,а потом провести транспонирование.

Вывод двумерного массива через указатель - C++
в пятой главе Прохоренка приведен такой фрагмент кода #include &lt;iostream&gt; using namespace std; int main() { const short ROWS =...

Вывод двумерного массива через функцию - C++
Задача - вывести двумерный массив, используя функцию. Одно условие: делать это нужно без использования указателей.

Вывод динамического двумерного массива через функцию - C++
Имею следующий код: void matrix_output (int **matrix, int N) { for (int i=0; i&lt;N; i++) { for...

Вывод двумерного массива на экран, переданного через указатель - C++
Выводит совсем не то, что нужно исправить в функции вывода ? // labrab2.12.cpp: определяет точку входа для консольного приложения. // ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
alsav22
5420 / 4816 / 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]);
           
}
1
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;        
    }   
}
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:09 #4
Цитата Сообщение от HUSTLIN Посмотреть сообщение
К сожалению не работает..(
Что, собственно, не работает? Я написал, как правильно читать и выводить строки.

Добавлено через 1 минуту
Цитата Сообщение от HUSTLIN Посмотреть сообщение
string* s;
Откуда-то std::string появились...
1
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:09  [ТС] #5
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Что, собственно, не работает?
Ввод не работает, а дальше пока что проверить не как)
0
alsav22
5420 / 4816 / 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, К сожалению не работает..(
Я же не ввод выкладывал.
1
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:16  [ТС] #7
alsav22, также после ввода первой строки - вылетает(
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:32 #8
Память выделена под str? main() покажите.
1
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:33  [ТС] #9
alsav22, в первом сообщении полный код программы
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:34 #10
Отладчиком умеете пользоваться? Ставьте остановку в inputStrings() и смотрите: инициализирован указатель или нет.

Добавлено через 38 секунд
Цитата Сообщение от HUSTLIN Посмотреть сообщение
в первом сообщении полный код программы
Увидел main().
1
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

что это значит?
0
alsav22
5420 / 4816 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
13.06.2014, 02:43 #12
Мой вариант ввода нормально работает, вылета нет. Это если сразу ввод строк выбрать. Значит причина вылета в других функциях. Что в меню выбираете, когда вылетает?
0
HUSTLIN
1 / 1 / 1
Регистрация: 19.10.2013
Сообщений: 75
13.06.2014, 02:47  [ТС] #13
alsav22,
Цитата Сообщение от alsav22 Посмотреть сообщение
Мой вариант ввода нормально работает, вылета нет. Это если сразу ввод строк выбрать. Значит причина вылета в других функциях. Что в меню выбираете, когда вылетает?
Сперва выбираю 1, т.е. ввожу количество строк, потом 2 ввод строк, и происходит вылет
0
alsav22
5420 / 4816 / 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/Правило...граммирование)
1
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 минуту
Еще возник вопрос, правильно ли описан конструктор по-умолчанию?
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.06.2014, 02:56
Привет! Вот еще темы с ответами:

Передача двумерного массива в конструктор класса - C++
Здравствуйте! Не получается передать двумерный массив как параметр конструктора. Необходимо, чтобы пользователь ввел размерность...

Создание двумерного массива объектов класса Cell - C++
начал изучать ООП, и возник вопрос с разбором программы: #define EMPTY 0x00 typedef char CellType; typedef int...

Не работает метод класса - C++
#define _CRT_SECURE_NO_WARNINGS #include &lt;iostream&gt; using namespace std; class Lines { private: char *line;

Не работает метод класса - C++
Добрый вечер. При решении задачи столкнулся с проблемой. Есть вектор контейнер, заполнен class-объектами. Нада вызвать метод con_salary(),...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
13.06.2014, 02:56
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru