Forum: Compiler & IDEs AVG_GCC, Pointer


von Jan_81 (Gast)


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

von Karl H. (kbuchegg)


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

von Oliver (Gast)


Lesenswert?

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

von Klaus W. (mfgkw)


Lesenswert?

Jan_81 schrieb:
> code

kenne ich nicht.
Wo kommt das her?

von Jan_81 (Gast)


Lesenswert?

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?

von Jan_81 (Gast)


Lesenswert?

code steht meines Wissens für den Programmspeicher.

von micha (Gast)


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...)

von Jan_81 (Gast)


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

von Jan_81 (Gast)


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.

von Klaus W. (mfgkw)


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.

von Johann L. (gjlayde) Benutzerseite


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
};

von micha (Gast)


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?

von Jan_81 (Gast)


Lesenswert?

Vielen Dank an Alle!

Es funktioniert.

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.