0

我试图将一个二维数组传递给一个函数,但它总是抛出这个错误。我的代码如下:

void initialize_centroids(int *,int,int);(Initialization)

initialize_centroids(centroid[0],noofcentroids,newnoofvar);(inside my main)

void initialize_centroids(int *carray,int p,int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
           carray[i][j]=i;
        }
    }

    return;
}
4

2 回答 2

1

传入时不要取消引用centroid。这样做只会通过你的第一行。做这个:

initialize_centroids( centroid, noofcentroids, newnoofvar );

那么你需要在这里使用正确的类型:

void initialize_centroids( int **carray, int p, int q )

你的数组大概是一个int**. 这意味着它是一个指向内存中包含指针数组的位置的int*指针。这些指针中的每一个(我假设)都引用了已分配给数组的一行的内存。

现在,一旦您通过执行获得这些指针之一,carray[i]您就选择了 row i。你现在有一个int*,这意味着它指向一个数组int

最后,从row 上的列中carray[i][j]选择一个特定的整数。ji

[编辑]

关于可能出了什么问题的理论...您可能没有在动态意义上分配二维数组,或者实际上它可能是一维数组并且您应该使用步幅等。这是您可以使用的解决方案用于动态分配二维数组,并将其索引为carray[i][j].

注意:由于对齐问题,过去有些人对这种方法感到不满,但我从来没有遇到过问题。我想他们只是有一个脾气暴躁的一天。对于那些担心对齐的人来说,调整起来很容易,但是对于这个例子来说太复杂了。

int** allocate_array2d( int rows, int cols )
{
    int i, **arr, *data;
    arr = (int**)malloc( rows * sizeof(int*) + rows*cols*sizeof(int) );
    data = (int*)(arr + rows);
    for( i = 0; i < rows; i++ ) {
        rows[i] = data;
        data += cols;
    }
    return arr;
}

void free_array2d( int** arr ) {
    free((void*)arr);
}

现在,在你的主要:

int** centroid = allocate_array2d( noofcentroids, newnoofvar );
initialize_centroids( centroid, noofcentroids, newnoofvar );

[更多的...]

Okay.Yes 我分配了像这样的 centroid[100][100] 的内存 – Bobby 11 分钟前

在这种情况下,您应该声明:

void initialize_centroids( int carray[100][100], int p, int q )
{
    //...
}

无需使用我的动态数组示例

于 2012-09-14T03:47:33.917 回答
1

您正在传递一个指向 int ( int*) 的指针,但您正在尝试使用两个下标。是二维数组吗?那么参数需要是一个指向 int 的指针:int**

void initialize_centroids(int**, int, int);

int centroid[][] = ....  // wherever this comes from
initialize_centroids(centroid, noofcentroids, newnoofvar);(inside my main)



void initialize_centroids(int** carray, int p, int q)
{
    int i,j;
    for(i=0;i<p;i++)
    {
        for(j=0;j<q;j++)
        {
            carray[i][j]=i;
        }
    }

    return;
}
于 2012-09-14T03:40:19.010 回答