gpt4 book ai didi

c - 包含结构数组的结构不能由相同类型列表中的值分配

转载 作者:太空宇宙 更新时间:2023-11-04 01:44:42 25 4
gpt4 key购买 nike

我的问题如下:我有一个名为 Environment 的结构,其中包含一个 Obstacle 结构列表。我无法从代码中手动创建的现有 Obstacle 列表中分配此 environment.obstacles

我有以下定义:

struct PointGPS {
double longitude;
double latitude;
} typedef PointGPS;

struct Obstacle {
int id;
PointGPS position;
double radius;
} typedef Obstacle;

struct Environment {
Obstacle *obstacles;
PointGPS destination;
} typedef Environment;

我正在使用以下函数来实例化我的值:

PointGPS createPoint(double longitude, double latitude) {
PointGPS point;
point.latitude = latitude;
point.longitude = longitude;
return point;
}

Obstacle createObstacle(int id, double radius, PointGPS position) {
Obstacle obstacle;
obstacle.id = id;
obstacle.radius = radius;
obstacle.position = position;
return obstacle;
}

Environment createEnvironment(PointGPS destination, Obstacle *obstacles) {
Environment environment;
environment.destination = destination;
environment.obstacles = obstacles;
return environment;
}

在我的 main 函数中,我创建了一个障碍列表:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))

int main() {
PointGPS pointGps1 = createPoint(49.202538, 6.918930);
PointGPS pointGps2 = createPoint(49.202650, 6.925839);
PointGPS destination = createPoint(49.202660, 6.925849);
Obstacle obstacle1 = createObstacle(1, 10, pointGps1);
Obstacle obstacle2 = createObstacle(2, 30, pointGps2);
Obstacle *obstacles[2];
obstacles[0] = &obstacle1;
obstacles[1] = &obstacle2;
// environment is global
environment = createEnvironment(destination, *obstacles);
// The two following methods allow me to print the id of the first element
printf("%d\n", environment.obstacles->id);
printf("%d\n", environment.obstacles[0].id);
// But I cant access to the values -for exemple the id field- of the following obstacles
printf("%d\n", environment.obstacles[1].id);
}

我想将此列表提供给我的环境。但它无法分配或指向正确的值。通过 environment.obstacles 中的一些障碍物的 id 测试总是从内存中返回一些随机整数值。

我尝试了以下尝试:

1)

// environment is global
environment = createEnvironment(destination, *obstacles);

2)

environment.obstacles = (Obstacle *)malloc(sizeof(Obstacle *) * NELEMS(obstacles));
environment.obstacles[0] = *obstacles[0];
environment.obstacles[1] = *obstacles[1];

3)

environment.obstacles = (Obstacle *)malloc(sizeof(Obstacle *) * NELEMS(obstacles));
environment.obstacles[0] = createObstacle(obstacles[0]->id, obstacles[0]->radius, createPoint(obstacles[0]->position.longitude, obstacles[0]->position.latitude));
environment.obstacles[1] = createObstacle(obstacles[1]->id, obstacles[1]->radius,
createPoint(obstacles[1]->position.longitude, obstacles[1]->position.latitude));

所有这些尝试都失败了,返回的值如 -2144113376,甚至没有在我的 environment 变量中创建长度 = 2 的数组。

我很确定我遗漏了一些明显的东西,因为我对这种语言的经验为零,但我无法弄清楚。我该如何继续?

更新 1:

此语法允许我使用方法 n°1 访问第一个障碍:

printf("%d\n", environment.obstacles->id)

但是我无法访问第二个障碍。执行 printf("%d\n", environment.obstacles[1]->id); 返回此错误:

Member reference type 'Obstacle' (aka 'struct Obstacle') is not a pointer, did you mean to use '.'?

并且执行 printf("%d\n", environment.obstacles[1].id); 仍然返回随机值。

更新 2:

根据要求,我编辑了结构、函数和主要文件。

更新 3:

这是一个可测试的代码,可以执行我的帖子中尝试的操作。 https://onlinegdb.com/S1342WPsN如果我在我的计算机上运行代码,在尝试访问第一个字段之后的字段时,我仍然有随机值。但如果我在网站内运行代码(参见链接),它似乎提供了正确的值。

最佳答案

数组和指针之间存在混淆。 main 函数中的 obstacles 是指向 Obstacle 结构的指针数组。您可能想要定义一个 Obstacle 结构数组,使用 obstacle1obstacle2 的副本进行初始化,并将其传递给 createEnvironment。将数组作为参数传递实际上是传递指向其第一个元素的指针。

修改后的版本:

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

#define NELEMS(x) (sizeof(x) / sizeof((x)[0]))

int main() {
PointGPS pointGps1 = createPoint(49.202538, 6.918930);
PointGPS pointGps2 = createPoint(49.202650, 6.925839);
PointGPS destination = createPoint(49.202660, 6.925849);
Obstacle obstacle1 = createObstacle(1, 10, pointGps1);
Obstacle obstacle2 = createObstacle(2, 30, pointGps2);
Obstacle obstacles[2];
obstacles[0] = obstacle1;
obstacles[1] = obstacle2;
// environment is global
environment = createEnvironment(destination, obstacles);
// The two following methods allow me to print the id of the first element
printf("%d\n", environment.obstacles->id);
printf("%d\n", environment.obstacles[0].id);
// This one should print the id of the second element
printf("%d\n", environment.obstacles[1].id);
return 0;
}

另请注意,您的 tyedef 定义在 C 中不是惯用的。typedef 关键字通常排在第一位:

typedef struct PointGPS {
double longitude;
double latitude;
} PointGPS;

关于c - 包含结构数组的结构不能由相同类型列表中的值分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55929764/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com