2013-07-11 3 views
3

Я пытаюсь проверить логическую функцию от четырех входов a, b, c и d.Логическая матрица в C

Каждый вход либо 0, либо 1.

Я пытался сделать это с массивами.

Я хочу передать 1, если столбец в массиве logicXY соответствует массиву combLogic.

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 из строки, то он выполняет функцию, возвращает значение, но когда значение записывается для вывода, это не похоже на значение, которое было возвращено функцией.

EDIT

Я сделал несколько изменений в код поэтому он появляется на работе и только один предупреждение от компилятора для функции декларации в .h, что я не могу показаться, чтобы исправить.

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; 
} 

Loop в 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); 

Если я отклониться от этого кода я просто похоже, заканчивается компилятором, который не может построить и еще больше предупреждений.

+0

На самом деле проблема связана с декларациями 'combLogic' и' logic', вы можете проверить этот код для [Как объявить/передать 'int' 2D-martix?] (Http://stackoverflow.com/questions/17566661/ c-dynamic-array-initalization-with-declaration/17567663 # 17567663) –

+0

Как функция знает размеры (особенно combLogic)? –

+1

Проблемы возникают в объявлениях массивов в 'main()', а также в списке параметров. Обратите внимание, что 'int ** param' и' int param [] [4] 'не относятся к одному типу. Ваш компилятор должен жаловаться на использование '1' в качестве инициализатора в массивах. Он также должен жаловаться на несоответствия типов в вызовах 'comb()'. –

ответ

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; 
} 
+0

Что такое 'logicArray' и' values'? И зачем вообще создавать массив указателей на массивы? Просто чтобы написать 'int ** logicXY'? Ответ на ams намного лучше. –

2

Это неправильно:

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

Попробуйте это:

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

Разница заключается в том, что int ** ожидает указатель на указатель (или ay указателей), но когда вы определяете массив, как у вас, тогда нет указателей, поэтому он не работает.

ОК, технически, когда вы передаете массив функции, он принимает адрес этого массива и передает его по ссылке. Это означает, что у вас есть указатель на массив, но в этом массиве еще нет указателей.

Когда вы передаете массив, вы всегда должны указывать, каковы размеры всех, кроме первых осей, иначе компилятор не будет знать, сколько записей пропустить, чтобы перейти к следующей строке. В этом случае я привел пример как int [4][4], но это могло быть так же, как и int [][4], если вы хотели дать неизвестное количество строк данных.

Путаница arrises becuase C использует те же a[x] обозначения для доступа как int ** и int[n][m], но они не выглядят одинаково в памяти.

+0

+1. Лучший ответ. –

Смежные вопросы