1

2 つの配列のデカルト積を 1 つの多次元配列に保存したいと考えています。

arr[number][0]- 最初の配列の
arr[number][1]数値 - 2 番目の配列の数値

数値 = sizeof(array1)*sizeof(array2)

int main() {
    int arr1[4] = {1, 4, 2, 3};
    int arr2[4] = {4, 1, 3, 3};
    int **outcomes = getProduct(arr1, 4, arr2, 4);

    int i;
    for(i = 0; i < 16; i++)
        printf("%d", outcomes[i][0]);

    getchar();
}

int* getProduct(int arr1[], int size1, int arr2[], int size2) {
    int **outcomes = (int *)malloc(sizeof(int)*16), count = 0, i, j;

    for(i = 0; i < size1; i++) {
        for(j = 0; j < size2; j++) {
            outcomes[count][0] = arr1[i];
            outcomes[count][1] = arr2[j];
            count++;
        }
    }
    return outcomes;
};

ただし、このコードは、getProduct() 関数内のネストされたループにあるときに奇妙に壊れます。ロジックは問題ありません。問題はポインターにある可能性があります。

  1. 多次元配列を 2 つのポインターで初期化する必要があるのはなぜですか?
  2. このコードが機能しないのはなぜですか?
  3. このコードを改善するにはどうすればよいか、何かアドバイスはありますか? (私はあまり C でコーディングしなかったので、「良い」コードがどの構造を使用するのかわかりません)。
4

1 に答える 1

1

int へのポインター (つまり )を int ポインターへのポインター (つまり ) に割り当てているため、関数getProductは失敗します。int*int**

Why do I need to initialize multidimentional arrays with two pointers? 

なぜなら

int**(int ポインターへのポインター) - これにより、単一のポインター (または 1 次元配列) では不可能な任意の行および任意の列の要素にアクセスできます。

同様にint***、3 次元配列、つまり int ポインターへのポインターへのポインターに使用できます。

   To improve the code

あなたのデカルト積関数は次のようになるはずです

int** getProduct(int arr1[], int size1, int arr2[], int size2) {
    int **outcome = malloc(sizeof(int*)*size1);        
    int i,j;
    for(i = 0;i<size1;i++)
     outcome[i] = malloc(sizeof(int)*size2);
    for(i = 0; i < size1; i++) {
        for(j = 0; j < size2; j++) {
            outcome[i][j] = arr1[i] * arr2[j];
        }
    }
    return outcome;
}

そして、あなたの main() はこのように

int main() {
    int arr1[4] = {1, 4, 2, 3};
    int arr2[4] = {4, 1, 3, 3};
    int **outcomes = getProduct(arr1, 4, arr2, 4);

    int i,j;
    for(i = 0; i < 4; i++){
     for(j = 0;j <4; j++){
        printf("%d  ", outcomes[i][j]);
     }
     printf("\n");
    }
    getchar();
}
于 2013-01-19T12:15:21.740 に答える