Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
1

Не объявляется динамический массив с типом структуры

28.08.2017, 16:35. Показов 1474. Ответов 14
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Только начала изучать структуры. Задача такая: сначала вводится количество блоков. Потом по очереди вводятся эти самые блоки. Каждый блок представляет собой число - количество строчек, которые нужно как раз и записать в структуру.

Пример к задаче:
2
1
0.09 Apple
3
1.064 Egg
65.0 Bread
436.612 Oil

Т.е. в структуре должны лежать 3, 5, 6 и 7 строки. Но что-то не очень получается. Помогите найти ошибки, пожалуйста!

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
#include<iostream>
using namespace std;
struct pair{
  double points;
  string name;
};
 
int main() {
  int n, m, sum=0;
  cin>>n;
  for(int i=0; i<n; i++) {
    if(i==0) {
      cin>>m;
      pair* a=(pair*)calloc(m, sizeof(pair));
      for(int j=0; j<m; j++)
        cin>>a.points>>a.name;
      sum+=m;
      continue;
    }
    cin>>m;
    sum+=m;
    pair* a=(pair*)realloc(a, sum*sizeof(pair));
    for(int j=0; j<m; j++)
      cin>>a.points>>a.name;
  }
}
Добавлено через 37 минут
Исправила код, нашла в нём ужасные ошибки.. Теперь он ругается на ввод структуры и на realloc.
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
#include<iostream>
using namespace std;
struct pai{
  double points;
  string name;
};
 
int main() {
  int n, m, sum=0;
  cin>>n;
  for(int i=0; i<n; i++) {
    if(i==0) {
      cin>>m;
      pai* a=(pai*)calloc(m, sizeof(pai));
      for(int j=0; j<m; j++)
        cin>>a.points>>a.name;
      sum+=m;
      continue;
    }
    cin>>m;
    sum+=m;
    a=(pai*)realloc(a, sum*sizeof(pai));
    for(int j=0; j<m; j++)
      cin>>a.points>>a.name;
  }
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
28.08.2017, 16:35
Ответы с готовыми решениями:

Создать массив из 5 элементов с типом заданной структуры
Доброго времени суток. Я в замешательстве! Мне нужно получить/записать данные из/в структуры(у) 5...

Динамический массив и структуры
надо ввести студентов, у каждого студента есть имя, фамилия, оценка, а потом вывести на экран,...

Динамический массив структуры
Здравствуйте. имею такую структуру struct Discipline{ std::string name; int curse; int...

Динамический массив структуры
Согласно следующего задания создать динамический массив структуры. Из М учасников предыдущих...

14
Заблокирован
28.08.2017, 16:42 2
Цитата Сообщение от Not_ Посмотреть сообщение
pai* a
где родился?
0
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
28.08.2017, 16:43  [ТС] 3
MansMI, в каком смысле?
0
Заблокирован
28.08.2017, 16:47 4
в прямом, родиться - синоним появиться на свет
0
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
28.08.2017, 16:48  [ТС] 5
MansMI, я не понимаю, о чём Вы ведёте речь. К чему этот вопрос?
0
Заблокирован
28.08.2017, 16:50 6
где объявлен? и почему должен работать где-то еще?
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
28.08.2017, 16:50 7
Лучший ответ Сообщение было отмечено Not_ как решение

Решение

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
#include<iostream>
using std::cin;
using std::cout;
 
struct pair
{
    double points;
    char name[10];
};
 
int main() 
{
    int n, m, sum=0;
    cin>>n;
    int index=0;
    cin>>m;
    pair* a=(pair*)calloc(m, sizeof(pair));;
    for(int j=0; j<m; j++)
    {
        cin>>a[index].points>>a[index].name;
        index++;
    }
    sum+=m;
    for(int i=1; i<n; i++) 
    {
        cin>>m;
        sum+=m;
        a=(pair*)realloc(a, sum*sizeof(pair));
        for(int j=0; j<m; j++)
        {
            cin>>a[index].points>>a[index].name;
            index++;
        }
    }
    system("pause");
}
1. a - это массив, нужен индекс при вводе.
2. Выделение памяти под string таким методом приведет к падению программы.
Поэтому предлагаю заменить на массив char (или используйте оператор new).
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
28.08.2017, 16:53 8
Цитата Сообщение от Not_ Посмотреть сообщение
в каком смысле?
Конструкторы оных pai* a кто вызывает? calloc этого не делает.
0
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
28.08.2017, 17:07  [ТС] 9
zss, то есть, нужно написать количество элементов массива?
Цитата Сообщение от zss Посмотреть сообщение
char name[10];
0
Модератор
Эксперт С++
13507 / 10757 / 6412
Регистрация: 18.12.2011
Сообщений: 28,712
28.08.2017, 17:08 10
Естественно.
Размер должен быть на 1 больше самого длинного вводимого слова.
1
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
28.08.2017, 17:09 11
Not_, зачем тебе calloc? Для твоих целей подойдет std::vector.
1
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
28.08.2017, 17:11  [ТС] 12
zss, спасибо Вам большое!

shmkv, извините, а как vector может заменить динамическое объявление памяти? Вы не могли бы показать это на примере?
0
1375 / 519 / 72
Регистрация: 21.07.2015
Сообщений: 1,304
28.08.2017, 17:27 13
Лучший ответ Сообщение было отмечено Not_ как решение

Решение

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
#include <iostream>
#include <string>
#include <vector>
 
struct pai{
  double points;
  std::string name;
};
 
int main() 
{
  int n, m, sum=0;
  std::vector<pai> a;
  std::cin >> n;
  for(int i = 0; i < n; i++) 
  {
    std::cin >> m;
    for(int j = 0; j < m; j++)
    {
        pai item;
        std::cin >> item.points >> item.name;
        a.push_back(item);
    }
  }
}
1
2063 / 1542 / 168
Регистрация: 14.12.2014
Сообщений: 13,402
28.08.2017, 17:58 14
Цитата Сообщение от Not_ Посмотреть сообщение
извините, а как vector может заменить динамическое объявление памяти? Вы не могли бы показать это на примере?
А он динамическое выделение/реаллокацию не заменяет. Он их инкапсулирует.
1
5 / 5 / 10
Регистрация: 13.06.2017
Сообщений: 64
28.08.2017, 20:01  [ТС] 15
shmkv, спасибо большое, всё поняла!
0
28.08.2017, 20:01
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
28.08.2017, 20:01
Помогаю со студенческими работами здесь

Динамический массив структуры
Может вопрос звучит коряво, вообщем имею структуру struct TNew_table{ int test_len; ...

Создайте динамический массив указателей на структуры
Задача: дана структура struct Sample { char c; double x; int *p; }; Создайте...

Динамический массив структуры в качестве параметра функции
Привет! Нужна помощь ( Есть структура struct Embedded { double density; double energy; } ...

Динамический массив структур (добавление новой структуры)
Друзья, создаю программу &quot;Библиотека&quot; и запоролся на добавлении структуры к массиву (книги в...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru