gpt4 book ai didi

c - 循环遍历其他源文件中定义的数组时出现问题

转载 作者:行者123 更新时间:2023-11-30 15:42:20 25 4
gpt4 key购买 nike

在询问为什么我不能从 malloc/calloc 返回数组大小之前,我已经问了一个与此有些相关的问题(我已收到对此的答案)。

我当前的问题是我定义了 2 个数组并填写了两个单独的源文件 ship.c 和rescue_assets.c。我试图在名为 system_handler.c 的文件内的方法中循环遍历它们。

我遇到的麻烦是,此任务要求您不要将数组大小硬核到代码中,因此我不知道如何将每个 c 文件中的数组大小链接到第三个 c 文件中的此函数中。

最终我想要:

assign_mayday_to_ships(int SIZE_OF_ARRAY_FROM_FILE_1, int SIZE_OF_ARRAY_FROM_FILE_2){

for(int i=0; i < SIZE_OF_ARRAYFROM_FILE_1; i++){
for(int j = 0; < SIZE_OF_ARRAYFROM_FILE_2; j++{

//do something

}
}

如果它们位于同一个文件中,我可以轻松地做到这一点,但我无法从两个不同的文件调用该方法,因为它显然缺少所需的参数。

这是有问题的代码(我只添加了所需的代码片段,包含所有 header ,并且系统按预期运行获取数组大小):

system_handler.c

void assign_mayday_to_ships() {

mayday_call* mday_ptr;
ship* ship_ptr;
rescue_asset* assets_ptr;

mday_ptr = read_mayday_file();
ship_ptr = read_ship_locations();
assets_ptr = read_recuse_assets();

int i;
int result;

/* loop through ship locations to find the ship that called the mayday
When found assign the mayday call to the ship for use when sending help*/
for (i = 0; i < arr_size; i++) {
result = strncmp(mday_ptr->ais, (ship_ptr + i)->ais, COMPARE_LIMIT);
if (result == 0) {
mday_ptr->ship = (ship_ptr + i);

}

}

calc_distance_to_mayday(mday_ptr, assets_ptr);

}

rescue_asset.c:assets是我想要获取其大小的数组。

    rescue_asset* assets;

no_of_lines = count_lines(locof);
printf("number of lines = %d \n", no_of_lines);

assets = calloc(no_of_lines,sizeof (rescue_asset));

ship.c:ships是要获取大小的数组。

    ship* ships;


/* -1 because first line of file is not a ship location*/
no_of_lines = (count_lines(locof) - 1);

ships = calloc(no_of_lines, sizeof (ship));

使用实际数组而不是 calloc 等会更好吗?

谢谢,克里斯。

最佳答案

您必须将已分配的项目数作为参数传递给函数。如果你不能这样做(就像在你的情况下,这些是在被调用的函数中分配的),你可以通过将大小作为指针参数添加到执行分配的函数(通过引用传递)来返回它,或者通过返回包含指针和大小的结构。

<小时/>

首先,你可以做类似的事情

size_t asset_size;
asset *assets_ptr = read_recuse_assets(&asset_size);

然后在 read_recuse_assets 中将 *asset_size 设置为正确的大小。

当然,您可以对指针和大小执行相反的操作,并将指针传递给 assets_ptr 作为参数并返回大小。

更完整的示例:

asset *read_recuse_assets(size_t *asset_size)
{
...

*asset_size = no_of_lines;
return assets;
}

按照上述方式进行调用。

<小时/>

对于第二种选择,您可以采用如下结构:

struct asset_data
{
size_t size;
asset *assets;
};

然后返回该结构的一个实例(而不是指针),并填充了字段。

关于c - 循环遍历其他源文件中定义的数组时出现问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20195482/

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