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?
da stimmen sehr wahrscheinlich prototyp und funktionsaufruf nicht überein. check mal wieviele parameter du im prototyp angegeben hast. gruss
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?
Dietmar P. schrieb: > Kann C nur drei Argumente? Wenn ja, wie macht man das dann? c kann sogar funktionen mit variabler Argumentsliste
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.
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); // ^
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?
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.
@A. K.: wo dann? im ram? bei meinen 8-bittern ist der stack im ram angesiedelt (Silabs devices)
Alles in einem 'struct' ablegen und dann die Adresse deiner "Struct-Instanz" übergeben... von mir aus ist dies einfacher. gruss
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.