Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/6: Рейтинг темы: голосов - 6, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
1

Работа с динамическим массивом структур

10.03.2016, 12:08. Просмотров 1117. Ответов 12
Метки нет (Все метки)

Односвязный список. Проблема (скорее всего) в строке ListPoint1[num] = pointer; Pointer использую как временный элемент, чтобы потом записать его в конкретный элемент списка ListPoint1[num].

Собственно в чём вопросы:
1. Как правильно передавать в функцию указатели (двойной или обычный), как я понимаю, если передать обычный указатель, то в main функции переменная не изменится.
2. Можно ли выделить память под конкретный элемент и не использовать вспомогательный для записи в список, например ListPoint1[num] = (list*)malloc... и тд? Если добавлю [num] в данный код, то выдает ошибку.
3. Как правильно произвести присвоение ListPoint1[num] = pointer;. Поставил брейкпоинт и посмотрел в дебаге, что записано в ListPoint1, показывает что NULL, то есть я делаю что то не так? И после завершения этой функции ( AddBegin) выдает ошибку, говорит, что я выхожу за пределы массива.

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
struct info // структура содержания информационного поля
{
    int *arrint; // массив чисел
    char arrchar[3]; // массив символов
};
 
struct list // структура списка 
{
    info elem; // информационная часть
    list *next; // ссылка следующий элемент   
};
 
 
int AddBegin(list *pointer, list **ListPoint1 /* сам список */)
{
    num = num + 1;
    int n;
    cout << "Введите количество элементов в массиве чисел: ";
    cin >> n;
    pointer = (list*)malloc(sizeof(list)); // выделение памяти под структуру
    pointer->elem.arrint = (int*)malloc(n*sizeof(int)); // выделение памяти под динамический массив 
    DataInput(pointer, n); // заполнение информационной части
    pointer->next = NULL;
    ListPoint1[num] = pointer;
    return 0;
};
 
int DataInput(list *inputpointer, int m)     // Ввод массива чисел и символов
{
    char ch;
    int i, value;
    cout << "Введенные числа могут быть только из диапазона int \n";
    for (i = 0; i < m; i++) // ввод массива чисел
    {
        cout << "ArrInt[" << i << "]=";
        cin >> value;
        inputpointer->elem.arrint[i] = value;
    }
    cout << "Массив целых чисел введен. \n \n";
    cout << "Введите три символа из диапазона char. \n";
    for (i = 0; i < 3; i++)  // ввод трех символов
    {
        cout << "ArrChar[" << i << "]=";
        cin >> ch;
        inputpointer->elem.arrchar[i] = ch;
    }
    cout << "Массив символов введен. \n\n";
    return 0;
};
Добавлено через 17 часов 7 минут
UP
Неужели никто не может пояснить хотя бы один момент?
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.03.2016, 12:08
Ответы с готовыми решениями:

Работа с динамическим массивом
Дано: динамический двумерный массив. Определить сумму всех элементов (с помощью функции, массив и...

Работа с динамическим массивом
Помогите, пожалуйста. В чем проблема? Компилирует, но выполнять не хочет. Надо вставить элемент в...

Работа с динамическим одномерным массивом
Нужно реализовать функцию void appendElements (Array, *array, int *xs, int n);, которая добавляет n...

Работа с динамическим двумерным массивом
Написал код. В двумерном массиве 5х5 находится максимальное значение каждой строки и затем...

12
87 / 87 / 80
Регистрация: 25.08.2013
Сообщений: 338
10.03.2016, 14:01 2
Для передачи в функцию двумерного массива

C++
1
2
3
4
5
6
7
8
9
int arr[5][10];
 
void func(int ptr[][10]){...} // в определении и объявлении
 
//если просто
void func(int **ptr){ 
ptr[3]; // адрес с шагом в три int, а не в три по десять int
ptr[3][2]; //ошибка
}
Добавлено через 7 минут
Если об этом
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 14:10 3
Цитата Сообщение от chstr Посмотреть сообщение
num = num + 1;
Цитата Сообщение от chstr Посмотреть сообщение
ListPoint1[num] = pointer;
Тут нужно новую память выделять под блок указателей, копировать туда старый блок, потом добавлять новый указатель.

Добавлено через 5 минут
Цитата Сообщение от chstr Посмотреть сообщение
1. Как правильно передавать в функцию указатели (двойной или обычный), как я понимаю, если передать обычный указатель, то в main функции переменная не изменится.
Смотря как этот указатель используется в функции: если значение указателя (адрес в нём) в функции не меняется, то можно передавать по значению, если меняется, то передавать по ссылке.
0
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
10.03.2016, 14:23  [ТС] 4
Цитата Сообщение от nd2 Посмотреть сообщение
Тут нужно новую память выделять под блок указателей, копировать туда старый блок, потом добавлять новый указатель.
C++
1
2
ListPoint1 = (list*)malloc(sizeof(list));
ListPoint1->elem.arrint = (int*)malloc(n*sizeof(int));
Это имеешь в виду? То есть я пытаюсь записать в указатель ListPoint1[num] = pointer, а там не выделена память?) Если да, то можно ли выделить сразу под ListPoint[num] и как это сделать
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 14:26 5
И вообще, списки так не делаются. В том и преимущество списков, что, в отличие от массивов, при добавлении нового элемента в список, не нужно память под весь список перевыделять.

