3

4 つの入力 a、b、c、および d から論理関数をテストしようとしています。

各入力は 0 または 1 です。

私は配列でこれを達成しようとしています。

logicXY配列の列がcombLogic配列の列と一致する場合、1を返したいと思います。

int comb(int** combLogic, int** logicXY){
    int x, y, logicOut;
    for ( x = 0; x < 4; x++ ){
        if (logicXY[0][x] == combLogic[x]){
                logicOut = 1;
                }
    }
    return logicOut;
}


int main void(){
    int** combLogic[4] = {a,b,c,d};  /*logic input*/
    int** logic[4][4] = {{1,0,0,1}, {1,0,1,1}, {0,1,0,0}, {0,1}}; /*return 1 if any of these combinations match the logic input*/
    int comb(combLogic, logicXY); /*send to function*/
}

関数が完全ではないことはわかっていますが、配列を正しく渡しているとは思いません。いくつかのチュートリアルを読みましたが、理論を理解できていないようです。

EDIT いくつかのステップを進めましたが、まだ機能していません。これは私が今持っているものです。

.h での関数宣言

int comb(logicInput,logicTest);

.c の関数

/* Function - Combination */
int comb(int** logicInput, int** logicTest){
int x, y, logicOut;
    for ( x = 0; x < 4; x++ ){
        if (logicTest[0][x] == logicInput[x]){
                logicOut = 1;
                }
    }
    return logicOut;
}

main.c の一部のループ

int output = 0;
int logicInput[4] = {0,1,1,1};
int logicTest[4][4] = {{1,0,0,1}, {1,0,1,1}, {0,1,0,0}, {0,1,1,1}};
int comb(logicInput,logicTest);
output = comb;

コードはステップオーバーint comb(logicInput,LogicTest)し、機能を実行しません。行から取り出すintと、関数が実行され、値が返されますが、値が出力に書き込まれると、関数から返された値とは異なります。

編集

コードにいくつかの変更を加えたので、動作しているように見え、修正できないように見える .h の関数宣言に対するコンパイラからの警告が 1 つだけあります。

warning: parameter names (without types) in function declaration [enabled by default]

.h での関数宣言

int comb(logicInput,logicTest);

.c の関数

int comb(int** logicInput, int** logicTest){ /*Points to the arrarys in the main   program*/
int x, i, logicOut;
    for(i = 0; i < 4; i++){ /*test each column*/
     for ( x = 0; x < 4; x++ ){ /*test each row*/
      if (logicTest[i][x] == logicInput[i][x]){
            logicOut = 1;
            break;
            }
}
   if(logicOut == 1)break; /*Break when logicOut == 1 the first time it happens*/
}
return logicOut;
}

main.c でループ

int output;
int logicInputC1[4] = {0,1,0,1};
int logicTestC1[4][4] = {{1,0,0,1}, {1,0,1,1}, {0,1,0,0}, {0,1,0,1}};
output = comb(logicInputC1,logicTestC1);

このコードから逸脱すると、コンパイラがビルドに失敗し、さらに多くの警告が表示されるようになります。

4

2 に答える 2

3
int * comblogic[4] = {a, b, c, d} //where a, b, c, and d, are arrays of size 4; aka int     a[4];
int logicArray[4][4] = values; 

あなたのループで:

int comb(int** combLogic, int** logicXY){
    int x, y, logicOut;
    for(int i = 0; i < 4; i++){
     for ( x = 0; x < 4; x++ ){
      if (logicXY[i][x] == combLogic[i][x]){
            logicOut = 1;
            break;
            }
}
   if(logicOut == 1)break; //incase you want to break when logicOut == 1 the first time it happens
}
return logicOut;
}
于 2013-07-11T19:55:33.430 に答える
2

これは間違っています:

int comb(int** logicInput, int** logicTest)

これを試して:

int comb(int logicInput[4], int logicTest[4][4])

違いはint **、ポインター (またはポインターの配列) へのポインターを期待することですが、あなたが持っているように配列を定義すると、ポインターがまったくないため、機能しません。

技術的には、配列を関数に渡すと、その配列のアドレスが取得され、参照によって渡されます。これは、配列へのポインターがあることを意味しますが、その配列内にはまだポインターがありません。

配列を渡すときは、最初の軸を除くすべての軸の次元を常に指定する必要があります。そうしないと、コンパイラは次の行に到達するためにスキップするエントリの数を認識できません。この場合、例を として示しましたが、不明な数のデータ行を指定したい場合は、int [4][4]としてもかまいません。int [][4]

C は と の両方にa[x]アクセスするために同じ表記法を使用するため、混乱が生じますが、メモリ内では同じに見えません。int **int[n][m]

于 2013-07-12T13:46:41.440 に答える