将矩阵传递给函数,C

时间:2015-04-07 14:16:56

标签: c function matrix

环顾四周后,我已经构建了一个接受矩阵并执行我需要的任何功能的函数,如下所示:

float energycalc(float J, int **m, int row, int col){
...
}

在main中,定义并填充了数组的大小,但是我不能将它传递给函数本身:

int matrix[row][col];
...
E=energycalc(J, matrix, row, col);

这会在编译期间产生警告

  

" project.c:149:警告:传递'energycalc'的参数2   不兼容的指针类型project.c:53:注意:期望'int **'但是   参数的类型为'int(*)[(long unsigned int)(col +   -0x00000000000000001)]'

并导致分段错误。

非常感谢任何帮助,谢谢。

5 个答案:

答案 0 :(得分:3)

如果数组声明为

int matrix[row][col];

然后将函数声明更改为

float energycalc(float J, int m[][col], int row, int col){

T类型的二维数组的名称不会衰减为T**

如果col是局部变量,则需要在col之前使用matrix参数调用该函数。这样做是为了使col在函数中可见。

答案 1 :(得分:3)

该函数应声明为

float energycalc( float J, int row, int col, int ( *m )[col] );

如果您的编译器支持可变长度数组。

否则如果在声明中

int matrix[row][col];

col是常量,然后可以按以下方式声明函数

float energycalc(float J, int m[][col], int row );

如果在函数之前定义了常量col

您的功能声明

float energycalc(float J, int **m, int row, int col);
当你有一个声明为

的数组时,

是合适的

int * matrix[row];

并且数组的每个元素都是动态分配的,例如

for ( int i = 0; i < row; i++ ) matrix[i] = malloc( col * sizeof( int ) );

答案 2 :(得分:2)

将二维数组传递给C中的函数通常会让新手感到困惑 原因是他们假设数组是指针并且不了解数组如何衰减指针 永远记住,当作为参数传递时,数组转换为指向其第一个元素的指针 在函数调用

E = energycalc(J, matrix, row, col);  

matrix被转换为指向其第一个元素matrix[0]的指针。这意味着传递matrix相当于传递&matrix[0]。请注意,&matrix[0]的类型是int(*)[col](指向col int数组的指针),因此属于matrix。这表明函数energycalc的第二个参数必须是int(*)[col]类型。将函数声明更改为

 float energycalc(int col, int (*m)[col], int row, float J);  

并将您的功能称为

 E = energycalc(col, matrix, row, J); 

答案 3 :(得分:0)

我认为你可以在C

中做这样的事情
float function_name(int mat_width, int mat_height, float matrix[mat_width][mat_height]) {
    ... function body...
}

答案 4 :(得分:0)

指向指针的指针不是数组,也不指向二维数组。它与数组没有任何关系,周期,所以忘了你曾经听说过指针到指针和数组。

(混乱可能来自成群混乱的潜在编程教师/作者告诉大家他们应该在分配动态2D数组时使用指针指针。这只是一个简单的错误建议,因为它不会分配一个在相邻的内存单元中分配的实数数组,而是在整个堆中以碎片形式分割的碎片查找表。See this以获取有关如何实际分配此类数组的参考。)

假设您的编译器并不完全古老,只需使用可变长度数组(VLA),这是C语言中引入C99标准的功能。

#include <stdio.h>

void print_matrix (size_t row, size_t col, int matrix[row][col]);


int main (void)
{
  int matrix[2][3] = 
  {
    {1,2,3},
    {4,5,6}
  };

  print_matrix(2, 3, matrix);

  return 0;
}

void print_matrix (size_t row, size_t col, int matrix[row][col])
{
  for(size_t r=0; r<row; r++)
  {
    for(size_t c=0; c<col; c++)
    {
      printf("%d ", matrix[r][c]);
    }
    printf("\n");
  }
}