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

Работа с массивом структур в функции через указатель на этот массив

28.02.2017, 20:05. Просмотров 533. Ответов 2
Метки нет (Все метки)

Добрый вечер. Имеется следующая задача:
"Разработайте программу, сохраняющую записи (порядковый номер ввода, число с плавающей точкой и строку длиной до 30 символов). Управление данными осуществляется с клавиатуры: ввод новой записи по заданному номеру/числу/строке, сортировка по номеру/числу/строкам."

Вот код, который я пока что написал:
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
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
struct registr{
    int number;
    double numeral;
    char name[30];
};
 
void add(registr* reg_pointer, int* counter)
{
    *counter += 1;
    reg_pointer = (registr*)realloc(reg_pointer,*counter*sizeof(registr));
    printf("Enter the %d register(<numeral> <string>\n", *counter);
    scanf("%lf %s",&reg_pointer[*counter-1].numeral,reg_pointer[*counter-1].name);
}
 
int main()
{
 
    int counter = 1;
    int option_number;
    registr journal[0];
    printf("%d\n",sizeof(registr) );
    printf("Enter the %d register(<numeral> <string>)\n", counter);
    scanf("%lf %s",&journal[0].numeral,journal[0].name);
    journal[0].number = counter;
 
    while(true)
    {
        system("cls");
        printf("Choose option:\n1.Add new register\n2.Remove register\n3.Sort registers\n4.Quit\n");
        scanf("%d",&option_number);
        switch(option_number)
        {
            case 1: add(journal,&counter);break;
            case 2: break;
            case 3: break;
            case 4: 
            {
                printf("%d %lf %s",journal[1].number,journal[1].numeral,journal[1].name);
                getch();
            }
        }
    }
    return 0;
}
Предполагается, что в функции add я добавляю памяти под новый элемент массива и заполняю его введенными с консоли значениями... Однако, разумеется, что-то идет не так и во время работы программы выскакивает ошибка: "Инструкция по такому-то адресу обратилась к памяти по такому-то адресу. Память не может быть written."
Был бы крайне признателен помощи.
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.02.2017, 20:05
Ответы с готовыми решениями:

Массив структур. Работа с массивом через функции
Здравствуйте! Дано задание: 1) создать массив структур 2) заполнить его через ф-цию 3) вывести...

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

Работа с двухмерным динамическим массивом через указатель - исправить код
Натупил здесь наверное сильно, подскажите ребят, а то долго уже сиджу над этим... Где ошибки?...

Ввод в массив структур через указатель на структуру
Доброго времени суток. Такая вот проблема... После ввода мне отображается массив структур только...

2
93 / 91 / 62
Регистрация: 23.11.2013
Сообщений: 242
28.02.2017, 20:41 2
Ну начнём со строчки 24
C++
1
registr journal[0];
Здесь вы пытаетесь создать массив нулевой длины, так делать нельзя, массив должен состоять хотя бы из одного элемента (Хотя массив из одного элемента - затея не очень).
Дальше в функции add вы пытаетесь перераспределить память начиная с адреса массива journal, который является статическим и располагается в стеке, что и вызывает ошибку памяти. Рекомендую переменную journal сделать указателем, выделить память на этот указатель и уж потом перераспределять каждый раз при добавлении новых элементов из функции add.
Например вот так:
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
#include <stdio.h>
#include <conio.h>
#include <windows.h>
 
struct registr {
    int number;
    double numeral;
    char name[30];
};
 
void add(registr* reg_pointer, int* counter)
{
    reg_pointer = (registr*)realloc(reg_pointer, *counter * sizeof(registr));
    reg_pointer[*counter - 1].number = *counter;
    printf("Enter the %d register(<numeral> <string>\n", *counter);
    scanf("%lf %s", &reg_pointer[*counter - 1].numeral, reg_pointer[*counter - 1].name);
    *counter += 1;
}
 
int main()
{
 
    int counter = 1;
    int option_number;
    registr *journal = (registr*)malloc(sizeof(registr));
    printf("%d\n", sizeof(registr));
    add(journal, &counter);
 
    while (true)
    {
        system("cls");
        printf("Choose option:\n1.Add new register\n2.Remove register\n3.Sort registers\n4.Quit\n");
        scanf("%d", &option_number);
        switch (option_number)
        {
            case 1: add(journal, &counter);break;
            case 2: break;
            case 3: break;
            case 4:
            {
                printf("%d %lf %s", journal[1].number, journal[1].numeral, journal[1].name);
                getch();
            }
        }
    }
    free(journal);
    return 0;
}
2
1 / 1 / 1
Регистрация: 15.03.2016
Сообщений: 47
28.02.2017, 21:42  [ТС] 3
Покорнейше благодарю. В какие только дебри я не лез: и в разыменование указателя с попыткой высчитать сколько блоков памяти нужно прибавить к адресу указателя, чтобы попасть в нужное место (что вело меня к такому феномену как сортировка структуры по полям), и ссылку на массив структур пробовал передавать, и про шаблоны функций читать уже начинал, а вот чтобы нечто подобное сделать как-то не дошло. Опыта маловато.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.02.2017, 21:42

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

Функции работаты с массивом структур или с отдельной структурой через указатели
Всем доброго времени суток. Я вот переписал код, но прога не работает. Не пойму почему. Помогите,...

Вернуть указатель на массив из функции и продолжить работу с этим массивом в main()
Функция создает массив или изменяет его уже готовый. Главное - готовый массив передать в main и...

Работа с массивом через пользовательские функции через указатели
Не хочет работать ( Выводит только последний элемент массива ) Help! #include &lt;iostream&gt; using...

Вызов родовой функции (нужно передать массив в качестве аргумента функции через указатель)
#include &lt;iostream&gt; using namespace std; template &lt;class T1&gt; class mas { public: T1 n; T1...

Массив в функции через указатель
Необходимо найти сумму всех чисел в массиве, причем через функцию. Вроде всё правильно делаю, но на...

Реализовать 3 функции, каждая из которых принимает указатель на массив и количество элементов и возвращает указатель на новый массив.
Пишу в Microsoft Visual Studio -&gt;Win32 Console application -&gt;C++. Условие:Реализовать 3 функции,...


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

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

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