2016-04-23 72 views
0

我有下面的代碼片段:Ç - 設置一個靜態變量的值,如果取消設置

#include<stdio.h> 
void read(int a[ ],int n) 
{ 
     static int p=n; 
     if(n!=0) 
     { 
      printf("enter element %d: ",p-n); 
      scanf("%d",&a[p-n]); 
      read(a,n-1); 
     } 
} 
int main() 
{ 
    int a[10],n; 
    printf("enter n: "); 
    scanf("%d",&n); 
    read(a,n); 
} 

我不斷收到error: initializer element is not constant。 函數編譯時不是n常量嗎?

編輯: 問題:如何在函數中設置靜態變量的值(如果沒有設置)?

+3

這是因爲你不能用另一個變量初始化一個靜態變量,只有在編譯時才能確定的常量值。 – ddz

+2

答案是否定的。它不是常量,是一個變量,傳遞給一個函數。在C中,通過使用'#define n 10'可以使編譯時間保持不變。此外,這個參數有幾個帖子,請參閱http://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying-to-initialize-variable-w –

+1

' static int p = n;' - >'static int p;如果(!p)p = n;' – BLUEPIXY

回答

2

絕對不是;編譯器如何知道在編譯時哪些值將被分配給n?

1

編輯:解決辦法是分配給pn如果p未設置

解決方案:

#include<stdio.h> 
static int p; 
void read(int a[ ],int n) 
{ 
    //p=n; //to change n on each call 
    if(!p) p = n; //to change n only if p is unset 
     if(n!=0) 
     { 
      printf("enter element %d: ",p-n); 
      scanf("%d",&a[p-n]); 
      read(a,n-1); 
     } 
} 
int main() 
{ 
    int a[10],n; 
    printf("enter n: "); 
    scanf("%d",&n); 
    read(a,n); 
} 
+0

感謝您的幫助,但那不是我所需要的,因爲p每次都需要一個新的n。 – user6019827

+0

究竟是什麼問題?你不想讓每個循環獲得n值嗎? –

+0

不,我希望它只取第一個n,所以p-n用作數組的索引。 – user6019827

4

這是因爲你不能與其他可變初始化一個static變量,只與的常量值即可確定編譯時間,如mac ros,literals等

2

I keep getting the error: initializer element is not constant.

全局變量和靜態變量只能在編譯時已知的常量表達式進行初始化。

Isn't n constant by the time the function compiles?

答案是否定的。 n存儲從stdin收到的價值。因此,它在運行時收到該值。