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

Я пытаюсь ответить на домашнее задание, которое у меня есть, где мне нужно запросить координаты «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 от пользователя будет выделен правильный размер для массива структур. Ошибка, которую я получаю, "Код серьезности Описание Состояние подавления строки файла проекта Ошибка (активная) E0415 не существует подходящего конструктора для преобразования "координат *" в "координаты"

В вашем задании указано, что вы должны использовать malloc? Это старый метод выделения из C. В C++ предпочтительнее new.

NO_NAME 07.04.2019 10:41

Да, мы должны использовать malloc

Yakir Malka 04.06.2019 12:40
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
182
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

наверное

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

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

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

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


Кстати, вы работаете на С++, почему вы используете массив C, вы можете выделить его с помощью новый, что позволяет вызывать конструктор координаты для каждой записи, или лучше использовать 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

если я могу задать другой вопрос по этому поводу, после того, как я выделил нужную мне память, мне теперь нужно получить доступ к этому массиву структур в цикле for и получить входные данные для x и y, но я не могу получить доступ к этому cordArray сейчас. Из того, что я прочитал, если я хочу получить доступ к значениям x и y, это должно быть похоже на этот codArray[[i].x/codArray[[i].y, но я все равно не могу получить доступ к структуре cordArray.

Yakir Malka 07.04.2019 10:40

что вы имеете в виду, «я не могу получить доступ к этому cordArray сейчас»? после маллок вы можете получить доступ к любой записи в нем

bruno 07.04.2019 10:42

@YakirMalka Я не знаю, как выглядит структура coordinates, но, вероятно, это будет что-то вроде cordArray[i].x и cordArray[i].y.

NO_NAME 07.04.2019 10:45

@YakirMalka Я отредактировал свой ответ, предупредив, если координаты не содержит целое число/число с плавающей запятой, потому что при использовании маллок конструктор вызывается нет для каждого элемента

bruno 07.04.2019 10:46

Я объясню снова. У меня есть "n" количество координат, которые мне нужно собрать от пользователя в массив структур. Это означает, что после того, как я выделил память выше, мне теперь нужно запустить до «n» в цикле for и вставить координаты для x и y для каждой структуры в массиве. Итак, насколько я понимаю, у меня цикл for работает до "n", это не проблема, после этого мне нужно отсканировать ввод в x и y,

Yakir Malka 07.04.2019 10:46

поэтому я подумал, что scanf будет выглядеть так, как я думал, он должен выглядеть так для (i = 0; i < n; i++) { printf("Пожалуйста, введите координаты для координат #%d:\n", i + 1 ); scanf_s("%lf%lf", &cordArray[i].x, &cordArray[i].y); }

Yakir Malka 07.04.2019 10:47

@YakirMalka, да, в чем проблема? но я рекомендую вам проверить результат scanf, чтобы убедиться, что он равен 2. Почему scanf_s (нестандартный), а не scanf?

bruno 07.04.2019 10:49

на ваш вопрос, почему я использую этот путь - это домашнее задание.. во всяком случае, я получаю это сообщение: Ошибка (активная) E0349 нет оператора "[]" соответствует этим операндам Так что я не знаю, что я' Я делаю неправильно здесь. и scanf выдает мне ошибку с VS и просит использовать scanf_s

Yakir Malka 07.04.2019 10:51

вы исправили код, чтобы он был coordinates * cordArray = ... ? Что такое определение координаты? странно иметь 's' в конце имени

bruno 07.04.2019 10:54

@bruno, да, я исправил это, и это сама структура -- typedef struct { double x; двойной у; }координаты;

Yakir Malka 07.04.2019 10:57

@YakirMalka Я думаю, что это тот момент, когда вам нужно создать новый вопрос, содержащий Минимальный, полный и проверяемый пример. Мы не можем помочь вам, не видя, что именно вы сделали до сих пор.

NO_NAME 07.04.2019 11:05

Я открою новый вопрос по этому поводу, спасибо.

Yakir Malka 07.04.2019 11:07

@YakirMalka Я отредактировал свой ответ с полной программой, соответствующей вашим замечаниям.

bruno 07.04.2019 11:08

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

coordinates *cordArray = new coordinates[n];

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

delete[] cordArray;

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

Я также говорю о новый и конструкторе ;-)

bruno 07.04.2019 10:58

Мне нужно использовать функцию malloc для динамического выделения памяти, вот и задача :(

Yakir Malka 07.04.2019 11:00

@YakirMalka Ну, я не должен удивляться. Это нормально, что учителя до сих пор живут в 20 веке ;)

NO_NAME 07.04.2019 11:02

@bruno Извините, это не было помечено как код, и я его пропустил.

NO_NAME 07.04.2019 11:06

Другие вопросы по теме