Forum: Compiler & IDEs Wie ist es richtig programmiert?


von Peter R. (Gast)


Lesenswert?

Hallo!


Wie ist richtig implementiert?
1
void Test(int a, char b)
2
{
3
  char x;
4
  ...
5
  Aufruf(&a, &x);
6
  return;
7
}
oder
1
void Test(int a, char b)
2
{
3
  char x;
4
  ...
5
  
6
  return Aufruf(&a, &x);
7
}
wobei
1
void Aufruf(int* a, char* b)
2
{
3
  ...
4
  return;
5
}

Danke.

Gruß
Peter

von SynCaANS (Gast)


Lesenswert?

Hallo Peter,

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

Grüße
Step

von Floh (Gast)


Lesenswert?

Peter R. schrieb:
> Wie ist richtig implementiert?

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

von Oliver (Gast)


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

von Oliver (Gast)


Lesenswert?

Nachtrag:

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

Oliver

von thorstendb (Gast)


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.
1
int fputc(int c, FILE *f) {
2
  return(SendChar(c));
3
}
4
[c]
5
6
[c]
7
int func(int a) {
8
  int status=0;   // ok
9
10
  status = funcA(a);
11
  ...
12
  return(status);
13
}


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.

von thorstendb (Gast)


Lesenswert?

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

von Remote O. (remote1)


Lesenswert?


von Rolf Magnus (Gast)


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++.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

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

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

von Rolf Magnus (Gast)


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.

> }

von Stefan E. (sternst)


Lesenswert?

Rufus Τ. Firefly schrieb:
1
   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++.

von Peter R. (Gast)


Lesenswert?

@all:

Das void kein Rückgabewert hat ist mir bekannt. Demnach sollte 
theoretisch auch das erlaubt sein:
1
void Test(int a, char b)
2
{
3
  char x;
4
  ...
5
  Aufruf(&a, &x);
6
}
(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.

von tested (Gast)


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.

von Oliver (Gast)


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

von Peter R. (Gast)


Lesenswert?

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

C

von thorstendb (Gast)


Lesenswert?

du hast recht, man kann tatsächlich (void) return-en.
Ich hatte eher etwas wie dieses erwartet:
1
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**
1
void func2() {
2
  return((void) 42);
3
}
4
5
void func(void) {
6
  return(func2());
7
}

von thorstendb (Gast)


Lesenswert?

... oder macht das gar keinen Sinn, sondern ist lediglich Typenkorrekt?

von 6to4 (Gast)


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;

von Oliver (Gast)


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

von Rolf Magnus (Gast)


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:
1
"ComeauTest.c", line 10: error: a void function may not return a value
2
    return Aufruf(&a, &x);
3
           ^
4
5
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.

von Peter R. (Gast)


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...

von thorstendb (Gast)


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.

von thorstendb (Gast)


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...

von Mark B. (markbrandis)


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 :-)

von Peter R. (Gast)


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.

von teto (Gast)


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. ;-)

von Karl H. (kbuchegg)


Lesenswert?

Peter R. schrieb:

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

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

von Peter R. (Gast)


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!

von remote1 (Gast)


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. !

von Clown (Gast)


Lesenswert?

Und der Vollständigkeit wegen - das sagt der ANSI Standard:
1
3.6.6.4 The return statement
2
3
Constraints
4
5
   A return statement with an expression shall not appear in a
6
function whose return type is void .

von Rolf Magnus (Gast)


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.

von meckermensch (Gast)


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 ;-)):
1
#include <stdio.h>
2
#include <stdlib.h>
3
#include <windows.h>
4
5
int foo(void);
6
void bar(void);
7
void blub(void);
8
9
int main(void)
10
{
11
  int i=foo();
12
  bar();
13
  blub();
14
  return 0;
15
}
16
17
int foo(void)
18
{
19
  printf("foo\n");
20
  return 1;
21
}
22
23
void bar(void)
24
{
25
  printf("bar\n");
26
  return;
27
}
28
29
void blub(void)
30
{
31
  printf("blub blub\n");
32
}
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

von Rolf Magnus (Gast)


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.

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.