0

私はマトリックスに基づくプログラムを持っており、ユーザーから取得したこのマトリックスとその次元にアクセスできるようにするには、さまざまな関数が必要です。それらを引数として各個別の関数に渡すことでなんとかそれを行うことができましたが、それは効率的ではないようです。

これを宣言しようとすると:

int lin, col;
char matrix[lin][col]; 

エラーが表示されます:可変長配列宣言はファイル スコープで許可されていません。その時点で、ユーザーに「lin」と「col」を尋ねていないためだと思いますか?私の質問は: 可変次元のマトリックスにグローバル スコープを持たせる方法はありますか? または、さまざまな関数に引数として渡すことなく、この行列と次元にアクセスする方法はありますか?

4

2 に答える 2

1

行う

char **matrix;

ユーザーからの入力として行rと列を読み取ります。c

次に、次のことを行います。

*matrix[c]=malloc(sizeof(matrix[r][c]); //You get contiguous memory here

次に、2D 配列にアクセスするのと同じ方法で、 matrix[x][y] のように行列にアクセスします。

一日の終わりに、割り当てられたメモリをクリアします。

clear(matrix);

または、さまざまな関数に引数として渡すことなく、この行列と次元にアクセスする方法はありますか?

はい、そうです 。通常、次のように引数を渡します。

void print_matrix(char** matrix_copy,int rows,int cols)
{
//Access the matrix using matrix_copy[x][y] format
}

以下のようにマトリックスを渡すことができmain()ます:

print_matrix(matrix,r,c); // As simple as that.

引数は必要ないので、簡単な回避策が必要です。

宣言する

char **matrix;
int r,c; // rows & columns

プログラム全体でアクセスできるように、すべての関数の外側。つまり、ファイル スコープで宣言します。ただし、この場合、 をmatrix使用してスペースが割り当てられた後にのみアクセスするようにしてくださいmalloc

于 2016-04-20T15:35:25.570 に答える
0

sjsamが言ったように、動的メモリ割り当てはあなたの問題に対する実行可能な解決策です。指摘したい唯一のことは、コードが次のようになることです。

int i,lin,col;
char **matrix;
matrix=malloc(lin * sizeof(char*));
//check for NULL
for(i=0;i<lin;i++){
    matrix[i]=malloc(col * sizeof(char));
    //again,check for NULL
}

次に、割り当てられたメモリを解放するには、次のようにします。

for(i=0;i<lin;i++)
    free(matrix[i]);
free(matrix);

それがあなたの質問に答えることを願っています!

于 2016-04-20T16:04:37.047 に答える