Forum: PC-Programmierung [C] Ich verstehe die Welt nicht mehr: Definition zweier Arrays in C innerhalb einer Funktion


von Bernhard N. (bernieserver)


Lesenswert?

Hi,

entweder ich habe einen revolutionären Compilerbug unter VisualStudio 
2008 gefunden oder ich bin einfach nur zu blöd.

Folgendes C (kein C++) - Konsolenprojekt lässt sich nicht kompilieren. 
Es erscheint folgender Compilerfehler:

error C2143: Syntaxfehler: Es fehlt ';' vor 'Typ'

Hier der Code wo es nicht funktioniert
1
#include <stdio.h>
2
#include <string.h>
3
4
int main()
5
{
6
  char myString1[10];
7
  myString1[0] = 'a';
8
  char myString2[10];   //<- Hier Fehler!
9
  return 0;
10
}


Dies aber geht:

1
#include <stdio.h>
2
#include <string.h>
3
4
int main()
5
{
6
  char myString1[10];
7
  char myString2[10];
8
  myString1[0] = 'a'; 
9
  return 0;
10
}


Ich verstehs nicht. Jemand von Euch?

Gruß

Bernhard

von ABC-Schütze (Gast)


Lesenswert?

hmm ich meine es könnte daran liegen, dass alle Variablen-Deklarationen 
am Anfang stehen müssen, in dem Fall wie bei dem 2. Code

von Bernhard H. (Gast)


Lesenswert?

Ja, das ist der Unterschied zwischen C und C++. In C++ dürfen
Variablendeklaration an fast jeder Stelle gemacht werden.
In C nur zu Begin eines Blockes!

Auch folgendes geht in C nicht

for (int i=0; i<10; i++)

ist aber in C++ zulässig.

von Jola (Gast)


Lesenswert?

Je nach Compiler Einstellung kann es sein dass Definitionen immer zuerst 
ergolfen müssen bevor eine Zuweisung vorgenommen wird.

Evtl. gilt das auch nur für MISRA oder ANSI-C, aber da bin ich mir nicht 
mehr sicher.

von Bernhard N. (bernieserver)


Lesenswert?

Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte 
Fehlermeldungen mit dem keiner was anfangen kann!!!

Aber das Forum ist echt Super!

Gruß

Bernhard

von Peter (Gast)


Lesenswert?

die Frage ist ob die englische Meldung besser währe - die deutschen 
Meldungen sind eh nicht zu gebrauchen.

Schlechtes Zeiger lässt grüßen

von ... (Gast)


Lesenswert?

Die Variante, das du in C die Variablen erst mitten im Code deklarierst, 
gibt es erst ab C99 Standard. Den unterstützt der Visual Studio Compiler 
aber nicht.

von Bernhard N. (bernieserver)


Lesenswert?

Ok, danke.

Ist denn folgendes erlaubt?
1
int i;
2
3
mache irgendwas
4
5
if (irgendeinebedingungwahr){
6
7
char array[] test = "bernie"  // Weitere Deklaration und Definition innerhalb einer IF Schleife
8
9
macheweiter
10
11
12
}
13
14
noch was anderes

von Karl H. (kbuchegg)


Lesenswert?

Bernhard N. schrieb:
> Ok, danke.
>
> Ist denn folgendes erlaubt?

