Sprung in Unterprogramme schlägt fehl

  • Hallo Forum,

    ich bastele zur Zeit für ein Studiumsprojekt einen RPi in ein RC-Auto (1:8) und betreibe zwei Sensoren (Licht- und Drehzahlsensor) damit.
    Einzeln funktionieren beide Funktionen (dank der hier gegebenen Hilfe :blush: ) auch schon super, nun möchte ich aber, um spätere Erweiterungen möglich zu machen, die einzelnen *.c-files aus einer main.c aufrufen. Habe mir dazu auch schon diverse Einträge und Tutorials durchgelesen und es immerhin so weit hinbekommen, dass mir beim kompilieren keine Fehlermeldungen mehr ausgespuckt werden. ABER: die Unterprogramme werden jetzt leider auch nicht mehr abgearbeitet :(

    Habe zu Testzwecken erstmal kleine printf's mit reingeschrieben um zu sehen wo es hängt...

    "main.c"
    "licht.c"

    Schritt 1_a wird leider nie erreicht

    "licht.h"

    Probiere so etwas zum ersten Mal aus und bin deshalb für jede Anmerkung sehr dankbar!

  • Moin,


    int licht(void);
    int hall(int argc, char *argv[]);

    lass zunächst mal die "int" weg ... das ist sonst eine Deklaration und kein Funktionsaufruf ;) ...

    cu,
    -ds-

  • Dein Funktionsaufruf ist leider eine Funktionsdeklaration und kein -aufruf. Du musst das int vor dem Aufruf weglassen und Parameter in den Aufruf einsetzen. Also in etwa so:

    Code
    licht();
    
            printf("schritt_2\n");
    
            hall(5,"Hello World");
    
            printf("schritt_3\n");
  • Vielen Dank schonmal. Das macht natürlich mehr Sinn.

    Jetzt bekomme ich in der Konsole für beide Teile die Fehlermeldung "expected expression befor 'void'" bzw. "... before 'int'"

    Außerdem habe ich für den Aufruf von licht.c "too many arguments" und für hall.c zu wenige

    Sorry für das denglish


  • Um den Rückgabewert abzuholen:

    int meinevariable;
    meinevariable = licht();

    Top! Das eliminiert schonmal den Punkt. Hatte nicht daran gedacht, dass die ja trotzdem noch was ausgibt. Kann ich das für die zweite Funktion ähnlich machen?

    "hall.c"
  • Hm ... wie sieht's jetzt aus?

    Die Argument-Fehler sind:

    licht(void);
    hall(intargc, char *argv[]);

    die typen mal rausnehmen.
    Dann - wo wir schon mal dabei sind:
    Argumente werden in der Regel am Anfang von main() ausgewertet. Dazu benutzt mal die getopt() Funktion. Dabei kann man recht komfortable auch lange Argument-Namen auswerten.
    So wie Du das machst, hast Du sog. Stellungsparameter. Das ist sehr fehleranfällig, weil es leicht zu Verwechslungen kommen kann. Ausserdem blickst Du selbst ziemlich schnell nicht mehr durch, wenn es mehr Optionen werden.
    Schau mal in die Beispiel-Sektion -> hier <- nach, da kannst Du Dir vielleicht was brauchbares abkupfern ;) ...

    Jetzt bitte noch einmal kompletter Code inkl. Fehlerbeschreibung posten, sonst kommen wir hier durcheinander.
    Es sei denn, es funktioniert ...

    cheers,
    -ds-

  • Habe die Funktion noch ein kleines bisschen an meine Bedürfnisse angepasst. argc und argv sind rausgeflogen und die Variable secs wird jetzt direkt übergeben um die Laufzeit der Drehzahlmessung festzulegen.

    &quot;main.c&quot;
    &quot;licht.c&quot;
    &quot;hall.c&quot;

    Leider funktioniert jetzt die Ausgabe nicht mehr. Habe schon versucht das Zurücksetzen von high, low und lastTick an andere Stellen zu verschieben, weil ich glaube, dass es damit zu tun hat - bis jetzt leider noch ohne Erfolg...

    Kompilieren und Ausführen geht aber ansonsten ohne Beanstandung!

  • Moin :) ...

    Streich mal die bcm2835_init()-Aufrufe ersatzlos.
    Entweder die pigpio oder die bcm2835-Library verwenden. Nicht mischen. Das könnte zu ziemlichen Problemen führen.

    Dann: nimm bitte den/die gpioInitialise()- und gpioTerminate()-Aufrufe aus den Funktionen raus und mach die Initialisierung einmal am Anfang von main, z.B. so:

    und füg' zum Schluß noch den Aufruf von gpioTerminate() ein.
    Auch die ganzen anderen Funktionsaufrufe, die nur den Pin-Modus setzen, ziehst Du am besten ganz an den Anfang von main()

    Hintergrund: Die Funktionen würde sonst mehrfach durchlaufen ... das kann nicht funktionieren, weil Du z.B. Stati zurücksetzt oder die Library neu initialisierst ...

    In der licht.c wirst Du dann noch die bcm2835-Aufrufe gegen die pigpio-Äquivalente ersetzen müssen.

    Jo mei ... is olles ned so einfach ;)

    cheers,
    -ds-

  • Einen wunderschönen guten Tag auch...

    Habe deine Anweisungen nach bestem (Ge-)Wissen verfolgt und der Comiler scheint auch ziemlich zufrieden damit zu sein. Mein Programm sieht nun wie folgt aus:

    &quot;main.c&quot;
    &quot;licht.c&quot;
    &quot;hall.c&quot;

    Musste die Größe von low und high noch etwas erweitern um auch die höchsten Drehzahlen abzudecken, aber tatsächlich läuft das Programm jetzt fehlerfrei! Das Zurücksetzen der Variablen stand außerdem an der falschen Stelle, so dass die if-Bedingung zur Berechnung der Drehzahl niie erfüllt war - habe ich jetzt auch behoben.
    Ein riesiges "Dankeschön" erstmal für die Hilfestellung. Werde im nächsten Schritt noch versuchen, das Programm nach dem boot-Vorgang automatisch zu starten. Darüber hab ich mir aber bis jetzt noch keine Gedanken gemacht und muss mir diesbezüglich erstmal Grundlagen anlesen.

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!