#c #memory
#c #память
Вопрос:
Я пытаюсь ответить на домашнее задание, которое у меня есть, где мне нужно запросить координаты «n», а затем построить массив координат структуры с таким размером. Каждая структура координат имеет 2 переменные типа double.
Я попытался получить ввод n от пользователя и проверить с помощью оператора if, что сначала оно больше 0, чтобы избежать какого-либо сбоя
printf("Enter amount of coordinates:n");
scanf_s("%d", amp;n);
if (n > 0) {
coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
}
Ожидается, что после получения значения n от пользователя будет выделен массив structs нужного размера. Я получаю ошибку «Ошибка состояния подавления строки файла проекта Описания кода серьезности (активна) E0415 не существует подходящего конструктора для преобразования из «координат *» в «координаты»
Комментарии:
1. Указано ли в вашем назначении, что вы должны использовать
malloc
? Это старый метод выделения из C. Предпочтительнее использовать Cnew
.2. Да, мы должны использовать malloc
Ответ №1:
вероятно
coordinates cordArray = (coordinates *)malloc(cordArray * sizeof(n));
необходимо заменить на
coordinates * cordArray = (coordinates *)malloc(sizeof(coordinates) * n);
поскольку вы присваиваете a coordinates
с помощью a coordinates *
и cordArray
неизвестно, и даже это может быть не конвертируемо в a 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", amp;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 largen", n);
else {
int i;
for (i = 0; i < n; i ) {
printf("Please enter coordinates for coordinates #%d:n", i 1);
if (scanf("%lf%lf", amp;cordArray[i].x, amp;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
Комментарии:
1. если я могу задать другой вопрос по этому поводу, после того, как я выделил необходимую мне память, мне теперь нужно получить доступ к этому массиву struct в цикле for и получить входные данные для x и y, но я не могу получить доступ к этому cordArray сейчас. Из того, что я прочитал, если я хочу получить доступ к значениям x и y, это должно быть похоже на этот codArray[[i].x / codArray [[i].y но я все равно не могу получить доступ к структуре cordArray.
2. что вы имеете в виду «я не могу получить доступ к этому cordArray сейчас»? после malloc вы можете получить доступ к любой записи в нем
3. @YakirMalka Я не знаю, как
coordinates
выглядит структура, но, вероятно, это будет что-то вродеcordArray[i].x
иcordArray[i].y
.4. @YakirMalka Я отредактировал свой ответ, предупреждая, если координаты не содержатся в integer / float, потому что при использовании malloc конструктор не вызывается для каждого элемента
5. Я объясню еще раз. У меня есть «n» количество координат, которые мне нужно собрать от пользователя в массив структур. Это означает, что после того, как я назначил память выше, теперь мне нужно выполнить до «n» в цикле for и вставить координаты для x и y для каждой структуры в массиве. Итак, насколько я понимаю, у меня цикл for выполняется до «n», это не проблема, после этого мне нужно выполнить сканирование входных данных в x и y,
Ответ №2:
@bruno показал правильный способ выделения памяти с помощью malloc
. Однако это можно сделать еще проще с помощью оператора new[]
, который автоматически вычисляет объем требуемой памяти.
coordinates *cordArray = new coordinates[n];
Чтобы освободить память, используйте operator delete[]
.
delete[] cordArray;
Другим преимуществом способа выделения C является то, что он вызывает конструкторы для вновь созданных объектов. (Если у них есть какие-либо конструкторы, то есть.)
Комментарии:
1. Я также говорю о новом и конструкторе
![]()
2. Мне нужно использовать функцию malloc для динамического выделения памяти, вот назначение: (
3. @YakirMalka Ну, я не должен удивляться. Это нормально, что учителя все еще живут в 20 веке
![]()
4. @bruno Извините, это не было помечено как код, и я пропустил это.