mikrocontroller.net

Forum: Compiler & IDEs Wie ist es richtig programmiert?


Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!


Wie ist richtig implementiert?
void Test(int a, char b)
{
  char x;
  ...
  Aufruf(&a, &x);
  return;
}
oder
void Test(int a, char b)
{
  char x;
  ...
  
  return Aufruf(&a, &x);
}
wobei
void Aufruf(int* a, char* b)
{
  ...
  return;
}

Danke.

Gruß
Peter

Autor: SynCaANS (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter,

Deine Test-Funktion ist void. Hat also keinen Rückgabewert und somit 
auch kein Return.

Grüße
Step

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> Wie ist richtig implementiert?

Ist das ne Schulaufgabe?
Überleg mal, was void für Rückgabewerte haben kann. :-)

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Was sagt denn dein C-Buch zu diesem Thema?

Wenn eine Funktion void als Rückgabeparameter hat, wie sollte dann ihr 
Rückgabewert und damit mit der Parameter von return aussehen?

Oliver

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nachtrag:

Wenn dir gar nichts zu diesem Thema einfällt, frag deinen Compiler.

Oliver

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
selbst wenn dein return wert (int) ist, gibt es kein "richtig" oder 
"falsch".
Manchmal macht es der Übersicht halber Sinn, einen func call in das 
return zu packen, manchmal nicht.
int fputc(int c, FILE *f) {
  return(SendChar(c));
}
[c]

[c]
int func(int a) {
  int status=0;   // ok

  status = funcA(a);
  ...
  return(status);
}


Der Compiler macht nichts anderes, als dir hier eine Variable (in 
welcher Form auch immer, idR. Register) "einzufügen", in welcher der 
Rückgabewert von SendChar steht, wenn SendChar beendet ist. Dieser Wert 
wird dann von fputc zurückgegeben.


VG,
/th.

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... und wenn dein compiler deinen 2. C block nicht anmeckert, such dir 
besser nen neuen :-)

Autor: Remote One (remote1)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thorstendb schrieb:
> ... und wenn dein compiler deinen 2. C block nicht anmeckert, such dir
> besser nen neuen :-)

Warum? Abgesehen von dem "..." ist das völlig korrektes C++.

Autor: Rufus Τ. Firefly (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Warum? Abgesehen von dem "..." ist das völlig korrektes C++.

Das bezweifle ich:
void Test(int a, char b)
{
  char x;
  ...
  
  return Aufruf(&a, &x);  // was wird hier zurückgegeben?
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
> Rolf Magnus schrieb:
>> Warum? Abgesehen von dem "..." ist das völlig korrektes C++.
>
> Das bezweifle ich:

Ist aber so. Man beachte, daß ich "C++" schrieb, nicht "C". Da wäre das 
nämlich ein Fehler.

> void Test(int a, char b)
> {
>   char x;
>   ...
>
>   return Aufruf(&a, &x);  // was wird hier zurückgegeben?

Nichts.

> }

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. Firefly schrieb:
   return Aufruf(&a, &x);  // was wird hier zurückgegeben?

Na, ein void halt. ;-)
Da auch "Aufruf" den Return-Typ void hat, ist das tatsächlich völlig 
korrekt in C++.

Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@all:

Das void kein Rückgabewert hat ist mir bekannt. Demnach sollte 
theoretisch auch das erlaubt sein:
void Test(int a, char b)
{
  char x;
  ...
  Aufruf(&a, &x);
}
(gänzlich ohne "return")

@thorstendb:
Bei deinen Beispielen erwartet der Compiler einen Rückgabewert. Bei void 
nicht...

@Remote One:
Dein Link verweist auf das C#-Programmierhandbuch.

Autor: tested (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thorstendb schrieb:
> ... und wenn dein compiler deinen 2. C block nicht anmeckert, such dir
> besser nen neuen :-)

Hm, dann muss ich jetzt wohl den gcc 'wegwerfen'.
Gibt bei mir noch nicht mal eine Warnung, scheint also korrektes C zu 
sein.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> Demnach sollte
> theoretisch auch das erlaubt sein:
> ...

Ist es auch praktisch.

Aber trotzdem solltest du jetzt erst einmal klarstellen, um welche 
Sprache es nun eigentlich geht: C, C++, C#, ...

Oliver

Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oliver schrieb:
> Aber trotzdem solltest du jetzt erst einmal klarstellen, um welche
> Sprache es nun eigentlich geht: C, C++, C#, ...

C

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
du hast recht, man kann tatsächlich (void) return-en.
Ich hatte eher etwas wie dieses erwartet:
error C2562: 'func' : 'void' function returning a value

Dass man einen (void *) zurückgibt, macht Sinn, das ist tatsächlich ein 
pointer, vgl. malloc). Aber wozu sollte man einen (void) zurückgeben? 
Was "kommt" da? Was soll das? **verwirrt**
void func2() {
  return((void) 42);
}

