2009-11-04 34 views
0
int max(int N, ...){ 
    int* x = &N; 
    x = x + 1; 
    int max = x[1]; 
    for(int k = 1; k < N ; k += 1){ 
     if(x[k] > max) {max = x[k];} 
    } 
    return max; 
} 

void main(){ 
    //printf("%d", max(3)); 

} 

我試着從重點解決在編譯上面的代碼,但是我得到的錯誤語法錯誤:「類型」 這是怎麼回事...語法錯誤:「類型」

+2

你是如履薄冰了一個名爲「最大」被稱爲「最大」函數內部變量。編譯器接受它,但'gcc -Wshadow'警告隱藏全局的聲明。你不能這樣寫一個遞歸的max()。 – 2009-11-05 06:06:45

+0

另外,請注意標準C需要'int main(void)' - main返回一個整數值,而不是無值。 – 2009-11-05 06:10:53

回答

3

x = x + 1做沒有做你期望的事情。

您需要使用stdarg.h才能處理可變參數。

+0

您可能想要放大 - 大意是堆棧通常會向下增長,但N位於推入堆棧的值列表的頂部,因此'x = x + 1'正在訪問幀指針或返回調用函數中的地址或變量等。 – 2009-11-05 06:09:05

2

聽起來好像您正在使用C89編譯器。該代碼是爲C99或C++編譯器編寫的 - 要轉換它,您需要將maxk的聲明移至該函數的頂部。

+1

這是此代碼的最小問題,儘管它可能是他特定錯誤的來源。 – 2009-11-04 06:09:33

0

編譯以及在GCC

gcc foo.c -std=c99 

設置的選項是C99,這樣的聲明循環計數器順利。

1

這是做這件事:

#include <stdarg.h> 
#include <limits.h> 

int max(int N, ...) 
{ 
    int big = INT_MIN; 
    int i; 
    va_list args; 

    va_start(args, N); 
    for (i = 0; i < N; i++) 
    { 
     int x = va_arg(args, int); 
     if (big < x) 
      big = x; 
    } 
    va_end(args); 
    return(big); 
} 

#include <stdio.h> 
int main(void) 
{ 
    printf("%d\n", max(6, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(5, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(4, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(3, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(2, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(1, 1, 3, 5, 7, 9, 8)); 
    printf("%d\n", max(0, 1, 3, 5, 7, 9, 8)); 
    return(0); 
}