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


von Dietmar P. (dietmar2)


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?

von celine (Gast)


Lesenswert?

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

gruss

von Student (Gast)


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?

von Vlad T. (vlad_tepesch)


Lesenswert?

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

c kann sogar funktionen mit variabler Argumentsliste

von Dietmar P. (dietmar2)


Lesenswert?

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

und das die Funktion "leitung":
1
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.

von Stefan B. (stefan) Benutzerseite


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);
//                                                                  ^

von MagIO (Gast)


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?

von (prx) A. K. (prx)


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.

von celine (Gast)


Lesenswert?

@A. K.:

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

von HoffeEsHIlft (Gast)


Lesenswert?

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

von Dietmar P. (dietmar2)


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.

von (prx) A. K. (prx)


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.

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.