Я пытаюсь ответить на домашнее задание, которое у меня есть, где мне нужно запросить координаты «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
наверное
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.
что вы имеете в виду, «я не могу получить доступ к этому cordArray сейчас»? после маллок вы можете получить доступ к любой записи в нем
@YakirMalka Я не знаю, как выглядит структура coordinates
, но, вероятно, это будет что-то вроде cordArray[i].x
и cordArray[i].y
.
@YakirMalka Я отредактировал свой ответ, предупредив, если координаты не содержит целое число/число с плавающей запятой, потому что при использовании маллок конструктор вызывается нет для каждого элемента
Я объясню снова. У меня есть "n" количество координат, которые мне нужно собрать от пользователя в массив структур. Это означает, что после того, как я выделил память выше, мне теперь нужно запустить до «n» в цикле for и вставить координаты для x и y для каждой структуры в массиве. Итак, насколько я понимаю, у меня цикл for работает до "n", это не проблема, после этого мне нужно отсканировать ввод в x и y,
поэтому я подумал, что scanf будет выглядеть так, как я думал, он должен выглядеть так для (i = 0; i < n; i++) { printf("Пожалуйста, введите координаты для координат #%d:\n", i + 1 ); scanf_s("%lf%lf", &cordArray[i].x, &cordArray[i].y); }
@YakirMalka, да, в чем проблема? но я рекомендую вам проверить результат scanf, чтобы убедиться, что он равен 2. Почему scanf_s
(нестандартный), а не scanf
?
на ваш вопрос, почему я использую этот путь - это домашнее задание.. во всяком случае, я получаю это сообщение: Ошибка (активная) E0349 нет оператора "[]" соответствует этим операндам Так что я не знаю, что я' Я делаю неправильно здесь. и scanf выдает мне ошибку с VS и просит использовать scanf_s
вы исправили код, чтобы он был coordinates * cordArray = ...
? Что такое определение координаты? странно иметь 's' в конце имени
@bruno, да, я исправил это, и это сама структура -- typedef struct { double x; двойной у; }координаты;
@YakirMalka Я думаю, что это тот момент, когда вам нужно создать новый вопрос, содержащий Минимальный, полный и проверяемый пример. Мы не можем помочь вам, не видя, что именно вы сделали до сих пор.
Я открою новый вопрос по этому поводу, спасибо.
@YakirMalka Я отредактировал свой ответ с полной программой, соответствующей вашим замечаниям.
@bruno показал правильный способ выделения памяти с помощью malloc
.
Однако это можно сделать еще проще с помощью оператора new[]
, который автоматически рассчитывает объем требуемой памяти.
coordinates *cordArray = new coordinates[n];
Чтобы освободить память, используйте оператор delete[]
.
delete[] cordArray;
Еще одно преимущество способа размещения в C++ заключается в том, что он вызывает конструкторы для вновь созданных объектов. (Если у них есть какие-либо конструкторы, то есть.)
Я также говорю о новый и конструкторе ;-)
Мне нужно использовать функцию malloc для динамического выделения памяти, вот и задача :(
@YakirMalka Ну, я не должен удивляться. Это нормально, что учителя до сих пор живут в 20 веке ;)
@bruno Извините, это не было помечено как код, и я его пропустил.
В вашем задании указано, что вы должны использовать
malloc
? Это старый метод выделения из C. В C++ предпочтительнееnew
.