void func(void) {
  return(func2());
}

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
... oder macht das gar keinen Sinn, sondern ist lediglich Typenkorrekt?

Autor: 6to4 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das hier hingegen:

thorstendb schrieb:
> return(status);

Macht jedoch nie Sinn und zeugt nur von einem mangelhaften 
Sprachverständniss, obwohl oft gesehen...

"return" ist ein Operator, keine Funktion o.Ä.

return(42) + 23;

macht dasselbe wie

return 42 + 23;
und
return (42 + 23);

und das ist was anderes als

return 42;

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tested schrieb:
> Hm, dann muss ich jetzt wohl den gcc 'wegwerfen'.
> Gibt bei mir noch nicht mal eine Warnung, scheint also korrektes C zu
> sein.

>../test.c:20: warning: ISO C forbids 'return' with expression, in >function 
returning void

Soviel dazu.
Allerdings kommt die Warnung nur mit -pedantic, und wer ist das schon ;)

Oliver

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
tested schrieb:
> scheint also korrektes C zu sein.

Daraus, daß gcc (oder irgendein beliebiger Compiler) es akziptiert, kann 
man nicht zwingend darauf schließen, daß der Code korrekt ist. Die beste 
Referenz dazu ist noch Comeau. Mit dessen online-Compiler kann man sowas 
auch mal testen, ohne den gleich zu kaufen.
Siehe http://www.comeaucomputing.com/tryitout/
Und der sagt dann im C-Modus auch prompt:
"ComeauTest.c", line 10: error: a void function may not return a value
    return Aufruf(&a, &x);
           ^

1 error detected in the compilation of "ComeauTest.c".

thorstendb schrieb:
> Dass man einen (void *) zurückgibt, macht Sinn, das ist tatsächlich ein
> pointer, vgl. malloc). Aber wozu sollte man einen (void) zurückgeben?

Das würde in C tatsächlich nichts bringen. In C++ wurde das erlaubt, vor 
allem für Templates. Da ist es geschickt, wenn man void nicht als 
Sonderfall behandeln muß, sondern einfach den Rückgabewert einer 
Funktion weiterreichen kann, selbst wenn der void ist.

Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
thorstendb schrieb:
> return((void) 42)

Sowas mache ich doch gar nicht!?

6to4 schrieb:
> Das hier hingegen:
>
> thorstendb schrieb:
>> return(status);
>
> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften
> Sprachverständniss, obwohl oft gesehen...

Verstehe nicht, wo da der Fehler liegen sollte...

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> zeugt nur von einem mangelhaften Sprachverständniss
nope, hier handelt es sich nicht um "mangelhaftes Sprachverständniss", 
sondern nur darum, dass ich es schöner lesbar finde, und damit sicher 
nicht der einzige bin.

Autor: thorstendb (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> thorstendb schrieb:
> > return((void) 42)
> Sowas mache ich doch gar nicht!?
...war nur ein Test der Möglichkeiten.

Nachtrag:
> zeugt nur von einem mangelhaften Sprachverständniss
Ich finde es echt krass, wie schnell man hier niedergemacht wird...

Autor: Mark Brandis (markbrandis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
>> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften
>> Sprachverständniss, obwohl oft gesehen...
>
> Verstehe nicht, wo da der Fehler liegen sollte...

Das hier: ()

ist der Operator für Funktionsaufrufe. Außerdem werden runde Klammern 
für arithmetische Ausdrücke verwendet, wie in der Mathematik:
(a + 3 ) / 2

Und zuguterletzt werden die Klammern auch für Kontrollausdrücke 
verwendet, wie bei if() und switch().

Bei "return status;" wird weder eine Funktion aufgerufen noch ein 
arithmetischer Ausdruck geklammert noch sonstwas. Wo Klammern keinen 
Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)

Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mark Brandis schrieb:
> Peter R. schrieb:
>>> Macht jedoch nie Sinn und zeugt nur von einem mangelhaften
>>> Sprachverständniss, obwohl oft gesehen...

Also nur noch mal zur Klarstellung:
Das habe ich  nicht gesagt!

Mark Brandis schrieb:
> Wo Klammern keinen
> Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)

Aber schaden tun sie doch auch nicht wirklich...
Wenn es also für ihn übersichtlicher ist, spricht IMHO nichts dagegen.

Autor: teto (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
>> Wo Klammern keinen
>> Sinn haben, darf man sie ruhig guten Gewissens nicht verwenden :-)
> Aber schaden tun sie doch auch nicht wirklich...
> Wenn es also für ihn übersichtlicher ist, spricht IMHO nichts dagegen.
Du wolltest Kritik und dann kannst du dir hier in diesem Forum sicher 
sein, dass du sie bekommst. ;-)
Ich würde die Klammern selbst auch nur dann hinter ein return setzen, 
wenn es nötig ist. Es ist aber zu bezweifeln, dass jemand anfängt nach 
der Funktion return() zu suchen und selbst wenn, dann sollte er das 
C-Buch nochmal von vorne beginnen. ;-)

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

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:

