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

Работа со строками и выделением памяти - C++

Восстановить пароль Регистрация
 
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
29.03.2013, 00:27     Работа со строками и выделением памяти #1
Задание написать класс строк (что-то типа String).

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
#define MAX 100
class ascii {
private:
    char* str[MAX];
    int len;
public:
    ascii(const char*);
    ~ascii();
    void Insert(int, ascii);
};
 
ascii::~ascii() {
    for(int i=0; i<=len; i++) delete str[i];
}
 
ascii::ascii(const char* in) {
    int i=0;
    while(in[i]) {
    str[i]=new char;
    *str[i]=in[i];
    i++;
    }
    len=i;
    str[len]=new char;
    str[len]='\0';
}
 
int ascii::length() {
    return len;
}
 
void ascii::show() {
    for(int i=0; i<len; i++) printf("%c",*str[i]);
}
 
void ascii::Insert(int pos, ascii A) {
    int oldlen=len;
    for(int i=0; i<A.len; i++) {
    str[i+oldlen+1]=new char;
    len++;
    }
    for(int i=0; i<A.len+1; i++) 
        str[A.len+oldlen-i]=str[oldlen-i];
    int k=0;
    for(int i=0; i<A.len; i++) 
        str[i+pos]=A.str[k++];
 
 
}
Дело в том что при работе функции Insert, программа работает неадекватно. Выдает ошибку http://www.valar.ru/gallery/0313/z.png
Что-то с динамическим выделением памяти...

Не знаю как правильно организовать все это с динамической памятью...
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
29.03.2013, 00:27     Работа со строками и выделением памяти
Посмотрите здесь:

C++ ошибка с выделением памяти
C++ Строки с выделением динамической памяти
C++ Конструктор с выделением памяти
C++ Двумерный массив с динамическим выделением памяти
Проблема с выделением памяти C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
29.03.2013, 02:49     Работа со строками и выделением памяти #2
Объект класса ascii - строка? Зачем там массив указателей на char?

Добавлено через 16 минут
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
class ascii 
{
    char* str;
    int len;
public:
    ascii(const char*);
    ~ascii();
    void Insert(int, ascii&);
    void show();
    int length();
};
 
ascii::~ascii() 
{
    delete [] str;
}
 
ascii::ascii(const char* in) 
{
    len = strlen(in);
    str = new char[len + 1];
    int i = 0, j = 0;
    while (str[i++] = in[j++]);
}
 
int ascii::length() 
{
    return len;
}
 
void ascii::show() 
{
    printf("%s", str);
}
 
void ascii::Insert(int pos, ascii &A) 
{
    len = len + A.len;
    char *p = new char[len + 1];
    
    int i;
    for (i = 0; i < pos; ++i)
        p[i] = str[i];
    
    int j = 0;
    while (A.str[j])
        p[i++] = A.str[j++];
    
    while (p[i++] = str[pos++]);
    
    delete [] str;
    str = p;
}
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 00:47  [ТС]     Работа со строками и выделением памяти #3
Спасибо, вроде бы разобрался. Однако есть один вопрос.
Я хочу сделать
C++
1
Insert(int,char*)
Я пытаюсь сделать его так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void ascii::Insert(int pos, char *in) {
    int pos2=pos;
    ascii a(in);
    this->Insert(pos2,a);
}
 
ascii::ascii(char *in) {
    len=0;
    while(in[len++]);
    str = new char[len+1];
    for(int i=0; i<len; i++)
    str[i]=in[i];
}
в 50% случаев выдает ошибку, в остальных случаях нормально работает. Почему так?
Сначала хотел написать
C++
1
2
3
void ascii::Insert(int pos, char *in) {
    this->Insert(pos,ascii(in));
}
но Так ругается еще на стадии компилирования.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:35     Работа со строками и выделением памяти #4
Цитата Сообщение от Hellko Посмотреть сообщение
в 50% случаев выдает ошибку
Какую? Тут len неверный будет:
Цитата Сообщение от Hellko Посмотреть сообщение
C++
1
2
3
4
5
6
7
ascii::ascii(char *in) {
 len=0;
 while(in[len++]);
 str = new char[len+1];
 for(int i=0; i<len; i++)
 str[i]=in[i];
}
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 01:38  [ТС]     Работа со строками и выделением памяти #5
Цитата Сообщение от alsav22 Посмотреть сообщение
Какую? Тут len неверный будет:
Ошибка уже в процессе выполнения программы, win7 просто предлагает закрыть программу, не говорит что за ошибка.
Заметил что иногда вылазят левые символы - типа всякие названия, т.е. данные берет откуда-то не оттуда.
len проверил, вроде бы верный.
пожалуй да. Исправил на
C++
1
while(in[++len]);
теперь верный
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:47     Работа со строками и выделением памяти #6
Цитата Сообщение от Hellko Посмотреть сообщение
Исправил
А здесь так исправили?
C++
1
 for(int i=0; i<len + 1; i++)
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 01:52  [ТС]     Работа со строками и выделением памяти #7
Цитата Сообщение от alsav22 Посмотреть сообщение
А здесь так исправили?
C++
1
 for(int i=0; i<len + 1; i++)
