Hallo! Ich bin C-Anfänger und habe die Bitte, dass mir ein Experte nachfolgenden Schnipsel mal für GCC interpretiert und anpasst. Insbesondere die Definitionen für AVR-GCC. Ich bekomme das leider nicht hin. Ich weiß was es tut aber verstehe nicht die Feinheiten. Vielen vielen Dank! // main.c #include command.h command[3](); // command.h typedef void (*p_command)(); extern code p_command command[]; // command.c #include command.h code p_command command[5] = { command_1, command_2, command_3, command_4, command_5 }; void command_1(){} ...und so weiter
Jan_81 schrieb: > Hallo! > > Ich bin C-Anfänger und habe die Bitte, dass mir ein Experte > nachfolgenden Schnipsel mal für GCC interpretiert und anpasst. > Insbesondere die Definitionen für AVR-GCC. Ich bekomme das leider nicht > hin. > Ich weiß was es tut aber verstehe nicht die Feinheiten. Das sind Funktionspointer. So wie alles andere auch, hat auch eine Funktion eine bestimmte Adresse im SPeicher. Eine Funktion kann man aufrufen, indem man sie entweder durch ihren Namen aufruft, oder indem man sich die Adresse in eine Variable holt und so über diese Variable (durch die in ihr gespeicherte Adresse) die Funktion indirekt aufruft. FAQ: Funktionszeiger
Jan_81 schrieb: > Schnipsel mal für GCC interpretiert und anpasst. > Insbesondere die Definitionen für AVR-GCC. Der Code ist Standard-C ohne prozessorspezifische Dinge, das übersetzt ein avr-gcc genauso wie ein normaler gcc oder jeder anderer C-Compiler. Da gibt es nichts anzupassen. Oliver
Es funktioniert leider nicht. Hab jetzt schon zig Stunden damit zugebracht und zig Artikel zu Funktionspointern gelesen. Ich stehe auf dem Schlauch. Kann BITTE jemand helfen?
Jan_81 schrieb: > Es funktioniert leider nicht. Hab jetzt schon zig Stunden damit > zugebracht und zig Artikel zu Funktionspointern gelesen. > Ich stehe auf dem Schlauch. Kann BITTE jemand helfen? WAS funktioniert denn nicht, bzw WAS möchtest Du überhaupt machen? Deine Code-Schnipsel sind ungefähr so aussagekräftig wie "ich habe die Formel A+B=C und der Wert stimmt nicht". Wenn Du möchtest, dass Dir jemand helfen kann, musst Du mehr Informationen liefern (Beschreibung, kompletten source-code, Target, Compiler, Fehlermeldung etc...)
Ich habe den Code wie folgt übersetzt aber nun noch die Fehlermeldung:
'command_1' undeclared here (not in a function)
dito für die anderen Routinen command_2 usw.
// main.c
#include command.h
command[3]();
// command.h
typedef void (*p_command)();
//extern code p_command command[]; // wie sieht die korrekte
Schreibweise aus?
// command.c
#include command.h
constant p_command command[5] PROGMEM =
{
command_1,
command_2,
command_3,
command_4,
command_5
};
void command_1(){}
...und so weiter
Ich möchte indiziert Sub-Routinen ausführen. Alternativ zu SWITCH wegen
der großen Anzahl der Sub_Routinen.
also:
command[3]();
Die Befehle haben natürlich Namen. Also gibt es eine Adresstabelle in
der jedem Indize ein Name zugeordnet ist.
constant p_command command[5] PROGMEM =
{
command_1,
command_2,
command_3,
command_4,
command_5
};
Letztlich soll mit
command[3]();
die Funktion
command_3();
ausgeführt werden.
PRGMEM ist kein C-Schlüsselwort, sondern in einer Headerdatei für AVR definiert - die du offensichtlich nicht einbindest. Wenn du etwas in Richtung AVR portieren willst, wäre es förderlich, wenn du dich mit den Grundlagen der AVR-Programmierung beschäftigen würdest. Was willst du erreichen, wenn du von C wenig Ahnung und von AVR-Programmierung gar keine? So wie jetzt hast du doch keinen Plan, was du machst. Das wird nichts Vernünftiges. (Ist nicht böse gemeint, auch wenn es von mir kommt.) Das wäre deutlich effektiver, als dir hier alles, was im Tutorial steht, nochmal vorzukauen.
Jan_81 schrieb: > #include command.h Das gibt dir einen Syntaxfehler, du musst schreiben > #include "command.h" Als Beispiel folgendes, musst du eben auf deine Module/Header aufteilen je nach deinen Erfordernissen:
1 | typedef void (*p_command)(void); |
2 | |
3 | extern p_command command[]; |
4 | |
5 | extern void command_2 (void); |
6 | extern void command_3 (void); |
7 | extern void command_4 (void); |
8 | extern void command_5 (void); |
9 | |
10 | void command_1 (void) |
11 | {
|
12 | }
|
13 | |
14 | p_command command[] = |
15 | {
|
16 | command_1, |
17 | command_2, |
18 | command_3, |
19 | command_4, |
20 | command_5
|
21 | };
|
Als Erklärung zu Johann's Post:
In der header-Datei "command.h" musst Du die Variablen/Funktions-Rümpfe
definieren, die Du irgendwo später (z.B. in main.c) benutzen möchtest.
Sonst weiss der Compiler/Linker ja nicht, was z.B. "command_1"
eigentlich ist.
Ich denke, dass passiert in Deinem Urpsrungs-Beispiel.
In der "command.c" Datei kommt am Anfang eine Array-Definition (
command[5] ), in der du die einzelnen Funktionspointer "command_xyz"
benutzt. Die sind aber zu diesem Zeitpunkt wahrscheinlich nicht bekannt
(d.h. sie werden erst NACH der Array-Definition definiert). Also
entwerder die ARRAY-Definitions ans ENDE der command.c ODER die
Functions-Rümpfe (command_xyz) in die Header-Datei.
Das ominöse "code" ist vermutlich Compilerspecifisch, lass es einfach
mal weg ("extern p_command command[];"). Was passiert dann?
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.