2011-12-16 17 views
4

行列は他のことを知らずに行列の数を求めたいと思う。行列があれば、行と列の数を見つける

例:

int * findElements(int matInput[][]) { 
     /*Count blah*/ 
     /*Now to run a loop till the number of rows*/ 
     /*I need to know the size of the matrix to run the loop above*/ 
} 

私は行列が作成しながら、初期化された場合は終了することとも知らない時に知っていないと私はサイズを見つけるために、ループを実行することはできません。 他の方法はありますか?

答えて

8

Cでこれを行うことはできません。何らかの追加情報なしでは、それを指すポインタの配列のサイズを見つけることは全く文字通り不可能です。

クエリの配列長をサポートする言語では、追加情報を渡すことでこれを実行します。 Cではあなたにもこれを行うことができますが、あなたは明示的にそれをしなければならない。

もう少し高度な方法として
struct matrix { 
    int rows, cols; 
    int *data; // packed representation, or int **data; 
}; 

int *findElements(struct matrix *matInput); 

、あなたは右のメモリ内struct matrix後の配列データを置くことができます。これは必要なポインタアクセスの数を減らし、したがってわずかに高速です。しかし基本的なテクニックは同じです。

+0

をいっぱい持っている必要はありませんそれがどのように機能するか知っている私は同様のものがC言語で実装できると思いますか? – noMAD

+3

@noMADあなたの推測は間違っています – qrdl

+2

JavaのArray.lengthは、構造体へのポインタを密かに渡して動作します。構造体には、長さフィールドと実際の配列へのポインタが含まれています。 Cでこれを行うことはできますが、 'findElements(int matInput [] [])'ではなく 'findElements(struct matrix * input)'のようになります。 – bdonlan

0

また、行と列の最大長を定義し、それらを使用して配列を反復処理することもできます。

#define MAX_COLS 15 
#define MAX_ROWS 15 


int * findElements(int matInput[MAX_ROWS][MAX_COLS]) 
{ 
     int row, col; 
     for(row = 0; row < MAX_ROWS; row++) 
     { 
     for(col = 0; col < MAX_COLS; col++) 
     { 
      //do stuff 
     } 
     } 
} 

これは単なる配列のサイズを定義し、それが必ずしもすべての要素がまあ、そこArray.lengthと機能がJavaであるが、私はしません

3
#include<stdio.h> 

int main() 
{ 
    float a[9][2]={{0,1},{1,1}}; 
    int row=(sizeof(a)/sizeof(a[0])); 
    int col=(sizeof(a)/sizeof(a[0][0]))/row; 
    printf("%d\n",row); 
    printf("%d\n",col); 
    return 0; 
} 
関連する問題