Да. Выдает верный ответ, но программа завершается так же: с ошибкой.
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 01:55     Работа со строками и выделением памяти #8
Весь код покажите.

Добавлено через 58 секунд
Место, где ошибка происходит, определили?
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 02:15  [ТС]     Работа со строками и выделением памяти #9
С ошибкой я разобрался. Компилятор ругался на присваивания в сравнении. Я хотел переделать, но переделал криво.
Спасибо за помощь
Но вопрос по перегруженой функции все же остался. Мне кажется что такой вариант какой-то не совсем верный.
C++
1
2
3
4
5
void ascii::Insert(int pos, const char *in) {
    int pos2=pos;
    ascii a(in);
    this->Insert(pos2,a);
}
Почему нельзя просто сделать так?:
C++
1
2
oid ascii::Insert(int pos, const char *in) {
    this->Insert(pos,ascii(in));
Код
ошибка: no matching function for call to 'ascii::Insert(int&, ascii)'
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 02:59     Работа со строками и выделением памяти #10
Цитата Сообщение от Hellko Посмотреть сообщение
Почему нельзя просто сделать так?:
Можно и так. А ошибку, возможно, показывает из-за того, что у вас константность в прототипе и реализации (функции или конструктора) не совпадают. Вы то так напишите, то так... А в прототипах забываете сменить константность. Проверьте соответствие...

Добавлено через 2 минуты
Хотя лучше не делать создание объекта в параметрах метода.
В какой среде делаете?

Добавлено через 5 минут
У меня (студия 10) такой код проходит без ошибок.
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 03:05  [ТС]     Работа со строками и выделением памяти #11
Цитата Сообщение от alsav22 Посмотреть сообщение
У меня (студия 10) такой код проходит без ошибок.
В Qt4. В студии 08 проверил - работает.

Добавлено через 24 секунды
Странно что qt ругается..
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 04:02     Работа со строками и выделением памяти #12
Второй метод Insert как сделан?

Добавлено через 22 минуты
Цитата Сообщение от Hellko Посмотреть сообщение
В студии 08 проверил - работает.
Добавлено через 24 секунды
Странно что qt ругается..
Не все компиляторы пропускают. Студия пропускает, mingv нет.

Добавлено через 23 минуты
Тут, в параметрах метода, создаётся безымянный временный объект, который должен быть передан в функцию по ссылке. Вообще, в классах, содержащих в полях указатели, нужно, во избежание проблем, определять конструкторы копирования и присваивания. Если бы здесь был определён конструктор копирования (для глубокого копирования), то можно было бы передавать объект в метод не по ссылке, а по значению. Тогда эта конструкция везде нормально работала бы.
Hellko
6 / 6 / 1
Регистрация: 17.11.2012
Сообщений: 65
30.03.2013, 08:10  [ТС]     Работа со строками и выделением памяти #13
Цитата Сообщение от alsav22 Посмотреть сообщение
Второй метод Insert как сделан?

Добавлено через 22 минуты

Не все компиляторы пропускают. Студия пропускает, mingv нет.

Добавлено через 23 минуты
Тут, в параметрах метода, создаётся безымянный временный объект, который должен быть передан в функцию по ссылке. Вообще, в классах, содержащих в полях указатели, нужно, во избежание проблем, определять конструкторы копирования и присваивания. Если бы здесь был определён конструктор копирования (для глубокого копирования), то можно было бы передавать объект в метод не по ссылке, а по значению. Тогда эта конструкция везде нормально работала бы.
Правильно ли я определил конструктор копирования?:
C++
1
2
3
4
ascii::ascii(const ascii &in) {
    len=in.len;
    str=in.str;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.03.2013, 18:35     Работа со строками и выделением памяти
Еще ссылки по теме:

C++ Обращение к структуре в классе с выделением памяти
Проблемы с выделением памяти C++
C++ Задача на строки с выделением памяти

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

Или воспользуйтесь поиском по форуму:
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
30.03.2013, 18:35     Работа со строками и выделением памяти #14
Цитата Сообщение от Hellko Посмотреть сообщение
Правильно ли я определил конструктор копирования?:
Нет. Так, как раз, работает конструктор копирования, заданный по умолчанию, из-за чего и проблемы. Просто копирует поля. Для указателей это будет неправильно. Нужно скопировать не сам указатель, а то на что он указывает.
Должно быть что-то подобное констуктору, который принимает указатель на строку.
Yandex
Объявления
30.03.2013, 18:35     Работа со строками и выделением памяти
Ответ Создать тему
Опции темы

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