2012-05-16 28 views
5

引数として2つの行列を渡したいと思います。これらの行列はサイズが異なり、この作業をどのようにしなければならないのか分かりません:引数を引数として渡します

#include <stdio.h> 
#include <stdlib.h> 


void f(int m[3][], int n); 

int main() 
{ 
    int A[3][3]={{1,2,3},{4,5, 6},{7,8,9}}; 
    int B[3][2]={{1,2},{3, 4}, {5, 6}}; 

    f(A, 3); 
    f(B, 2); 

    return 0; 
} 

void f(int m[3][], int n) 
{ 
    int i,j; 
    for(i=0;i<3;i++) 
    { 
     for(j=0;j<n;j++) 
     printf("%5d", m[i][j]); 
    } 
    return; 
} 

どうすればいいですか?

void f(int **m, int w, int h) 
{ 
    int i,j; 
    for(i=0;i<w;i++) 
    { 
     for(j=0;j<h;j++) 
     printf("%5d", m[i][j]); 
    } 
    return; 
} 

オプションパラメータとしてこれを行うには、私の知っている

+2

どうしたらいいですか?コンパイル時エラーが出ていますか? –

+1

[C89](http://en.wikipedia.org/wiki/C89_(C_version)#C89)、[C99](http://en.wikipedia.org/wiki/C99)、または一部のコンパイラCの方言特有の方言?コンパイラが受け入れるように設定されている言語のバージョンに応じて、行列引数を関数に渡す方法には違いがあります。 –

+0

@HunterMcMillenはいmain.c | 5 |エラー:配列型に不完全な要素型があります /main.c|12|error:仮パラメータ1の型が不完全です – Nick

答えて

6

唯一の安全な方法は、パラメータの行列の次元が含まれ、またはマトリックス構造体のいくつかの種類

オプションA)の寸法を作ることですB)構造体を使用する

typedef struct Matrix 
{ 
    int w, h; 
    int** m; 
} Matrix; 

void f (Matrix *m) 
{ 
    for (int i = 0; i < m->w; ++i) 
    { 
     for (int j = 0; j < m->h; ++j) 
     { 
      printf(%5d", m->m[i][j]); 
     } 
    } 
} 
+0

あなたの答えはC89のために大丈夫です、私はちょうどC99のはるかに簡単な解決策が存在することに注意したいと思います。 –

+0

私はC99規格に慣れていません。好奇心の中で、C99には何が追加されて、より簡単な解決策になるのでしょうか? –

+4

'void f(size_t n、int m [3] [n])'のようなインターフェースを動的境界を持つ実際の2D行列とパラメータとして持つことができます。 https://gustedt.wordpress.com/2011/01/13/vla-as-function-arguments/ –

関連する問題