www.mikrocontroller.net

Forum: Compiler & IDEs Funktionsargumente / Default-Argumente


Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
uint8_t myfunction ( uint8_t a, uint8_t b = 10)
{
     return a + b;
}

int main (void)
{
     uint8_t erg1, erg2;

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

.
.
.
}

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

TT

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

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

Autor: Heiko (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

.
.
.
}

Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

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

Bewertung
0 lesenswert
nicht 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++]

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

Bewertung
0 lesenswert
nicht 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 );

Autor: TT (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Ein weit verbreiteter Irrtum.

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

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: A.K. (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

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.