2013-03-10 63 views
0
int main() 
{ 
    long int i,t,n,q[500],d[500],s[500],res[500]={0},j,h; 
    scanf("%ld",&t); 
    while(t--) 
    { 
     scanf("%ld %ld",&n,&h); 
     for(i=0;i<n;i++) 
      scanf("%ld %ld",&d[i],&s[i]); 
     for(i=0;i<h;i++) 
      scanf("%ld",&q[i]); 
     for(i=0;i<h;i++) 
     { 
      for(j=0;j<n;j++) 
      { 
       res[j]=d[j]+q[i]*s[j]; 
      } 
     j=cal(res,n,q[i],s); 
     printf("%ld\n",j); 
     } 
    } 
    return 0; 
} 

long int cal(int res[],int n,int q,int s[]) 
{ 
    long int i,max=0,p,pos=0; 
    for(i=0;i<n;i++) 
    { 
     if (max==res[i]) 
     { 
      pos=add(res,s,pos,i,q); 
      max=res[pos]; 
     } 
     if (res[i]>max) 
     { 
       max=res[i]; 
       pos=i; 
     } 
    } 
    return pos; 
} 

每當我拿着變量int,它的正常工作,但如果我的變量聲明爲long int,我在函數調用在收到警告消息「可疑指針轉換」 - 在該行:可疑指針轉換長整型

(j=cal(res,n,q[i],s)); 

能否請你解釋一下原因嗎?

+2

你可以發佈cal()函數原型 – 2013-03-10 04:06:03

+1

那麼,如果我們知道'cal'看起來像什麼會有幫助。對不起,太陽耀斑會干擾我們的水晶球。 – 2013-03-10 04:06:45

+1

@NikBougalis好的:) – Ganesh 2013-03-10 04:21:57

回答

4

考慮:

  1. j=cal(res,n,q[i],s);
  2. long int cal(int res[],int n,int q,int s[])

您試圖陣列long res[500]傳遞給需要的int陣列功能。即使您的機器上有sizeof(int) == sizeof(long),類型也不同 - 而且我的機器上的尺寸完全不同。

如果您使用的是Windows(32位或64位)或32位Unix系統,那麼您可以避開它,但是如果您遷移到LP64 64位環境,所有地獄都會破壞疏鬆。

這就是爲什麼它是'可疑的指針轉換'。這不是猶太教;它不可靠;它恰好適用於你的環境(但是出於便攜性的原因,這是非常可疑的)。


但爲什麼它給予警告爲「可疑指針轉換」(而不是預期的消息爲「L值要求」)?

我不知道爲什麼你會期望l-value required錯誤。請記住,當你調用一個函數時,數組會衰變爲指針,所以你的函數聲明也可以寫成long cal(int *res, int n, int q, int *s),並且你傳遞的是long res[500],它會自動更改爲long *(就好像你寫的是&res[0]),所以你傳遞一個long *其中int *預計,你可能會擺脫它(因此'可疑',而不是更嚴重)。

考慮代碼:

long res[500]; 
long cal(int res[]); 

int main(void) 
{ 
    return cal(res); 
} 

GCC 4.7.1在64位機器上(和64位編譯)說:

x.c: In function ‘main’: 
x.c:6:5: warning: passing argument 1 of ‘cal’ from incompatible pointer type [enabled by default] 
x.c:2:6: note: expected ‘int *’ but argument is of type ‘long int *’ 

(我不經常看到有人寫long int,而不是隻寫long,所以我已經按照慣例將intlong int中刪除了。你說得對,long int是合法的,意思是和一樣的東西;大多數人不寫多餘的字,僅此而已。)

+0

但是,爲什麼它會發出警告「可疑的指針轉換」(如預期的消息所示爲「需要L值)? – user2127986 2013-03-10 16:34:28

+0

請參閱答案的更新。 – 2013-03-10 16:45:40

0

ISO C 9899說,在6.3.1.1下算術運算

The rank of long long int shall be greater than the rank of long int, which 
shall be greater than the rank of int, which shall be greater than the rank of short 
int, which shall be greater than the rank of signed char 

Knr的ANSI C版本2說。2數據類型和大小

short is often 16 bits long, and int either 16 or 32 bits. Each compiler is free to  choose appropriate sizes for its own 
hardware, subject only to the the restriction that shorts and ints are at least 16  bits, longs are 
at least 32 bits, and short is no longer than int, which is no longer than long. 

結論:不要將long long轉換爲int。你將失去導致錯誤的數據。轉換你的參數來輸入long。它可以使用int和long int。