Ich habe gerade angefangen, an einem c-Projekt zu arbeiten. Benötigen Sie Hilfe bei der Übergabe von Funktionszeigern/Makrofunktionen/etc. Ich bin ein php & Python OO Typ, aber neu zu c. Ich habe versucht, das Beispiel für diesen Beitrag zu verallgemeinern. Ich habe eine Main.c mit einer Lib für den Axon-Mikrocontroller, mit dem ich arbeite. Funktioniert wie ein Zauber mit allem in main.c. Ich muss einige der Funktionalität aus dem Haupt in mehr organisierte lib-Dateien verschieben, wenn mein Code wächst. Der Basis-Mikrocontroller lib erzeugt eine Makrofunktion, die es mir ermöglicht, Daten an den Mikrocontroller zu senden, um einen Servo nach links oder rechts zu bewegen. Ich muss jetzt eine servo-spezifische Datei (HS-422.c) erstellen, die es mir erlaubt, Referenzen/Zeiger (?) An eine generische Funktion zu übergeben, die für jedes Servo ausgeführt wird, um die Code-Duplizierung zu erleichtern.Übergeben von Funktionszeigern & int-Referenzen auf eine andere Funktion
Denken Sie daran, ich bin nur darauf konzentriert, Makros/Funktionen/Variablen Verweise auf andere Funktionen zu übergeben und sie aufgerufen/gesetzt haben. Die anderen Grundlagen von c verstehe ich. Ich muss 100 verschiedene Wege ausprobiert haben, um das heute ohne Erfolg zu schaffen. Also, ich habe gerade eine vereinfachte Version geschrieben, in der Hoffnung, dass du eine Idee davon bekommst, was ich versuche.
Vielen Dank für Ihre Hilfe!
/*
* main.h
* I'm trying to make a pointer or reference to the macro.
* The original file had:
* #define servo1(position) servo(PORTE,2,position);
*/
// servo is a macro defined in another microcontroller file
#define (void)(*servo1)(position) servo(PORTE,2,position);
#define (void)(*servo2)(position) servo(PORTE,3,position);
/* main.c */
// init main functions
void servo_scan(void);
// init vars
int servo1_location = 0;
int servo2_location = 0;
int main(void)
{
for(;;)
{
servo_turn();
}
}
// get the servos to turn
void servo_turn(void)
{
turn_servo(*servo1, &servo1_location, 200);
turn_servo(*servo2, &servo2_location, 950);
}
/* HS-422.c */
void turn_servo(void (*servo)(int position), int ¤tLocation, int newLocation)
{
// turning
for(uint16_t i=¤tLocation; i<newLocation; i=i+10)
{
// turn servo
// hoping the specifc passed servo# pointer gets called
*servo(i);
// set value by reference to origional servo#_location var. making sure.
¤tLocation = i;
// pause
delay_ms(20);
}
}
Diese # definieren sehen sehr skizzenhaft aus! – leppie
C hat kein Konzept von "Referenzen". Die einzige Alternative zur Wertübergabe besteht darin, einen Zeiger zu übergeben. –
Die #define war nur ein Beispiel .. Ich weiß, dass es nicht funktioniert. Ich hoffe, den richtigen Weg zu finden. Und ich bedauere, ich wollte klar auf die Referenzen. Diese waren für Variablen gedacht, also konnte ich die Servo # _Location-Werte in der aufgerufenen turn_servo-Funktion setzen. – pringlized