Durch die { beginnt hier ein Block.
Und da Variablendefinitionen am Beginn eines Blocks erlaubt sind ...

PS: Es gibt keine IF-Schleife.
Das Wesen einer Schleife besteht darin, dass Code (potentiell) 
wiederholt abgearbeitet wird. Diese Eigenschaft ist es, die eine 
Schleife zu einer Schleife macht.
Bei einem if wird nichts wiederholt. Da wird ausgewählt.

von Bernhard N. (bernieserver)


Lesenswert?

Ach noch was: Ich frage mich ob diese Probleme evtl.bei der 
Programmierung von µC relevant sind. Ich nutze AVR Studio zusammen mit 
dem AVR GCC Compiler. Nutzt der den C99 Standart? Denn ich nutze Visual 
Stio. nur zum Üben und Testen um wieder in C reinzukommen. Ich komme von 
C++.


Gruß

Bernhard

von Bernhard N. (bernieserver)


Lesenswert?

Karl heinz Buchegger schrieb:
>
> PS: Es gibt keine IF-Schleife.

lol klar natürlich. habe mich nur verschrieben.

Gruß

Bernhard und Danke für die Tipps.

von Arc N. (arc)


Lesenswert?

Bernhard N. schrieb:
> Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte
> Fehlermeldungen mit dem keiner was anfangen kann!!!

F1 drücken und lesen... SCNR
http://msdn.microsoft.com/en-us/library/0afb82ta.aspx
1
In a C program, variables must be declared at the beginning 
2
of the function, and they cannot be declared after the function
3
executes non-declaration instructions.
4
5
// C2143j.c
6
7
int main() 
8
{
9
    int i = 0;
10
    i++;
11
    int j = 0; // C2143
12
}

von Klaus (Gast)


Lesenswert?

Keine vernünftiger Compiler benutzt heute einen so veralteten 
C-Standard! Und wenn er es doch tut: Ab in die Tonne mit dem Mist!

von Peter (Gast)


Lesenswert?

was spricht denn dageben, einfach beim testen unter windows die endung 
von C auf CPP zu ändern. Dann wird es halt es C++ kompiliert?

von (prx) A. K. (prx)


Lesenswert?

Klaus schrieb:

> Keine vernünftiger Compiler benutzt heute einen so veralteten
> C-Standard! Und wenn er es doch tut: Ab in die Tonne mit dem Mist!

Wahrscheinlich reicht es aus, den entsprechenden Sprachstandard 
einzustellen. Aber das ist natürlich unzumutbar, also ab in die Tonne. 
Sollen die den Compiler gefälligst so einstellen, dass er auch ohne mein 
zutun alles richtig macht.

von yalu (Gast)


Lesenswert?

In C99 dürfen Deklarationen und Anweisungen auch innerhalb eines Blocks
gemischt werden (wie in C++).

Deswegen zeigt der GCC in dem Beispiel keinen Fehler an. Wenn man ihn
mit -std=c89 und -pedantic auf den alten Standard im Oberlehrermodus
umschaltet, kommt

  test.c:8: warning: ISO C90 forbids mixed declarations and code
  test.c:8: error: expected expression before ‘/’ token

Die erste Meldung dürfte ausreichend aussagekräftig sein, die zweite
bezieht sich auch den nicht standardkonformen Kommentar.

Wenn dein Compiler zwar die auf eine Anweisung folgende Deklaration
anmeckert, nicht aber den //-Kommentar, heißt das, dass er den neuen
(bzw. inzwischen auch schon wieder alten) C99-Standard nur teilweise
implementiert.

von Bernhard N. (bernieserver)


Lesenswert?

Arc Net schrieb:
> Bernhard N. schrieb:
>> Danke! Nun ist alles klar. Aber wiedermal typisch Compiler: Behinderte
>> Fehlermeldungen mit dem keiner was anfangen kann!!!
>
> F1 drücken und lesen... SCNR
> http://msdn.microsoft.com/en-us/library/0afb82ta.aspx
>
>
1
> In a C program, variables must be declared at the beginning
2
> of the function, and they cannot be declared after the function
3
> executes non-declaration instructions.
4
> 
5
> // C2143j.c
6
> 
7
> int main()
8
> {
9
>     int i = 0;
10
>     i++;
11
>     int j = 0; // C2143
12
> }
13
>

Mist, einmal nicht reingeschaut. ^^

Naja es liegt immer an einem selbst.. vor Allem beim Programmieren. 
Frust... ;)

Gruß

Bernhard

von (prx) A. K. (prx)


Lesenswert?

yalu schrieb:

> Die erste Meldung dürfte ausreichend aussagekräftig sein,

Aber wahrscheinlich auch erst, seit GCC den Parser von bison auf 
Handarbeit umgestellt hat. Automatisch generierte Parser sind nicht 
berühmt für derart anwenderfreundliche Fehlermeldungen.

von yalu (Gast)


Lesenswert?

