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

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

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

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

14.02.2012, 11:09. Просмотров 1569. Ответов 5
Метки нет (Все метки)

Вот такой вопрос, почему так?

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);
}

==============================================================
А если вывод на экран делать из отдельной функции:
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);
}
То так:


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

Динамический массив классов - C++
Добрый день. Прошу помощи, совета или т.п. Есть класс, который содержит динамический массив на тип double. Вот часть класса: ...

Как создать класс контейнер-динамический массив и поместить туда объекты других классов? - C++
Какой тип массива использовать тип базового класса или наследников?

Можно ли в классе создавать массив переменной длинны. Например динамический массив? - C++
Динамические массивы привлекают больше. :)

Написать функцию принимающую массив и возвращающую указатель на динамический массив - C++
Написать функцию принимающую массив и возвращающую указатель на динамический массив содержащий первые n нaибольших чисел. Как сделать...

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

Заполнить динамический массив из файла и записать массив обратно в файл - C++
Подскажите пожалуйста функцию которая будет заполнять Динамический массив из файла и обратную которая этот массив запишет в файл=)

5
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
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)
1
Alexpm
3 / 3 / 0
Регистрация: 06.09.2011
Сообщений: 47
14.02.2012, 11:40  [ТС] #3
Я не проходил еще векторы
Если нельзя, значит задача отпадает.
Спасибо.

C++
1
int dobavl(primer *&mass, int n)
мм, а вот так всё работает)) тогда так сделаю..
еще раз спасибо..
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
14.02.2012, 12:55 #4
Цитата Сообщение от Alexpm Посмотреть сообщение
Я не проходил еще векторы
std::vector это расширяемый динамический массив. Если вам необходимо работать с памятью в ручную, используйте операторы new и delete, вместо malloc и free(функцию перераcпределения памяти(realloc) придётся писать самостоятельно).
0
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?
0
rangerx
1935 / 1544 / 141
Регистрация: 31.05.2009
Сообщений: 2,913
14.02.2012, 13:37 #6
Цитата Сообщение от Alexpm Посмотреть сообщение
Дак ведь malloc и relloc работают, ошибка была при передачи массива в функцию. Я понимаю, что использование их не лучший вариант, но пока что знаний не особо хватает для использования чего то другого...
Только что ответил здесь(чтобы не повторяться)
Цитата Сообщение от Alexpm Посмотреть сообщение
Вот возник вопрос по ним, как использовать правильно delete? Точно также как и с массивом типа int к примеру delete[] mass?
Да.
0
14.02.2012, 13:37
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.02.2012, 13:37
Привет! Вот еще темы с ответами:

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

Как преобразовать массив в динамический? Массив вычисляет сумму элементов каждой диагонали матрицы - C++
Ошибка : Вызвано исключение по адресу 0x00BB2F4F в Проект6.exe: 0xC0000005: нарушение прав доступа при чтении по адресу 0xFDFDFE05. #...

Создать динамический массив (Если чётных чисел больше, то массив должен быть укорочен на 2 элемента) - C++
Создать динамический массив из 8 случайных целых чисел из отрезка и вывести его на экран . Если в массиве чётных чисел оказалось...

Массив и память. Как создать динамический массив? - C++
не могу исправить ошибки. И нужен динамический массив я что-то попробовала для его создания но ничего не вышло #include &quot;stdafx.h&quot; ...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

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