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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 18, средняя оценка - 4.94
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
#1

Выделение динамической памяти C++ - C++

27.11.2012, 01:33. Просмотров 2320. Ответов 42
Метки нет (Все метки)

Всем доброго времени суток. Вот столкнулся с проблемой и пока что не приходит ничего интересного по поводу её решения. есть у меня метод, который выделяет память + 1 в зависимости от введённого размера пользователем, а т.е в классе метод для выделения, а в воде cin с вопросом введите длину строку. например он ввёл размерность 5, метод выделяет ещё + 1 (для \0) а потом вызывается метод ввода строки, если он введёт большее кол-во символов в строке, то вылет. как осуществить проверку? например он ввёл размерность 5, а ввёл 7 и ему выводилось на экран заново cin>> размерность и строка. Вот сам код. Help:

методы:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
String(int i)
    {
        string = new char[i + 1];
    }
    String(char * s)
    {
        strcpy(string, s);
    }
    ~String()
    {
        delete [] string;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
воид:

C++
1
2
3
4
5
6
7
8
9
10
11
else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.11.2012, 01:33
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Выделение динамической памяти C++ (C++):

Выделение динамической памяти - C++
Добрый вечер. Помогите разобраться пожалуйста! Суть такова: есть файл, в нем есть данные, мне надо их оттуда считать и вывести на...

Выделение динамической памяти - C++
Доброго времени суток! я начинающий программист, столкнулась с такой проблемой: выделяю память под динамический массив, например ...

Выделение динамической памяти - C++
Чем int *List = new int; delete List; отличается от обычного массива (int List) ? Нет, я понимаю, что создал динамическую...

Выделение динамической памяти - C++
Всем привет. Возникла задача, в которой мне необходимо знать как выделяется динамическая память средсвами new/delete. А именно,...

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

Выделение динамической памяти - C++
Доброго времени суток! Возник такой вопрос, переделываю программу, где параметры матрицы задавались константами на выделение динамический...

42
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:13  [ТС] #16
Цитата Сообщение от Vourhey Посмотреть сообщение
Я вижу, что это. Я не понимаю, что этот код пытается сделать. А ты объяснить не можешь. Когда ты сможешь объяснить мне, что делает этот код конструктора, ты сам увидишь ошибку. Либо я увижу, что действительно не понял
что я хочу сделать? - конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. код конструктора выделяет память для этой строки и записывает, то что ввёл пользователь.
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:17 #17
Цитата Сообщение от owned Посмотреть сообщение
и инициализирует её строкой, полученной от пользователя.
Тогда объясни, зачем тебе выделять память на указателе пришедшем от пользователя? Этот указатель от пользователя. Он уже нас троку какую-то указывать должен. Зачем для него еще new вызывать?
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:20  [ТС] #18
Vourhey, не знаю, я запутался...
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:22 #19
Цитата Сообщение от owned Посмотреть сообщение
не знаю
Не знаешь, то зачем писал этот код? Если я не знаю, зачем нужен какой-то код, я его либо сразу не пишу, либо удаляю. Разберись с кодом. Код с неизвестным предназначением - удали.
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:26  [ТС] #20
Vourhey, хех, просто помоги) нужен конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя.
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:29 #21
Я же прямым текстом сказал про код, предназначение которого я не понимаю. Повторю, я не понимаю, зачем выделять еще раз память для указателя, который и так уже указывает на строку, которая пришла от пользователя. Больше ничего не скажу, пусть кто-нибудь другой код пишет
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:30  [ТС] #22
Vourhey, забей на ток код, будто его нет. я запутался уже... помоги пожалуйста
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:35 #23
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
#include<iostream>
#include<cstring>
 
class String
{
private:
    char str[256];
 
public:
    String(const char *s)
    {
        strncpy(str, s, 256);
    }
 
    void Print()
    {
        std::cout<<str<<std::endl;
    }
};
 
int main()
{
    String object("test string");
    object.Print();
}
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:47  [ТС] #24
хах, я наверное до такой степени тупой, что ...

