Выделение динамической памяти для массива структур - PullRequest
0 голосов
/ 07 апреля 2019

Я пытаюсь ответить на домашнее задание, которое у меня есть, где мне нужно запросить «n» координат, а затем построить массив структурных координат с таким размером. Каждая структура координат имеет 2 переменные типа double.

Я попытался получить ввод n от пользователя и проверить с помощью оператора if, что сначала он больше 0, чтобы избежать любого сбоя

printf("Enter amount of coordinates:\n");
scanf_s("%d", &n);
if (n > 0) {
    coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));

}

Ожидается, что после получения значения n от пользователя будет выделен правильный размер для массива structs. Я получаю ошибку "Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активная) E0415 Не существует подходящего конструктора для преобразования из "координат *" в "координаты"

Ответы [ 2 ]

2 голосов
/ 07 апреля 2019

вероятно

coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));

должно быть заменено на

coordinates * cordArray = (coordinates *)malloc(sizeof(coordinates) * n);

, поскольку вы присваиваете coordinates с coordinates *, а cordArray неизвестнои даже если он не может быть преобразован в size_t (вы не дадите его определение)


Кстати, вы находитесь в C ++, почему вы используете массив C, вы можете выделить его new , позволяющий вызывать конструктор координат для каждой записи или лучше использовать std::vector, позволяющий изменять размер, доступ к размеру и т. Д.


О ваших замечаниях, эта программа компилируется и запускается:

#include <stdio.h>
#include <stdlib.h>

typedef struct { 
  double x;
  double y;
}coordinates;

int main()
{
  printf("Enter amount of coordinates:\n");

  int n;

  if (scanf("%d", &n) != 1)
    puts("invalid number");
  else if (n <= 0)
    puts("expected a positive number");
  else {
    coordinates * cordArray = (coordinates *) malloc(sizeof(cordArray) * n);

    if (cordArray == NULL)
      printf("cannot allocate memory, probably %d too large\n", n);
    else {
      int i;

      for (i = 0; i < n; i++) { 
        printf("Please enter coordinates for coordinates #%d:\n", i + 1);
        if (scanf("%lf%lf", &cordArray[i].x, &cordArray[i].y) != 2){
          puts("invalid values");
          return -1;
        }
      }
    }
  }
}

Обратите внимание, что это код C, почему вы использовали тег C ++?

pi@raspberrypi:/tmp $ g++ -pedantic -Wall -Wextra c.cc
pi@raspberrypi:/tmp $ ./a.out
Enter amount of coordinates:
2
Please enter coordinates for coordinates #1:
1 2
Please enter coordinates for coordinates #2:
3 4
0 голосов
/ 07 апреля 2019

@ bruno показал правильный способ выделения памяти, используя malloc.Однако это можно сделать еще проще с помощью оператора new[], который автоматически вычисляет объем необходимой памяти.

coordinates *cordArray = new coordinates[n];

Чтобы освободить память, используйте оператор delete[].

delete[] cordArray;

Другое преимущество способа выделения в C ++ состоит в том, что он вызывает конструкторы для вновь создаваемых объектов.(Если у них есть конструкторы, то есть.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...