2017-03-03 7 views
-1

mMIPS 명령어 세트 내에서 하드웨어 클리핑을 처리하는 .c 파일을 컴파일하려고하는데 라인에서 '매크로 인수의 수가 일치하지 않습니다'라는 오류가 발생합니다. 'results = sfu1' 'lcc -o mips_mem.bin image.c로 파일을 컴파일하려고 할 때. 나는 그것이 왜이 오류를주는 지 이해하지 못합니다.
이것은 image.c입니다 :오류, 매크로 계약의 불일치

#define WIDTH 8 
#define HEIGHT 8 

#define sfu0(a, b) ((a) +((b) + *(int *) 0x12344321)) //clipping 
#define sfu1(a, b) ((a) -((b) + *(int *) 0x12344321)) //dividing by 13 
#define sfu2(a, b) ((a) +((b) - *(int *) 0x12344321)) /less multiplications 

    void main(void) 
{ 
int a, b, result; 
int max = 255; 
char *buf_i = (char*)0x401000, *buf_o = (char*)0x402000; 


for (a = 1; a < HEIGHT - 1; a++) 
{ 
    for (b = 1; b < WIDTH - 1; b++) 
    { 
     result = sfu1((
        -7*(int)buf_i[(a - 1) * WIDTH + b - 1] + 
         5*(int)buf_i[(a - 1) * WIDTH + b ] + 
         2*(int)buf_i[(a - 1) * WIDTH + b + 1] + 
        -1*(int)buf_i[ a  * WIDTH + b - 1] + 
        15*(int)buf_i[ a  * WIDTH + b ] + 
        -1*(int)buf_i[ a  * WIDTH + b + 1] + 
         2*(int)buf_i[(a + 1) * WIDTH + b - 1] + 
         5*(int)buf_i[(a + 1) * WIDTH + b ] + 
        -7*(int)buf_i[(a + 1) * WIDTH + b + 1] + 
        128)); 

     /* Clipping */ 
     buf_o[a * WIDTH + b] = ((result) + ((max) + *(int *) 0x12344321)); 
    } 
} 

}

누군가가 해결 될 수있는 일이 오류 수단과 방법을 설명 할 수?

+1

코드가 정의되지 않은 동작을 호출합니다. – Olaf

답변

1

sfu1 매크로는 2 개의 인수가 필요하지만 하나만 제공합니다.

이 코드 조각 같은 오류가 발생합니다 :

result = sfu1(1); 

수정 :

result = sfu1(

       -7 * (int)buf_i[(a - 1) * WIDTH + b - 1] + 
       5 * (int)buf_i[(a - 1) * WIDTH + b] + 
       2 * (int)buf_i[(a - 1) * WIDTH + b + 1] + 
       -1 * (int)buf_i[a  * WIDTH + b - 1] + 
       15 * (int)buf_i[a  * WIDTH + b] + 
       -1 * (int)buf_i[a  * WIDTH + b + 1] + 
       2 * (int)buf_i[(a + 1) * WIDTH + b - 1] + 
       5 * (int)buf_i[(a + 1) * WIDTH + b] + 
       -7 * (int)buf_i[(a + 1) * WIDTH + b + 1] + 
       128 

      , 2 // <<<<<<<<< missing argument in your snippet 
      ); 
프로그램이 오류없이 컴파일 그래서 난 그냥 예를 들어 두 번째 인수로 2을 추가

하지만, 아마 작동하지 않을 것이다. 나는 그 매크로들에 대한 두 번째 주장이 무엇인지 잘 모른다.

코드가 잘못되었거나 정의되지 않은 동작이 표시 될 수 있지만 이는 다른 질문입니다.