ошибка на этапе выполнения. вот код:

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
    char * ss[256];
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(const char * s) // Создание строки и инициализация.
    {
          strncpy(*ss, s, 256);
    }
    ~String()
    {
        delete [] string;
        delete [] ss;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Show()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<ss<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str("OwNeD");
                str.Show();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,019
27.11.2012, 03:48 #25
C++
1
2
char ss[256];
strncpy(ss, s, 256);
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:51  [ТС] #26
ой, кое что не разглядел, сек..

Добавлено через 2 минуты
Конструктор отрабатывает, а потом ошибка.. вот текущий код:

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
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
/*Разработать класс String, который в дальнейшем будет использоваться для работы со строками.
Класс должен содержать: 
* конструктор по умолчанию, позволяющий создать строку длиной 80 символов; 
* конструктор, позволяющий создавать строку произвольного размера; 
* конструктор, который создаёт строку и инициализирует её строкой, полученной от пользователя. 
класс должен содержать методы для ввода строк с клавиатуры и вывода строк на экран.*/
 
#include <stdio.h>
#include <conio.h>
#include <iostream>
#include <string.h>
#include <windows.h>
using namespace std;
 
HANDLE H = GetStdHandle(STD_OUTPUT_HANDLE);
 
class String
{
private:
    char * string;
    char ss[256];
public:
    String() // По умолчанию.
    {
        string = new char [81]; 
    }
    String(int i) // Позволяет создавать строку произвольного размера.
    {
        string = new char[i + 1];
    }
    String(const char * s)
    {
          strncpy(ss, s, 256);
    }
    ~String()
    {
        delete [] string;
        delete [] ss;
    }
    void Initialization()
    {
        cout<<"Введите строку: ";
        gets(string);
        char * buffer;
        buffer = gets(string);
        cout<<endl;
 
        ChoiseShowString();
    }
    void ChoiseShowString()
    {
        int choiseshowstring;
        cout<<"Показать строку?\n\n"
            <<"1 - Да. \n"
            <<"0 - Выйти.\n\n";
        cout<<"Введите ваш выбор: ";
        cin>>choiseshowstring;
        cout<<endl;
        if(choiseshowstring == 0) exit(0);
        if(choiseshowstring == 1) ShowString();
        else
        {
            system("cls");
            cout<<"Не верный ввод, повторите выбор!\n\n";
            ChoiseShowString();
        }
    }
    void ShowString()
    {
        OemToAnsi(string,string);
        cout<<"Строка: "<<string<<endl<<endl;
    }
    void Show()
    {
        OemToAnsi(ss,ss);
        cout<<"Строка: "<<ss<<endl<<endl;
    }
};
 
void Stand(int x, int y, int key, char*str)
{
    CONSOLE_CURSOR_INFO ci; ci.bVisible=0; ci.dwSize=100; SetConsoleCursorInfo(H,&ci);
    COORD c;
    c.X = x; c.Y = y;
    SetConsoleCursorPosition(H,c);
    SetConsoleTextAttribute(H,key);
    cout<<str<<"\n";
}
 
void main()
{
    system("mode con cols=30 lines=10");
    system("title String");
    setlocale(LC_ALL,"RUS");
 
    String s;
 
    Stand(5,1,10,"FAQ о задании \"String\"");
    Stand(5,3,2,"Произвольная строка");
    Stand(5,5,2,"Создать строку");
    Stand(5,7,2,"Выход");
 
    int key; 
    int punkt = 1;
 
    while(1)
    {
        key = getch();
        if(key == 80)
        {
            if(punkt < 4)
            {
                punkt++;
                if(punkt == 2)
                {
                    Stand(5,1,2,"FAQ о задании \"String\"");
                    Stand(5,3,10,"Произвольная строка");
                }
                else if(punkt == 3)
                {
                    Stand(5,3,2,"Произвольная строка");
                    Stand(5,5,10,"Создать строку");
                }
                else if(punkt == 4)
                {
                    Stand(5,5,2,"Создать строку");
                    Stand(5,7,10,"Выход");
                }
            }
        }
        else if(key == 72)
        {
            if(punkt > 1)
            {
                punkt--;
                if(punkt == 3)
                {
                    Stand(5,5,10,"Создать строку");
                    Stand(5,7,2,"Выход");
                }
                else if(punkt == 2)
                {
                    Stand(5,3,10,"Произвольная строка");
                    Stand(5,5,2,"Создать строку");
                }
                else if(punkt == 1)
                {
                    Stand(5,1,10,"FAQ о задании \"String\"");
                    Stand(5,3,2,"Произвольная строка");
                }
            }
        }
        else if(key == 13)
        {
            system("cls");
            SetConsoleTextAttribute(H,15);
            if(punkt == 1)
            {
                system("title FAQ о задании \"String\"");
                system("mode con cols=43 lines=23");
                SetConsoleTextAttribute(H,10);
                cout<<"\n  Разработать класс String, который в \n  дальнейшем будет использоваться для \n\t работы со строками.\n\n";
                SetConsoleTextAttribute(H,14);
                cout<<"\tКласс должен содержать:\n\n";
                SetConsoleTextAttribute(H,15);
                cout<<" - конструктор по умолчанию, позволяющий \n   создать строку длиной 80 символов.\n\n"
                    <<"      - конструктор, позволяющий \n  создавать строку произвольного размера.\n\n"
                    <<"  - конструктор, который создаёт строку и \n  инициализирует её строкой, полученной от \t\tпользователя.\n\n"
                    <<"   - методы для ввода строк с клавиатуры \n        и вывода строк на экран.\n\n";
                SetConsoleTextAttribute(H,11);
            }
            else if(punkt == 2) 
            {
                system("title String произв. размера");
                system("mode con cols=43 lines=30");
                int c;
                cout<<"Введите размер символьного массива: ";
                cin>>c;
                cout<<endl;
                String b(c);
                b.Initialization();
            }
            else if(punkt == 3) 
            {
                system("title Создание и инициализация строки");
                system("mode con cols=43 lines=30");
                String str("OwNeD");
                str.Show();
            }
            else if(punkt == 4)
            {
                DWORD size=1024;
                char buf[1024];
                GetUserNameA(buf, &size); 
                SetConsoleTextAttribute(H,11);
                system("mode con cols=30 lines=6");
                SetConsoleTextAttribute(H,14);
                system("title До свидания!");
                cout<<"   До свидания ув. "<<buf<<endl<<endl<<"   ";
                SetConsoleTextAttribute(H,11);
            }
            else 
            {
                cout<<"До свидания!\n\n";
                getch();
            }
            exit(0);
        }
    }
 
}
0
MrGluck
Модератор
Эксперт CЭксперт С++
7278 / 4439 / 650
Регистрация: 29.11.2010
Сообщений: 12,019
27.11.2012, 03:53 #27
C++
1
delete [] ss;
Это не нужно
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:53 #28
C++
1
        delete [] ss;
Что это? Зачем это? Зачем тебе в классе буфер и указатель одновременно?
0
owned
2 / 2 / 0
Регистрация: 25.11.2012
Сообщений: 76
27.11.2012, 03:55  [ТС] #29
Vourhey,
MrGluck, а почему не нужно? нужно же очищать память, которую выделял

Добавлено через 49 секунд
убрал delete [] ss; и всё равно ошибка на этапе выполнения
0
Vourhey
Почетный модератор
6482 / 2256 / 123
Регистрация: 29.07.2006
Сообщений: 12,635
27.11.2012, 03:56 #30
Цитата Сообщение от owned Посмотреть сообщение
нужно же очищать память, которую выделял
А ты ее не выделял.

Добавлено через 29 секунд
owned, определись, с чем ты в классе работаешь, либо с указателем, либо с массивом, что ты все в кучу свалил...
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.11.2012, 03:56
Привет! Вот еще темы с ответами:

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

Выделение и использование динамической памяти - C++
Вопрос такого плана, допустим я отвёл в теле метода память под массив q int q = new int ; далее я планирую некий эвент на некий момент...

Выделение и очистка динамической памяти - C++
Добрый день. Никак не могу найти информацию по следующему вопросу. Допустим создаем динамический массив строк. char** mass=new...

Освобождение и выделение динамической памяти - C++
Привет народ, такой вопрос: Допустим в main, указателю выделил память, всё разумеется нормально, читаю пишу всё ок, потом передал этот...


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

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

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