jo4397   1년 전

아래와 같이 함수를 이용하여 프로그래밍을 하고자 하였습니다.
그런데 17번째 num2에 빨간 줄이 나타나고, ‘expression must havde integral type’(E0031)라는 컴파일에러가 뜹니다.

sum함수에 2차원 배열 a와 b를 num1과 num2라는 포인터로 전달받고, 이것에 인덱싱하여 sum_idx라는 각 인덱스의 합을 구하여 출력하고자 하였습니다.
※물론 아래 코드가 틀렸다는 것은 알고 있습니다. 최종적으로 n행 m열의 마지막 인덱스의 합이 sum_idx에 덮어씌워져서 출력될 것이므로 잘못된 코드입니다.

다만 지금 궁금한 것은.. E0031에러가 왜 뜨는 것인지.. 포인터에 인덱스 번호를 부여하여 값에 접근하고, 이를 연산하여 출력하고자 하는 것이 왜 문제가 되는지 궁금합니다.

sum_idx = *num1[i][j] + *num2[i][j];
라고 수정해줬더니 에러가 사라지긴 했는데, 간접접근 연산자 *는 포인터 연산을 통해 값에 접근할때 사용하는 것이므로.. 이 경우 또한 이해가 되질 않습니다ㅠㅠ

ekrua427   1년 전

먼저 함수 sum의 매개변수를 한번 볼까요?

int* num1[][100], int* num2[][100]

위 두 변수는 2차원 배열의 포인터 변수 입니다.

이번에는 함수 sum의 구현부를 한번 볼까요?

sum_idx = num1[i][j] + num2[i][j];

위의 식을 한글로 풀어쓰면

sum_idx 변수에 num1[i][j]의 주소 값과 num2[i][j]의 주소값을 더한 값을 대입하라 라는 뜻이 됩니다.

주소 값에 주소 값을 더하라니... 말이 안되죠?

결국에는 sum 함수의 매개변수를 포인터 변수가 아닌 일반 배열 변수로 선언하시면 됩니다.

jo4397   1년 전

답변해주셔서 정말 감사합니다. 말씀해주신 내용 잘 읽어보았습니다.


다만 제가 알고있기로는 배열의 원소에 접근하는 방법은

1. 대괄호에 인덱스 수를 넣기

a[1][2]처럼 대괄호에 수를 기입하여 값으로 접근할 수 있고, 이때 address값이 아닌 value인 것으로 알고 있습니다.

그리고 

2. 포인터 연산

(a + 2 + col수 * 1)로 포인터 연산하여 해당 원소의 주소값에 접근한 후 앞에 간접접근 연산자 *를 붙여서 *(a + 2 + col수 * 1)로 값에 접근하는 방법이 있다고 알고있습니다.


그리고 함수에 배열을 매개변수로 전달할 때는 포인터로 전달해야한다고 알고있습니다.

그렇다면.. sum_idx = num1[i][j] + num2[i][j];에서 ,num[i][j]와 num2[i][j]는 값에 접근한 것이 아닌가요..? 

어째서.. 대괄호에 인덱스 숫자를 넣은 것이 value가 아니라, address가 되는지 모르겠습니다😭

ekrua427   1년 전

"그리고 함수에 배열을 매개변수로 전달할 때는 포인터로 전달해야한다고 알고있습니다."

.

위의 말은 맞습니만, 질문자님께서 매개변수로 전달하는 방식이 잘못 되어있습니다.

가장 우선적으로 매개변수로 전달할 변수와 선언된 매개변수는 서로 같은 형태이어야 합니다.

 .

매개변수인 int* num1[][100]  이 변수는 2차원 배열의 포인터 변수이며, 좀 더 쉽게 말하자면 3차원 배열이라고 볼 수 있습니다.

전달할 값인 int a[100][100] 이 변수는 일반 2차원 배열이니 당연히 잘 못된 값을 전달한거겠죠?

.

.

"그렇다면.. sum_idx = num1[i][j] + num2[i][j];에서 ,num[i][j]와 num2[i][j]는 값에 접근한 것이 아닌가요..?

어째서.. 대괄호에 인덱스 숫자를 넣은 것이 value가 아니라, address가 되는지 모르겠습니다😭"

.

포인터 변수로 선언한 변수를 간접접근 연산자 없이 접근하면 값이 아닌 주소값에 접근한다는것 이미 아시고 계시죠?

매개변수에서  int* num1[][100] 과 같이 포인터 변수로 선언을 하셨기때문에 주소값을 가져오게 된 것입니다.

.

.

결론은 다음과 같이 매개변수를 선언하시면 됩니다.

int* num1[][100] : X

int num1[][100] : O

int  (*num1)[100] : O

jo4397   1년 전

헉... 친절히 상세하게 답해주셔서 정말 감사합니다. 덕분에 완벽히 제가 무엇을 잘못했는지, 어떤 이유로 어떻게 고쳐야할지 이해할 수 있었어요. 너무너무 감사합니다!

댓글을 작성하려면 로그인해야 합니다.