循环遍历数组的麻烦在其他源文件中定义

时间:2013-11-25 14:24:18

标签: c arrays pointers size

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

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

我遇到的麻烦是这个任务要求你不要将数组大小硬编码到代码中,所以我不知道如何将每个c文件中的数组大小链接到第3个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

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

这是有问题的代码(香港专业教育学院只添加了所需的片段,包含所有标题,系统按预期的方式运行以获得数组大小):

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:ship是想要获得大小的数组。

    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等会更好吗?

谢谢, 克里斯。

1 个答案:

答案 0 :(得分:1)

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


首先,您可以执行类似

的操作
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;
};

然后返回此结构的实例(不是指针),填入字段。