amiga-news ENGLISH VERSION
.
Links| Forum| Kommentare| News melden
.
Chat| Umfragen| Newsticker| Archiv
.

amiga-news.de Forum > Programmierung > Unterschied zw. C und C++: Deklaration in while()? [ - Suche - Neue Beiträge - Registrieren - Login - ]

-1- [ - Beitrag schreiben - ]

21.07.2011, 23:37 Uhr

Reth
Posts: 1858
Nutzer
Hallo zusammen,

warum klappt das Folgende in C++, aber nicht in C (Codebench und AOS4 SDK)?
C code:
...
while (struct IntuiMessage *my_message = (struct IntuiMessage *)GetMsg(window->UserPort))
{
    ReplyMsg((struct Message *)my_message);
...

Compiler sacht: expected expression before 'struct'

Ja wieso das denn?

[ - Antworten - Zitieren - Direktlink - ]

21.07.2011, 23:59 Uhr

Thore
Posts: 2266
Nutzer
In ANSI C kannst Du keine Dateitypen deklarieren oder Variablen definieren innerhalb Codesegmente.
Du musst folgendes auslagern:
struct IntuiMessage *my_message;

dann in der while Schleife:
while (my_message = (struct IntuiMessage *)GetMsg(window->UserPort))

allerdings ist das nicht (immer) das gleiche: Wird in einem Code-Segment eine Variable deklariert/definiert wie z.B. for (int i = 0; ...
dann gilt diese Variable nur in diesem Segment.
In ANSI C gilt die Variable in der ganzen Funktion, da sie dort auch definiert wird. Achtet man auf dieses, lässt sich das Programm recht einfach umschreiben.

[ - Antworten - Zitieren - Direktlink - ]

22.07.2011, 00:15 Uhr

Reth
Posts: 1858
Nutzer
@Thore:
Hab schon -std=c99 als Compilerflag angegeben, damit ist so etwas wie for (int i = 0; ... möglich, das o.a. Beispiel aber nicht! Das ist doch inkonsistent, oder nicht?

Ist dann bei der Nutzung von for (int i = 0; ... die Variable i auch in der ganzen Funktion bekannt und mit dem letzten Wert nach Schleifenende belegt (das wär ja was!)?

[ - Antworten - Zitieren - Direktlink - ]

22.07.2011, 12:59 Uhr

Thore
Posts: 2266
Nutzer
> Hab schon -std=c99 als Compilerflag angegeben, damit ist so etwas wie for (int i = 0; ... möglich, das o.a. Beispiel aber nicht! Das ist doch inkonsistent, oder nicht?

Theopraktisch hast Du recht, allerdings weiß ich nicht ob dein Compiler das mit structs ebenfalls rafft. Auslagern ist hier ein denkbarer Weg, der auch nicht weh tut.

> Ist dann bei der Nutzung von for (int i = 0; ... die Variable i auch in der ganzen Funktion bekannt und mit dem letzten Wert nach Schleifenende belegt (das wär ja was!)?

Nein, nur in dem Codesegment, sprich innerhalb der for Schleife. Um die Variable später gültig zu machen muss sie in der for-schleife auf eine "Funktionsglobale" Variable kopiert werden, oder für die for Schleife von Anfang an solch eine verwenden.


[ - Antworten - Zitieren - Direktlink - ]

22.07.2011, 17:09 Uhr

akl
Posts: 265
Nutzer
@Thore:

>In ANSI C kannst Du keine Dateitypen deklarieren oder Variablen
>definieren innerhalb Codesegmente.
Doch, klar.

>Wird in einem Code-Segment eine Variable deklariert/definiert
Aha, also doch.

Der Unterschied ist, dass ein Schleifenkopf streng genommen kein Segment einleitet (das beginnt erst nach der geschweiften Klammer).

C99 vereinfacht das für den häufigsten Fall.

[ - Antworten - Zitieren - Direktlink - ]

22.07.2011, 17:16 Uhr

akl
Posts: 265
Nutzer
@Reth:
>damit ist so etwas wie for (int i = 0; ... möglich, das o.a. Beispiel
>aber nicht! Das ist doch inkonsistent, oder nicht?

Würde ich so nicht sagen. In einer for-Schleife wird typischerweise etwas von einem Startwert inkrementell aus hochgezählt. In einer While-Schleife macht man typischerweise etwas anderes.

Das, was Du in der while-Schleife machst, würde ohne doppelte Klammerung bei den meisten Compilern heute auch eine Warning werfen: der Compiler würde denken, Du meintest "==" und nicht "=". Also ist es kein typischer Fall...

(Ok, ich persönlich würde das auch so machen, aber das ist ein anderes Thema.)

Was jedenfalls ginge, wäre:

{
struct IntuiMessage *my_message; while(my_message = (struct IntuiMessage *)GetMsg(window->UserPort))
{
ReplyMsg((struct Message *)my_message);
} }

[ - Antworten - Zitieren - Direktlink - ]

23.07.2011, 00:51 Uhr

Holger
Posts: 8116
Nutzer
Zitat:
Original von Reth:
@Thore:
Hab schon -std=c99 als Compilerflag angegeben, damit ist so etwas wie for (int i = 0; ... möglich, das o.a. Beispiel aber nicht! Das ist doch inkonsistent, oder nicht?

Nein, das ist sogar ziemlich konsistent, wenn man die dahinterstehenden Regeln kennt.

while erwartet in den Klammern einen Ausdruck der zu einem logischen Resultat (0 oder nicht 0) evaluiert werden kann. Die Anweisung Typ name=wert; ist kein solcher Ausdruck. (Im Gegensatz zur Zuweisung ohne Deklaration name=wert, das darf man nicht verwechseln)

In for dagegen gibt es drei durch Semikolon getrennte Elemente, wobei das erste eine Anweisung (die auch ein Ausdruck sein kann) und das zweite der logische Ausdruck ist.

for(;int i=0;) kannst Du genausowenig wie while(int i=0) schreiben. Und das wäre wiederum dasselbe.

--
Good coders do not comment. What was hard to write should be hard to read too.

[ - Antworten - Zitieren - Direktlink - ]

23.07.2011, 01:05 Uhr

Reth
Posts: 1858
Nutzer
Danke für eure Erläuterungen! Damit hab ich dieses Thema glaub ich kapiert!

[ - Antworten - Zitieren - Direktlink - ]


-1- [ - Beitrag schreiben - ]


amiga-news.de Forum > Programmierung > Unterschied zw. C und C++: Deklaration in while()? [ - Suche - Neue Beiträge - Registrieren - Login - ]


.
Impressum | Datenschutzerklärung | Netiquette | Werbung | Kontakt
Copyright © 1998-2024 by amiga-news.de - alle Rechte vorbehalten.
.