Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Schnelle objektorientierte, kompilierende Programmiersprache.
Antworten
forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von forumnewbie » Sa Mär 15, 2014 4:57 pm

Hi,

ich verstehe die Fehlermeldung nicht. Spinnt Visual Studio? Unter Linux mit einer einfachen IDE läuft das Programm ohne Fehler und ohne Fehlermeldungen.

Code: Alles auswählen

#include <stdio.h>

void test(int);

int main(){
	int elemente = 5;
	test(elemente);
    return 0;
}

void test(int elemente){
    int array[elemente];
    int i;
    for(i=0;i<elemente;i++){
		array[elemente] = i;
		printf("%d\n", array[elemente]);
	}
}
VS will das Programm nicht kompilieren, weil die IDE anscheinend den Übergabeparameter nicht sieht/erkennt.
Wenn ich statt int array[elemente]; einfach int array[5]; schreibe, dann funktioniert es natürlich. Aber das ist doch in diesem Fall egal. :?:

Hier alle Fehler, die VS ausspuckt:
Konstanter Ausdruck erwartet
Zuordnung eines Arrays der konstanten Größe 0 nicht möglich
'array': Unbekannte Größe
Der Ausdruck muss einen Konstantenwert aufweisen
:shock: :shock: :shock:

EDIT:
Sogar so etwas geht nicht:

Code: Alles auswählen

int a = 10;
int array[a];
Es muss doch auch mit einer Variablen gehen und nicht nur mit einer konstanten Zahl bzw. #define Makro.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von cloidnerux » Sa Mär 15, 2014 5:23 pm

Nein, arrays in C sind immer von einer festen Größe. Diese Größe wird während des Kompilieren festgelegt, daher ist nur eine konstante Zahl erlaubt.
Wenn du dynamische arrays haben willst misst du per malloc Speicher anfordern. Schau die dazu mal Pointer und malloc an.
In sprachen wie C# sind dynamische arrays möglich aufgrund der Funktionsweise der Speicherverwaltung dort.
Redundanz macht wiederholen unnötig.
quod erat expectandum

mfro
Beiträge: 346
Registriert: Mi Jan 16, 2013 4:58 pm

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von mfro » Sa Mär 15, 2014 5:47 pm

cloidnerux hat geschrieben:Nein, arrays in C sind immer von einer festen Größe. Diese Größe wird während des Kompilieren festgelegt, daher ist nur eine konstante Zahl erlaubt.
Wenn du dynamische arrays haben willst misst du per malloc Speicher anfordern. Schau die dazu mal Pointer und malloc an.
In sprachen wie C# sind dynamische arrays möglich aufgrund der Funktionsweise der Speicherverwaltung dort.
Das stimmt so nicht (mehr).

Der Standard C99 definiert "variable length arrays" und gcc kann das auch (wenn -std=c99 definiert ist). VS anscheinend nicht.
It's as simple as that. And remember, Beethoven wrote his first symphony in C.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von forumnewbie » Sa Mär 15, 2014 6:09 pm

Ah, also liegt das an dem veraltetem Standard, die VS 2012 noch benutzt.
Das erklärt dann alles.
Ich würde das jetzt sowieso mit malloc machen. Ich habe ein altes Programm ausgegraben, und dort hatte ich es ähnlich mit variablen Grenzen gemacht, wie in diesem Quellcode, und ich konnte das plötzlich unter VS2012 nicht mehr kompilieren, obwohl es 100% unter Linux lief.
Danke!

canlot
Beiträge: 393
Registriert: Di Mär 08, 2011 11:01 pm
Wohnort: NRW

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von canlot » So Mär 16, 2014 12:38 am

Ich verstehe deine Schleife nicht:

Code: Alles auswählen

for(i=0;i<elemente;i++){
      array[elemente] = i;
      printf("%d\n", array[elemente]);
   }
Du versuchst über den Bereich deines Arrays zu schreiben sehe ich das richtig?
Wenn das Array 5 groß ist, dann sind es 0,1,2,3,4 die du ansprechen kannst, bei dir ist es die 5 weil elemente = 5 ist.
Wahrscheinlich hast du sowas gedacht:

Code: Alles auswählen

for(i=0;i<elemente;i++){
      array[i] = elemente;
      printf("%d\n", array[i]);
   }
Unwissenheit ist ein Segen

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von forumnewbie » So Mär 16, 2014 2:09 pm

Danke für den Hinweis.
Das muss natürlich so lauten:

Code: Alles auswählen

for(i=0;i<elemente;i++){
      array[i] = i;
      printf("%d\n", array[i]);
 }
Ich habe im Index elemente stehen, weil ich testen wollte, ob VS mir diese zwei Zeilen auch rot markiert. Ich habe vergessen diese Änderung rückgängig zu machen - kompilieren wollte er sowieso nicht.

Wenn ich richtig verstehe, unterstützt auch VS in der Version 2012 kein C99 Standard. :? Da kann man nur mit dem Kopf schütteln, weil dieser Standard bereits 1999 veröffentlicht wurde. Oder gibt es dafür einen guten Grund?

PS: Ich glaube die neue VS 2013 unterstützt jetzt C99. Werde mal ausprobieren.

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von forumnewbie » So Mär 16, 2014 2:57 pm

Ich habe gerade VS 2013 installiert und diese IDE scheint wirklich C99 zu unterstützen. Ich konnte das Beispiel problemlos kompilieren und starten! :)

forumnewbie
Beiträge: 80
Registriert: Di Jan 15, 2013 9:02 pm

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von forumnewbie » So Mär 16, 2014 5:44 pm

Ich nehme alles zurück. Als ich das alte VS2012 Projekt mit dem Beispiel geöffnet hatte, hat mir VS2013 vorgeschlagen mein altes Projekt für die aktuelle Version zu optimieren, was ich auch tat. (Vielleicht hätte ich den Rechner nach der Installation neu starten sollen) Danach hat die neue IDE mir diese Stellen nicht mehr markiert und als ich auf F5 (Debugging Starten) geklickt habe, wurde das Programm ohne Fehler ausgeführt. Wahrscheinlich hat es die letzte funktionierenden Version automatisch gestartet - und das war die Version mit einer konstanten Zahl 5. Nachdem ich das Programm geschlossen und später wieder geöffnet habe, erhalte ich wieder die selbe Fehlermeldung. Umsonst VS2012 deinstalliert und die neue Version installiert :( C99 Standard wird anscheinend irgendwie nur zum Teil unterstützt.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von cloidnerux » So Mär 16, 2014 7:28 pm

:( C99 Standard wird anscheinend irgendwie nur zum Teil unterstützt.
Sagt auch der Wikipedia-Artikel zu C99(http://en.wikipedia.org/wiki/C99#Implementations)
Lösung: Entweder du nutzt den MinGW(Gcc) oder verzichtest auf C99 Erweiterungen.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Benutzeravatar
oenone
Beiträge: 223
Registriert: Do Sep 01, 2011 2:42 pm
Wohnort: Bremen
Kontaktdaten:

Re: Fehler: Der Ausdruck muss einen Konstantenwert aufweisen

Beitrag von oenone » Mo Mär 17, 2014 10:56 am

Ja, Microsoft konzentriert sich eher auf C++ und C# und vernachlässigt C ein wenig.

Antworten