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

Динамический массив (классов) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.92
Alexpm
3 / 3 / 0
Регистрация: 06.09.2011
Сообщений: 47
14.02.2012, 11:09     Динамический массив (классов) #1
Вот такой вопрос, почему так?

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
#include <iostream>
#include <string>
using namespace std;
 
class primer
{
public:
    primer (int _number, char _s1[])
    {
        number=_number;
        strcpy(s1, _s1);
    }
    primer()
    {
    }
    primer input(int number)
    {
        char s1[10];
        cout<<"Пример:"<<" ";
        cin.sync();
        cin.getline(s1, sizeof(s1), '\n');
        cin.sync();
        primer tmp(number, s1);
        return tmp;
    }
    void output()
    {
        cout<<number<<" "<<s1<<endl;
    }
    private:
    int number;
    char s1[10];
};
 
int dobavl(primer *mass, int n)
{
    cout<<"Сколько?"<<" "; cin>>n;
    mass=(primer*) realloc (mass, (n*sizeof(primer)));  
    for (int i=0, number=1; i<n; i++, number++)
    {
        mass[i]=mass[i].input(number);
    }
        for (int i=0; i<n; i++)
    {
        mass[i].output();
    }
    return n;
};
 
void main()
{
    setlocale(LC_ALL,"Russian");
    primer *mass=(primer*) malloc(sizeof(primer));
    int n=0;
    n=dobavl(mass, n);
}
[IMG]http://s017.***********/i411/1202/ee/9772e65b3338t.jpg[/IMG]
==============================================================
А если вывод на экран делать из отдельной функции:
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
#include <iostream>
#include <string>
using namespace std;
 
class primer
{
public:
    primer (int _number, char _s1[])
    {
        number=_number;
        strcpy(s1, _s1);
    }
    primer()
    {
    }
    primer input(int number)
    {
        char s1[10];
        cout<<"Пример:"<<" ";
        cin.sync();
        cin.getline(s1, sizeof(s1), '\n');
        cin.sync();
        primer tmp(number, s1);
        return tmp;
    }
    void output()
    {
        cout<<number<<" "<<s1<<endl;
    }
    private:
    int number;
    char s1[10];
};
 
int dobavl(primer *mass, int n)
{
    cout<<"Сколько?"<<" "; cin>>n;
    mass=(primer*) realloc (mass, (n*sizeof(primer)));  
    for (int i=0, number=1; i<n; i++, number++)
    {
        mass[i]=mass[i].input(number);
    }
    return n;
};
 
void vivod(primer mass[], int n)
{   
    for (int i=0; i<n; i++)
    {
        mass[i].output();
    }
};
 
void main()
{
    setlocale(LC_ALL,"Russian");
    primer *mass=(primer*) malloc(sizeof(primer));
    int n=0;
    n=dobavl(mass, n);
    vivod(mass, n);
}
То так:
[IMG]http://s018.***********/i519/1202/bd/180d47cabe98t.jpg[/IMG]

Как сделать правильно, чтоб работало во втором случае?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.02.2012, 11:09     Динамический массив (классов)
Посмотрите здесь:

C++ статический массив ----> динамический массив
Динамический массив C++
C++ Динамический массив
Динамический массив C++
Динамический массив C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.02.2012, 11:40     Динамический массив (классов) #2
Нельзя применять функции языка С для работы с памятью к классам, используйте std::vector.

Добавлено через 6 минут
C++
1
int dobavl(primer *mass, int n)
здесь у вас в любом случае ошибка. Вы передаёте в функцию копию указателя, и в дальнейшем работаете именно с копией. которая никак не связана с переменной mass из функции main. Правильный вариант
C++
1
int dobavl(primer *&mass, int n)
либо
C++
1
int dobavl(primer **mass, int n)
Alexpm
3 / 3 / 0
Регистрация: 06.09.2011
Сообщений: 47
14.02.2012, 11:40  [ТС]     Динамический массив (классов) #3
Я не проходил еще векторы
Если нельзя, значит задача отпадает.
Спасибо.

C++
1
int dobavl(primer *&mass, int n)
мм, а вот так всё работает)) тогда так сделаю..
еще раз спасибо..
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.02.2012, 12:55     Динамический массив (классов) #4
Цитата Сообщение от Alexpm Посмотреть сообщение
Я не проходил еще векторы
std::vector это расширяемый динамический массив. Если вам необходимо работать с памятью в ручную, используйте операторы new и delete, вместо malloc и free(функцию перераcпределения памяти(realloc) придётся писать самостоятельно).
Alexpm
3 / 3 / 0
Регистрация: 06.09.2011
Сообщений: 47
14.02.2012, 13:12  [ТС]     Динамический массив (классов) #5
Цитата Сообщение от rangerx Посмотреть сообщение
std::vector это расширяемый динамический массив. Если вам необходимо работать с памятью в ручную, используйте операторы new и delete, вместо malloc и free(функцию перераcпределения памяти(realloc) придётся писать самостоятельно).
Дак ведь malloc и relloc работают, ошибка была при передачи массива в функцию. Я понимаю, что использование их не лучший вариант, но пока что знаний не особо хватает для использования чего то другого...

New и delete у меня тоже используется. Вот возник вопрос по ним, как использовать правильно delete? Точно также как и с массивом типа int к примеру delete[] mass?
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
14.02.2012, 13:37     Динамический массив (классов) #6
Цитата Сообщение от Alexpm Посмотреть сообщение
Дак ведь malloc и relloc работают, ошибка была при передачи массива в функцию. Я понимаю, что использование их не лучший вариант, но пока что знаний не особо хватает для использования чего то другого...
Только что ответил здесь(чтобы не повторяться)
Цитата Сообщение от Alexpm Посмотреть сообщение
Вот возник вопрос по ним, как использовать правильно delete? Точно также как и с массивом типа int к примеру delete[] mass?
Да.
Yandex
Объявления
14.02.2012, 13:37     Динамический массив (классов)
Ответ Создать тему
Опции темы

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