Добавлено через 2 минуты
Цитата Сообщение от chstr Посмотреть сообщение
а там не выделена память?
Покажи, что передаётся в функцию как ListPoint1?
У тебя, выделена память под num указателей, ты, в функции, меняешь значение num:
Цитата Сообщение от chstr Посмотреть сообщение
num = num + 1;
Выделенная память от этого автоматически не увеличится.
0
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
10.03.2016, 14:28  [ТС] 6
У меня память под каждый отдельно выделяется и не перевыделяется) А то что есть нумерация элементов так это потому, что должна быть функция добавления после указанного элемента

num - это номер элемента списка, допустим я добавляю в начало, я увеличиваю его на 1 (получается это первый элемент списка) num - глобальная int num = 0;

Что передается и как вызывается
C++
1
2
3
list *point = NULL; 
list *ListPoint = NULL;
AddBegin(point, &ListPoint);
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 14:34 7
Цитата Сообщение от chstr Посмотреть сообщение
У меня память под каждый отдельно выделяется и не перевыделяется)
Вот это у тебя выделяется:
Цитата Сообщение от chstr Посмотреть сообщение
pointer = (list*)malloc(sizeof(list)); // выделение памяти под структуру
pointer->elem.arrint = (int*)malloc(n*sizeof(int)); // выделение памяти под динамический массив
Но у тебя ещё есть массив (блок) указателей (ListPoint1), где память под новый указатель не выделяется:
Цитата Сообщение от chstr Посмотреть сообщение
ListPoint1[num] = pointer;
0
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
10.03.2016, 14:38  [ТС] 8
Цитата Сообщение от nd2 Посмотреть сообщение
ListPoint1[num] = pointer;
Я "думал", что допустим если num = 1, то в первый элемент списка (массива структур) запишется временная структура pointer
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 14:43 9
Лучший ответ Сообщение было отмечено chstr как решение

Решение

Цитата Сообщение от chstr Посмотреть сообщение
Что передается и как вызывается
Память у тебя под указатель ListPoint не выделяется, потом обращаешься с ListPoint, как с массивом указателей:
Цитата Сообщение от chstr Посмотреть сообщение
ListPoint1[num] = pointer;
Добавлено через 2 минуты
Мой тебе совет: набери в поиске по форуму "списки" (или "список") и посмотри, как списки делаются.
1
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
10.03.2016, 14:44  [ТС] 10
А можно вот выделить с помощью malloc сразу под ListPoint[num] ? Почему компилятор не хочет воспринимать такое? Если написать ListPoint = .. всё хорошо, вроде и то и то указатели
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 14:52 11
Цитата Сообщение от chstr Посмотреть сообщение
А можно вот выделить с помощью malloc
Выделить можно (используй new, а не malloc, тут всё-таки С++, а не Си), но ты в принципе не то делаешь.
C++
1
2
3
4
    list *point = NULL;
    size_t num = 10;
    list **ListPoint = new list* [num];
    AddBegin(point, ListPoint);
И point в функцию не нужно передавать (смысла нет).
0
0 / 0 / 0
Регистрация: 03.03.2014
Сообщений: 34
10.03.2016, 14:55  [ТС] 12
Цитата Сообщение от nd2 Посмотреть сообщение
Выделить можно (используй new, а не malloc, тут всё-таки С++, а не Си), то ты в принципе не то делаешь.
Задание не выбирают) нужно именно malloc использовать
0
nd2
3404 / 2785 / 1251
Регистрация: 29.01.2016
Сообщений: 9,423
10.03.2016, 15:07 13
Цитата Сообщение от chstr Посмотреть сообщение
Задание не выбирают) нужно именно malloc использовать
Тогда, для Си есть свой форум: https://www.cyberforum.ru/c-beginners/

Добавлено через 5 минут
C
1
list **ListPoint = (list**)malloc(sizeof(list*) * num);
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.03.2016, 15:07

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Работа с матрицей, представленной динамическим массивом
Есть задание: Написать программу, которая осуществляет добавление, удаление строки или столбца в...

Работа с динамическим массивом: три варианта инициализации в отдельной функции
Не правильно выводит cout &lt;&lt; &quot;1 елемент массива: &quot; &lt;&lt; mainArray &lt;&lt; endl; В чем проблема? Спасибо....

Работа с динамическим массивом (Упорядочить его по возрастанию элементов в каждом столбце)
Дан массив L,размером n*m.Упорядочить его по возрастанию элементов в каждом столбце. Программа...

Работа с массивом структур
Есть структура: struct student { char fam; }; Объявлена: int N = 3; student *stud; stud =...


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

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

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