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_tmyfunction(uint8_ta,uint8_tb=10)
2
{
3
returna+b;
4
}
5
6
intmain(void)
7
{
8
uint8_terg1,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
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
.
.
.
}
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
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++]
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 );
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)
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.
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.
> 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.