2016-04-23 6 views
0

Ich habe den folgenden Code-Schnipsel:C - Setzen Sie den Wert eines statischen Variablen, wenn nicht gesetzt

#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); 
} 

Ich halte die error: initializer element is not constant bekommen. Ist die Konstante nicht konstant, wenn die Funktion kompiliert wird?

Bearbeiten: Problem: Wie den Wert einer statischen Variablen (wenn es nicht festgelegt ist) innerhalb einer Funktion festlegen?

+3

Es ist, weil Sie eine statische Variable mit einer anderen Variablen nicht initialisieren können, nur konstante Werte, die zur Kompilierzeit bestimmt werden können. – ddz

+2

Die Antwort ist nein. Es ist nicht konstant, ist eine Variable, die an eine Funktion übergeben wird. In C können Sie eine Kompilierzeitkonstante verwenden, indem Sie '#define n 10' verwenden. Es gibt auch mehrere Post zu diesem Argument, siehe zum Beispiel http://stackoverflow.com/questions/3025050/error-initializer-element-is-not-constant-when-trying-to-initialize-variable-w –

+1

' statisch int p = n; '->' statisch int p; if (! p) p = n; ' – BLUEPIXY

Antwort

2

Ganz sicher nicht; Woher weiß der Compiler, welcher Wert zur Kompilierzeit n zugewiesen wird?

1

Edit: Die Lösung ist p-n zuweisen nur, wenn p ungesetzt ist

Lösung:

#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

Danke für Ihre Hilfe, aber das war nicht das, was ich brauchte, weil p einen neuen Aufruf braucht. – user6019827

+0

Was genau ist das Problem? Willst du nicht, dass p in jeder Schleife den Wert n erhält? –

+0

Nein, ich wollte, dass es nur das erste n nimmt, also wird p-n als Index für das Array verwendet. – user6019827

4

Es ist, weil Sie eine static Variable mit einem anderen Variable nicht initialisiert werden kann, nur mit konstante Werte, die bei Kompilierungszeit, wie Mac bestimmt werden kann B.

2

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

Globale und statische Variablen können nur mit Konstantenausdrücken initialisiert werden, die zur Kompilierzeit bekannt sind.

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

Die Antwort ist nein. Das n speichert den Wert, der von stdin empfangen wird. Daher empfängt es den Wert während der Laufzeit.

Verwandte Themen