AVG_GCC, Pointer

Gast #2847565
Lesenswert?

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
#2847591
Lesenswert?

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
Gast #2851090
Lesenswert?

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...)
Gast #2851100
Lesenswert?

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
Gast #2851115
Lesenswert?

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.
#2851117
Lesenswert?

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.
Persönliche Seite #2851121
Lesenswert?

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
};
Gast #2851131
Lesenswert?

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?

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren