amiga-news DEUTSCHE VERSION
.
Links| Forums| Comments| Report news
.
Chat| Polls| Newsticker| Archive
.

amiga-news.de Forum > Programmierung > Unterschied zw. C und C++: Deklaration in while()? [ - Search - New posts - Register - Login - ]

-1- [ - Post reply - ]

2011-07-21, 23:37 h

Reth
Posts: 1858
User
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?

[ - Answer - Quote - Direct link - ]

2011-07-21, 23:59 h

Thore
Posts: 2266
User
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.

[ - Answer - Quote - Direct link - ]

2011-07-22, 00:15 h

Reth
Posts: 1858
User
@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!)?

[ - Answer - Quote - Direct link - ]

2011-07-22, 12:59 h

Thore
Posts: 2266
User
> 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.


[ - Answer - Quote - Direct link - ]

2011-07-22, 17:09 h

akl
Posts: 265
User
@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.

[ - Answer - Quote - Direct link - ]

2011-07-22, 17:16 h

akl
Posts: 265
User
@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);
} }

[ - Answer - Quote - Direct link - ]

2011-07-23, 00:51 h

Holger
Posts: 8116
User
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.

[ - Answer - Quote - Direct link - ]

2011-07-23, 01:05 h

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

[ - Answer - Quote - Direct link - ]


-1- [ - Post reply - ]


amiga-news.de Forum > Programmierung > Unterschied zw. C und C++: Deklaration in while()? [ - Search - New posts - Register - Login - ]


.
Masthead | Privacy policy | Netiquette | Advertising | Contact
Copyright © 1998-2024 by amiga-news.de - all rights reserved.
.