2010-04-05 49 views
2

我在写一个简单的测试程序来传递多维数组。我一直在努力获得被调用函数的签名。请帮助传递多维数组

的代码,我有:

void p(int (*s)[100], int n) { ... } 

... 

{ 
    int s1[10][100], s2[10][1000]; 
    p(s1, 100); 
} 

此代码似乎工作,但不是我的本意。我希望函数p忽略值的范围是100还是1000,但应该知道有10个指针(使用函数签名)。

作为第一个尝试:

void p(int (*s)[10], int n) // n = # elements in the range of the array 

和作为第二:

void p(int **s, int n) // n = # of elements in the range of the array 

但无济于事我似乎可以得到这些才能正常工作。我不想对签名中的100或1000进行硬编码,而是将其传入,请记住始终有10个数组。

很明显,我想避免声明函数:

void p(int *s1, int *s2, int *s3, ..., int *s10, int n) 

通知你,我看答案a similar question但仍然感到困惑。

回答

4

你需要转你的阵列这个工作。声明

int s1[100][10]; 
int s2[1000][10]; 

现在,你可以通过这些来这样的函数:

void foo(int (*s)[10], int n) { 
    /* various declarations */ 
    for (i = 0; i < n; i++) 
     for (j = 0; j < 10; j++) 
      s[i][j] += 1 
} 

的是,C型系统的工作原理,数组参数只能是“灵活”在这个意义上你的方式希望在其最左边的索引中。

+0

或者,'void p(int s [] [10],int n )' – outis 2010-04-05 06:20:54

+1

@outis:非常正确。我部分使用了int(* s)[10]',因为我模仿了原始问题,也因为我个人倾向于避免像int s [] [10]这样的参数声明,因为它们误导读者了解实际内容被传递给该函数。 – 2010-04-05 06:21:02

+0

谢谢戴尔。这看起来是实施我最初想要的方法的正确方法。唯一的问题是转置结构阻碍了我的代码。 看起来另一个建议动态构建多维数组,并且传入范围将更加合适和更清楚地理解。 – snap 2010-04-05 06:27:34

2

您还可以创建为矩阵struct并把它传递给函数p

struct Matrix{ 
    int **array; 
    int n; 
    int m; 
}; 


void p(Matrix *k){ 
    length=k->m; 
    width=k->n; 
    firstElement=k->array[0][0]; 
} 
+0

这种方法的工作原理更为通用,因为它允许在阵列的两个维度上都具有灵活性。但是,必须明确指出'array'是指向整数的'n'指针的单个数组,每个指针指向一个'm'整数数组。尽管存在句法上的相似性,但对于一些常量N和M而言,这与简单声明'int array [N] [M]'是非常不同的。' – 2010-04-05 06:25:36