> Aber schaden tun sie doch auch nicht wirklich...

Schaden nicht. Sie bringen aber auch nichts.
Du schreibst ja auch nicht
   i = (5);

Autor: Peter R. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
teto schrieb:
> Du wolltest Kritik und dann kannst du dir hier in diesem Forum sicher
> sein, dass du sie bekommst.

Ich wollte keine Kritik, außer konstruktive.

teto schrieb:
> Es ist aber zu bezweifeln, dass jemand anfängt nach
> der Funktion return() zu suchen und selbst wenn, dann sollte er das
> C-Buch nochmal von vorne beginnen.

Selbt ich hätte nicht nach einer Funktion return gesucht. Und das hat 
was zu bedeuten! ;)

Karl Heinz Buchegger schrieb:
> Schaden nicht. Sie bringen aber auch nichts.

Richtig. Dennoch finde ich es mehr als übertrieben gleich von 
"mangelhaften Sprachverständniss" zu sprechen!

Autor: remote1 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> @Remote One:
>
> Dein Link verweist auf das C#-Programmierhandbuch.

Mir ging es auch eher um diesen Abschnitt:
"Methoden können dem Aufrufer einen Wert zurückgeben. Wenn der 
Rückgabetyp (der vor dem Methodennamen angezeigte Typ) nicht void ist, 
kann die Methode den Wert mithilfe des return-Schlüsselworts 
zurückgeben. Durch eine Anweisung, die aus dem return-Schlüsselwort und 
einem Wert besteht, der mit dem Rückgabetyp übereinstimmt, wird der Wert 
an den Methodenaufrufer zurückgegeben. Das return-Schlüsselwort beendet 
außerdem die Ausführung der Methode. Wenn der Rückgabetyp void ist, 
können Sie mit einer return-Anweisung ohne Wert die Ausführung der 
Methode beenden. !

Autor: Clown (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und der Vollständigkeit wegen - das sagt der ANSI Standard:
3.6.6.4 The return statement

Constraints

   A return statement with an expression shall not appear in a
function whose return type is void .

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Peter R. schrieb:
> teto schrieb:
>> Es ist aber zu bezweifeln, dass jemand anfängt nach
>> der Funktion return() zu suchen und selbst wenn, dann sollte er das
>> C-Buch nochmal von vorne beginnen.
>
> Selbt ich hätte nicht nach einer Funktion return gesucht. Und das hat
> was zu bedeuten! ;)

Umgekehrt kann es aber sein, daß jemand nach return-Anweisungen in einer 
Funktion sucht und auf den ersten Blick eine übersieht, weil er sie beim 
Überfliegen aufgrund der Klammern als Funktionsaufruf fehlinterpretiert. 
Erst beim zweiten Hinsehen merkt er dann, daß es gar kein 
Funktionsaufruf ist, sondern ein als solcher getarntes return.
Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion 
retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)

remote1 schrieb:
>> Dein Link verweist auf das C#-Programmierhandbuch.
>
> Mir ging es auch eher um diesen Abschnitt:

Der ist aber für C nicht relevant.

> "Methoden

... gibt es in C nicht.

Ich könnte auch aus der C++-Norm die Passage zitieren, die zeigt, daß es 
durchaus erlaubt ist, das "Ergebnis" einer void zurückliefernden 
Funktion selbst per return weiterzuleiten. Ist aber für C genausowenig 
relevant.

Autor: meckermensch (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rolf Magnus schrieb:
> Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion
> retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)
Bring mich nicht auf dumme Gedanken! Wie erwartet gehts leider nicht:
> error: syntax error before "return"
Oder ist der Tippfehler (retRun) Absicht?

Aber wenn man jemanden (besonders Anfänger!) ärgern will:

Opfer arbeitet an einem "hochkomplexen" Projekt (stark gekürzt ;-)):
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>

int foo(void);
void bar(void);
void blub(void);

int main(void)
{
  int i=foo();
  bar();
  blub();
  return 0;
}

int foo(void)
{
  printf("foo\n");
  return 1;
}

void bar(void)
{
  printf("bar\n");
  return;
}

void blub(void)
{
  printf("blub blub\n");
}
Alles prima.

Jetzt folgende Zeile gut verstecken (in irgendeinem Header z.B.)
> #define return Sleep(1000); return
und plötzlich ist das Programm seeeeehr langsam...

SCNR

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
meckermensch schrieb:
> Rolf Magnus schrieb:
>> Man könnte sich zur Verwirrung auch den Spaß machen, eine Funktion
>> retrun zu schreiben, die am Ende jeder Funktion aufgerufen wird ;-)
> Bring mich nicht auf dumme Gedanken! Wie erwartet gehts leider nicht:
>> error: syntax error before "return"
> Oder ist der Tippfehler (retRun) Absicht?

Ja, der ist Absicht. Es sollte nur ein Funktionsname sein, der dem 
"return" möglichst ähnlich sieht.

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.