2016-10-30 4 views
1

나는이 숙제를 가지고있다. 기본적으로, 'r'행과 'n'열의 양방향 배열의 최대 요소를 반환하는 다음 코드를 완성해야합니다.매트릭스의 최대 원소 찾기

  • 호환되지 않는 포인터 유형에서 'max_element'의 인수 1을 통과 [-Wincompatible - 포인터 타입]

콘솔의 작동이 중지 :

#include <stdio.h> 

int max_element(int **A, int r, int n) { 
// complete the code 
int max; 
max = a[0][0]; 
for (int i = 0; i < r; i++) { 
    for (int j = 0; j < n; j++) { 
     if (A[i][j] > max) 
      max = A[i][j]; 
    } 
} 
return max; } 

// implement a main() function to test the algorithm 
int main() { 
int A[2][3] = { {1, 0, 4}, {10, 3, 1} }; 

printf("%d\n", max_element(&A, 2, 3)); 
return 0; } 

내가 한 경고를해야 문제가 프로그램이 올바르게 작동하지 않게되었습니다 ...

+0

컴파일러에서 발생하는 경고는 솔루션의 핵심입니다! – abhiarora

답변

1

max_element 함수는 다음과 같이 정의됩니다.

,210
int max_element(int **A, int r, int n); 

그것은 int로 포인터로 (int**를) 포인터를 소요하고 당신이 그것을 먹이이 :

int A[2][3]; 
max_element(&A, 2, 3); 

당신이 표현 &A 유형 int**의 결과를 얻을 것으로 예상합니까? 그건 그렇지 않을거야. 실제로 int(*)[2][3] 유형의 결과가 산출됩니다. 그럴 경우 int**에 바인딩되지 않습니다. 컴파일러 경고가 나오는 곳입니다. 호환되지 않는 포인터입니다 !!

당신은 더 큰 문제가 있습니다. 2D 배열은 int**이 아닙니다. 형식은 int[][COLS]입니다. 이어야하며 두 번째 숫자를 지정하십시오.

const int COLS = 3; 

int max_element(int A[][COLS], int r, int n); 

다음과 같은 전화 :

변경 함수가되게합니다

max_element(A, 2, 3); 
+0

내 대답에 설명 된 변경 사항을 고려할 때 알고리즘에 아무런 문제가 없습니다. 'max = a [0] [0]'의 오타를 제외하고는'max = A [0] [0]'이어야합니다. 당신의 컴파일러가 당신에게 외쳐주지 않습니까? – DeiDei

0

변경에서 max_element의 함수 프로토 타입 :

int max_element(int **A, int r, int n) 

int max_element(int A[][3], int r, int n) 

으로

C-Faq은 이유를 철저히 설명합니다. 요지는 포인터가 포인터로 한번 쇠퇴한다는 것입니다. 재귀 적으로 발생하지는 않습니다. 배열 배열은 포인터에 대한 포인터가 아니라 배열에 대한 포인터로 붕괴됩니다.

또한 max_element(&A, 2, 3) 대신 max_elementmax_element(A, 2, 3)으로 호출해야합니다.

함수가 이미 포인터에 대한 포인터를 받아 들인 것으로 선언 된 경우 (사실상), 2 차원 배열을 직접 전달하는 것은 거의 의미가 없습니다. intermediate pointer는 2 차원 배열로 호출 할 때 사용되어야 할 것이다 :

int max_element(int **A, int r, int n); 

int *ip = &A[0][0]; 
max_element(&ip, 2, 3);  /* PROBABLY WRONG */ 

하지만 배열이 flattened (its shape has been lost를) 되었기 때문에 이러한 사용은 오해의 소지가 거의 확실히 잘못된 것입니다.

+0

그래서 배열의 배열이 배열의 포인터로만 붕괴하기 때문에 중간 포인터를 사용하면 작동하지 않습니다. 오류는 그가 작동하는 프로토 타입에 있었다. 하지만 함수가 이미 포인터에 대한 포인터로 선언 된 경우 어떻게하면 기본을 구현해야합니까? 중간 포인터가 컴파일되지만 작동하지 않습니다. – Orion