Forum: Compiler & IDEs Funktionsargumente / Default-Argumente


von TT (Gast)


Lesenswert?

Hallo,

ich wollte gerade eine Funktion schreiben die ein Funktions-Argument 
beinhaltet, leider bringt mir der avr-gcc jetzt Fehler. des wegen nun 
meine Frage ist ein Programmierung mit Funktions-Argumenten beim avr-gcc 
überhaupt möglich?

mein Programm sieht prinzipell folgender massen aus:
1
uint8_t myfunction ( uint8_t a, uint8_t b = 10)
2
{
3
     return a + b;
4
}
5
6
int main (void)
7
{
8
     uint8_t erg1, erg2;
9
10
     erg1 = myfunction(10);       // erg1 = 20
11
     erg2 = myfunction(10, 1);    // erg2 = 11
12
13
.
14
.
15
.
16
}

wie gesagt das ist nur rein prinzipell, aber müsste nach meinem 
bisherigen C-Verständnis doch eigentlich funktionieren oder?
MFG

TT

von Karl H. (kbuchegg)


Lesenswert?

Ich bin zwar über C99 nicht so orientiert, aber dass
es da Default Argumente gibt, wäre mir neu.

von Heiko (Gast)


Lesenswert?

Hi TT,
sinnvoller ist es so, da eine Zuweisung in der Funktionsdefinition nicht 
möglich ist, aber auch keinen Sinn macht. Entweder definiere ich eine 
feste Variable in der Funktion, oder ich übergebe der Funktion beide 
Variablen.

uint8_t myfunction ( uint8_t a, uint8_t b)
{
     return a + b;
}

int main (void)
{
     uint8_t erg1, erg2;

     erg1 = myfunction(10, 10);   // erg1 = 20
     erg2 = myfunction(10, 1);    // erg2 = 11

.
.
.
}

von TT (Gast)


Lesenswert?

hi,
also das ganze geht nicht wie ich es mir gedacht habe, weil es 
default-argumente nur in C++ gibt aber nicht in C.

@ heiko
es stimmt in diesem Beispiel würde ein Default-argument kein sinn 
machen,
aber es gibt ne Menge Beispiele wo Default-argumente einem das leben 
einfacher machen könnten.
Bei berechnungen wie im Beispiel würde es natürlich erst sinn machen 
wenn man mehr als zwei Variablen hat und die folgeden dann dann als 
Default-argument macht und auf 0 setzt.

MFG
TT

von Karl H. (kbuchegg)


Lesenswert?

simulieren kannst du das mittels

void foo_1( int a )
{
  foo_2( a, 20 );
}

void foo2( int a, int b )
{
  ...
}

je nachdem ob man 1 Parameter oder 2 hat, ruft man
entweder foo_1 oder foo_2 auf. Ist nicht wirklich
schön, erfüllt aber seinen Zweck. Auch hier ist
C++ wieder einen Schritt voraus, das die Funktionen
foo_1 und foo_2 denselben Namen foo haben könnten:

[C++]
void foo( int a )
{
  foo( a, 20 );
}

void foo( int a, int b )
{
  ...
}
[/C++]

von Karl H. (kbuchegg)


Lesenswert?

TT wrote:
> aber es gibt ne Menge Beispiele wo Default-argumente einem das leben
> einfacher machen könnten.

Das stimmt. Solche Fälle gibt es. Allerdings sind es eher
wenige und auch ohne Default Argumente kann man gut leben.

Nehmen wir beispielsweise die Funktion itoa.
Die übliche Implementierung enthält als letzten
Parameter die Basis des Zahlensystems in dem itoa
das Ergebnis darstellen soll. Hand aufs Herz: Meistens
ist das 10. Hier würde ein Default Argument mit 10 schon
Sinn machen.

char* itoa ( int zahl, char *string, int radix = 10 );

von TT (Gast)


Lesenswert?

klar kann man ohne Default Argumente auch gut leben...
aber wir wissen ja alle wenn man sich erst mal an etwas gewöhnt hat will 
man es auch weiterhin wenn möglich benutzen.


und das C++ gegenüber C teilweise ein paar Schritt vorraus ist, ist 
logisch, ich mein wäre bedenktlich wenn es nicht so wäre, da C++ ja 
"nur" die Weiterentwicklung von C ist.
C# ist ja gegenüber C++ auch in machen Dingen ein paar schritte vorraus, 
aber auch hier ist C# ja auch nur die Weiterentwicklung.
( das # stellt ja auch nur vier + da die in einer bestimmten Weise 
angeordnet sind, da man C++++ nicht gescheit aussprechen könnt)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

TT wrote:

> und das C++ gegenüber C teilweise ein paar Schritt vorraus ist, ist
> logisch, ich mein wäre bedenktlich wenn es nicht so wäre, da C++ ja
> "nur" die Weiterentwicklung von C ist.

Ein weit verbreiteter Irrtum.  Es ist eine andere Sprache, mit anderen
Zielen, die sich lediglich einen Teil der Syntax mit C teilt.

Ich könnte auch behaupten, dass C99 C++ teilweise einen Schritt voraus
wäre, nur weil es die Initialisierung von benannten Teilen eines
Arrays oder einer Structure unterstützt.

von A.K. (Gast)


Lesenswert?

> Ein weit verbreiteter Irrtum.

Man kann sie aber so verwenden. Finde ich im µC-Kontext auch garnicht so 
verkehrt.

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

A.K. wrote:

> Man kann sie aber so verwenden. Finde ich im µC-Kontext auch garnicht so
> verkehrt.

Du meinst: man kann auch mit C++ Pseudo-C programmieren.

Ja, das geht.  Ist halt nur nicht Sinn der Sache, und man muss dessen
gewärtig sein, dass das Wort "struct" eben dort eine Klassendefinition
bewirkt.

Man kann auch mit C objektorientiert programmieren.  Hat zum Beispiel
der X11-Toolkit (Athena, Xt) gemacht.  Ist allerdings wirklich alles
andere als nett.

von A.K. (Gast)


Lesenswert?

> Ist halt nur nicht Sinn der Sache, und man muss dessen
> gewärtig sein, dass das Wort "struct" eben dort eine
> Klassendefinition bewirkt.

Schadet nicht, aber warum muss man? Was ist der Unterschied (d.h. was 
geht in C aber nicht in C++)?

Der einzige Unterschied liegt m.W. im impliziten typedef, und da frisst 
ein C++ Compiler eben deshalb ausnahmsweise auch die Variante typedef 
struct S { ... } S;" ohne zu meckern.

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.