mikrocontroller.net

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


Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht 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
#include <stdio.h>
#include <string.h>

int main()
{
  char myString1[10];
  myString1[0] = 'a';
  char myString2[10];   //<- Hier Fehler!
  return 0;
}


Dies aber geht:

#include <stdio.h>
#include <string.h>

int main()
{
  char myString1[10];
  char myString2[10];
  myString1[0] = 'a'; 
  return 0;
}


Ich verstehs nicht. Jemand von Euch?

Gruß

Bernhard

Autor: ABC-Schütze (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard H. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Jola (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: ... (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ok, danke.

Ist denn folgendes erlaubt?
int i;

mache irgendwas

if (irgendeinebedingungwahr){

char array[] test = "bernie"  // Weitere Deklaration und Definition innerhalb einer IF Schleife

macheweiter


}

noch was anderes


Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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
In a C program, variables must be declared at the beginning 
of the function, and they cannot be declared after the function
executes non-declaration instructions.

// C2143j.c

int main() 
{
    int i = 0;
    i++;
    int j = 0; // C2143
}

Autor: Klaus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Bernhard N. (bernieserver)
Datum:

Bewertung
0 lesenswert
nicht 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
>
>
> In a C program, variables must be declared at the beginning
> of the function, and they cannot be declared after the function
> executes non-declaration instructions.
> 
> // C2143j.c
> 
> int main()
> {
>     int i = 0;
>     i++;
>     int j = 0; // C2143
> }
> 

Mist, einmal nicht reingeschaut. ^^

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

Gruß

Bernhard

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: yalu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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...

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

Autor: P. S. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Arc Net (arc)
Datum:

Bewertung
0 lesenswert
nicht 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...
>
> 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.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sven P. (haku) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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...

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.