A. K. schrieb:
>> Keine vernünftiger Compiler benutzt heute einen so veralteten
>> C-Standard! Und wenn er es doch tut: Ab in die Tonne mit dem Mist!
>
> Wahrscheinlich reicht es aus, den entsprechenden Sprachstandard
> einzustellen.

Wahrscheinlich gibt es den entsprechenden Umschalter nicht (ich konnte
zumindest per Google auf die Schnelle nichts dergleichen finden). Oder
dieser Schalter fördert hunderte von Bugs in den Standard-Header-Dateien
zutage, so dass man ihn schleunigst wieder zurücknimmt (so war das bspw.
in Visual Studio 6 im C++-Modus).

Wie auch immer: Wäre ein C99-Modus vorhanden und halbwegs konsequent
implementiert, wäre das mit Sicherheit die Defaulteinstellung des
Compilers.

>> Die erste Meldung dürfte ausreichend aussagekräftig sein,
>
>  Aber wahrscheinlich auch erst, seit GCC den Parser von bison auf
>  Handarbeit umgestellt hat.

Kann sein, ich weiß es nicht. Der handgeschriebene Parser ist
mittlerweile auch schon wieder viele Jahre alt.

von (prx) A. K. (prx)


Lesenswert?

yalu schrieb:

> Wahrscheinlich gibt es den entsprechenden Umschalter nicht

Könnte stimmen. Microsoft hat den Fokus offenbar woanders als 
ausgerechnet auf sowas exotischem wie C99, was ja sowieso niemand 
braucht: 
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=333273

Sei's drum, es gibt immer noch Digital Mars. Ist auch weniger agressiv 
bei der Installation.

von P. S. (Gast)


Lesenswert?

Bernhard N. schrieb:
> Ach noch was: Ich frage mich ob diese Probleme evtl.bei der
> Programmierung von µC relevant sind. Ich nutze AVR Studio zusammen mit
> dem AVR GCC Compiler.

Dann nimm einfach den g++. Ich sehe keinen Grund bei neuen Projekten 
unbedingt gcc zu nehmen und auf die kleinen Zusatzfeatures zu 
verzichten, auch wenn man unbedingt auf Klassen verzichten will.

von Arc N. (arc)


Lesenswert?

A. K. schrieb:
> yalu schrieb:
>
>> Wahrscheinlich gibt es den entsprechenden Umschalter nicht
>
> Könnte stimmen. Microsoft hat den Fokus offenbar woanders als
> ausgerechnet auf sowas exotischem wie C99, was ja sowieso niemand
> braucht:
> 
http://connect.microsoft.com/VisualStudio/feedback/ViewFeedback.aspx?FeedbackID=333273
>
> Sei's drum, es gibt immer noch Digital Mars. Ist auch weniger agressiv
> bei der Installation.

Digital Mars unterstützt C99 ebensowenig vollständig (nur "many C99 
features") wie gcc, icc, Open Watcom oder Borland. Die einzigen 
kompatiblen Compiler/Frontends dürften Comeau und clang 
("feature-complete except for the C99 floating-point pragmas") sein.

von (prx) A. K. (prx)


Lesenswert?

Arc Net schrieb:

> features") wie gcc, icc, Open Watcom oder Borland. Die einzigen
> kompatiblen Compiler/Frontends dürften Comeau und clang
> ("feature-complete except for the C99 floating-point pragmas") sein.

Dann ist ja Klaus "Keine vernünftiger Compiler benutzt heute einen so 
veralteten C-Standard!" zufolge nur Comeau überhaupt noch erträglich.

von Sven P. (Gast)


Lesenswert?

Microsoft unterstützt kein C99, bin ich auch schon drüber gestolpert. 
Echt ärgerlich.

Und Comeau zitiert auch Fakten, die schon übergestern überholt waren. 
Wobei Comeau 'wimre' auch noch nicht mal ein C-Compiler ist, sondern 
C++-Quelltext in C umbaut und dann mit einem anderen Compiler übersetzt.

Wobei die GCC dem C99-Standard schon recht nahe gekommen ist, auch wenn 
die GCC selbst (mitsamt der libc) ein riesen 'Clusterf*ck' ist...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.