www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik Funktion max. Anzahl Argumente in C


Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

einer Funktion "leitung" müsste ich vier Argumente (Pointer) übergeben.
Das sieht so aus:

void leitung(uint8_t *piT, uint8_t *piS, uint8_t *ipL, uint8_t *pAS)

Der C-Compiler meckert "... zu viele Atgumente .."

Kann C nur drei Argumente? Wenn ja, wie macht man das dann?

Autor: celine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
da stimmen sehr wahrscheinlich prototyp und funktionsaufruf nicht 
überein.
check mal wieviele parameter du im prototyp angegeben hast.

gruss

Autor: Student (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo
bist du sicher das er bei der Deklaration meckert und nicht bei deiner 
späteren verwendung der Funktion wo du vl. ausversehen zuviele Argumente 
übergeben hast?

Autor: Vlad Tepesch (vlad_tepesch)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Dietmar P. schrieb:
> Kann C nur drei Argumente? Wenn ja, wie macht man das dann?

c kann sogar funktionen mit variabler Argumentsliste

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das ist die Definition in main.c und der Aufrufe der Funktion leitung:
  uint8_t iT = 0;       // Zähler für Takt
  uint8_t iS = 0;       // Zähler-Status für Mux- und Hex-Zähler (7493)
  uint8_t iL = 0;       // Leitungsstatus für LED
  uint8_t AS = 0;       // Schalter für Alarm
 .
 .
  leitung(&iT, &iS, &iL, &AS); // Steuerung Leitungen und Auswertung

und das die Funktion "leitung":
void leitung(uint8_t *piT, uint8_t *piS, uint8_t *piL, uint8_t *pAS) 

Ist da was syntaktisch falsch? Wenn ich nur drei Parameter angebe, dann 
funktioniert es.

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und wo ist der Prototyp der Funktion leitung? Der sollte vor der 
Benutzung (Aufruf) und vor der Definition der Funktion stehen z.B. so

void leitung(uint8_t *piT, uint8_t *piS, uint8_t *piL, uint8_t *pAS);
//                                                                  ^

Autor: MagIO (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich denke so generell kann man das nicht beantworten!

Prinzipiell hat C da keine Probleme. In der Regel werden Parameter über 
den Stack übergeben. Allerdings geht es ja hier um C für nen uC und der 
ein oder andere Compiler kann da vielleicht auch optimieren und benutzt 
Register dafür - möglicherweise durch irgend einen Compiler switch 
eingeschaltet?!

Also, welcher uC, welcher C-Compiler? C- und H-Files?

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
MagIO schrieb:

> Prinzipiell hat C da keine Probleme. In der Regel werden Parameter über
> den Stack übergeben.

Das ist durchaus nicht die Regel, jedenfalls nicht für die ersten N 
Parameter auf Maschinen mit genug Registern. Und schon garnicht 
selbstverständlich bei Compilern für 8-Bit Controller.

Autor: celine (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@A. K.:

wo dann? im ram? bei meinen 8-bittern ist der stack im ram angesiedelt 
(Silabs devices)

Autor: HoffeEsHIlft (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alles in einem 'struct' ablegen und dann die Adresse deiner 
"Struct-Instanz" übergeben... von mir aus ist dies einfacher.
gruss

Autor: Dietmar P. (dietmar2)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo miteinander,

danke für Eure Hilfe.
Der Fehler war offenbar, dass ich den Parameter *pAS, den ich später 
eingefügt hatte in der leitung.h vergessen hatte, Schande Schande!!

Aber die Fehlermeldung war für mich etwas irreführend, weshalb ich nicht 
auf die Idee kam dort zu suchen.

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
celine schrieb:

> wo dann? im ram? bei meinen 8-bittern ist der stack im ram angesiedelt

Einige 8-Bitter haben erkleckliche Probleme damit, Daten in einem Stack 
effizient zu adressieren, weil eine entsprechende Adressierungsart 
fehlt. Statisch adressieren können sie besser. Beispielsweise 8051 und 
PIC10-16 und ein bischen auch die erste Generation der PIC18.

Compiler für diese Maschinen neigen daher dazu, sämtliche Daten statisch 
zu adressieren, auch Parameter und lokale "auto" Variablen. Solche 
Funktionen sind dann natürlich von Haus aus nicht reentrant, weshalb man 
sie ggf. entsprechend kennzeichnen muss.

NB: Bei 32-Bittern ist es genau umgekehrt. Die tun sich mit Daten auf 
dem Stack leichter als mit statischen Daten.

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.