- MultiPlus Wechselrichter Insel und Nulleinspeisung Conrad         
Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte
Ergebnis 11 bis 20 von 43

Thema: strukturen, ein- und ausstieg

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Anzeige

    Powerstation Test
    @inka:
    ...und dachte eher an das gute alte "goto" aus basic-zeiten. Würde das ein eingesetztes break abmildern, oder ist die ganze idee für die katz?
    Goto gibt's immer noch,- ist aber ziemlich verpönt. Es läßt sich auch sehr gut umgehen ...
    ...ich erkenne hier eher eine einstufige abfragesituation und innerhalb der einzelnen cases oder if-abfragen läuft hier keine while-schleife...
    Das sieht nur so aus. In den einzelnen Funktionen des Testprogramms wird teilweise auch eine Abbruchbedingung abgefragt.
    D.h.: Die Einzelfunktionen bestimmen selbst, ob sie einmalig durchlaufen oder dauerhaft bis zu einer Abbruchbedingung. Daher braucht es in der case Struktur keine do-while Schleife.
    Gruß
    Dirk

  2. #12
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi allerseits,

    ich nutze jetzt mal diesen thread, auch wenn es mir diesmal um andere strukturen geht:

    nachdem das kompilieren mit code:blocks bei mir offensichtlich immer noch mit fehlern behaftet ist habe ich das, was ich momentan mache auf reines make umgestellt. So weit so gut, so ganz zufrieden bin ich nicht:

    1) die strukturen sind ganz flach. Ich kann sie natürlich mit hinzufügen von "/.." im jeweiligen makefile erweitern, das wahre ist das aber nicht...

    2) es stört mich z.b. das in jedem verzeichnis, welches für ein programm angelegt ist auch die dateien, wie z.b. die libs der multi_io sind. So habe ich - befürchte ich - in einigen wochen dutzende von z.b. "RP6Control_MultiIO.h" oder "RP6Control_Orientation.h", je nach dem wo ich gerade drann bin und etwas ändere. Gibt es hier, bei make, eine möglichkeit es zentral handzuhaben? Zum beispiel alle "RP6mio" oder "RP6servo" in einem verzeichnis zusammenzufassen und jeweils nur auf EINE dateiversion (in der man ändert, hinzufügt, auskommentiert...) zuzugreifen? kann man dazu z.b. den

    "RP6_LIB_PATH_OTHERS= $(RP6_LIB_PATH)/RP6control $(RP6_LIB_PATH)/RP6common"

    erweitern?

    das hier, z.b.


    SRC += $(RP6_LIB_PATH)/RP6control/RP6ControlLib.c
    SRC += $(RP6_LIB_PATH)/RP6common/RP6uart.c


    hat schon mal mit "RP6_LIB_PATH_OTHERS"

    also so:

    SRC += $(RP6_LIB_PATH_OTHERS)/RP6ControlLib.c
    SRC += $(RP6_LIB_PATH_OTHERS)RP6uart.c

    irgendwie nicht funktioniert...


    wie handhabt ihr (die, die mit make arbeiten und drauf schwören) so etwas?
    gruß inka

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Hi inka,
    wenn man mal die Struktur der RP6 Examples als Beispiel nimmt:
    1. Im makefile geht alles aus von DEM Ordner, in dem makefile steht bzw. make all ausgeführt wurde. Das ist der Ordner, in dem also dein Programm steht (Programmordner).

    2. RP6_LIB_PATH ist dann im makefile als ../../RP6Lib definiert, d.h. 2 Ebenen aufwärts im Verzeichnisbaum (RP6CONTROL_EXAMPLES -> RP6) und dort dann der Ordner RP6Lib.
    Die Struktur sieht also so aus:
    RP6 --- RP6CONTROL_EXAMPLES --- Programmordner
    RP6 --- RP6Lib
    RP6_LIB_PATH weist dann also auf den Ordner RP6Lib.

    3. Wenn es um die M32 geht, dann befinden sich die meisten Libs für die M32 im Ordner:
    RP6 --- RP6Lib --- RP6control
    Dahin tue ich auch alle Libs, die ich selbst für die M32 habe. Wenn du also für die MultiIO Libs eine zentrale Stelle haben willst, wäre dieser Ordner doch gut geeignet, oder?

    4. Im makefile müßtest du also alle MultiIO Libs, die du in den Ordner RP6control kopiert hast, so eintragen:
    SRC += $(RP6_LIB_PATH)/RP6control/RP6Control_MultiIOLib.c
    (Hier am Beispiel der MultiIO Haupt-Lib)

    5. Im Programm selbst müßten die include Befehle nicht verändert werden.

    Wenn du eine andere Ordner-Struktur nutzt, must du natürlich die Pfadangaben anpassen.
    Gruß
    Dirk

  4. #14
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo,

    ich versuche nun bestimmte funktionen, die ich in unterschiedlichen programmen verwenden möchte in eine lib "standard" (c & h) auszulagern...

    mit solchen z.b. klappt es einwandfrei:

    void accuspannung(void)
    sobald der funktion als rückgabewert z.b. eine variable zugeordnet wird wie hier:

    void batteryVoltageLow(uint8_t isVoltageLow)
    - in der standard.h steht dann:

    void batteryVoltageLow(void)
    funktioniert es nicht, die fehlermeldunge lautet:
    ../../RP6Lib/standard/standard.h|37|note: previous declaration of ‘batteryVoltageLow’ was here|
    wobei der eintrag in der standard.h moniert wird. Muss dort bei der deklaration auch die variable rein? wenn ich es dann mache:

    void batteryVoltageLow(uint8_t isVoltageLow)
    wird eine klammer verlangt:

    ../../RP6Lib/standard/standard.h|38|error: expected ‘)’ before ‘isVoltageLow’|
    seltsammerweise funktioniert es hier:

    standard.c:
    void I2C_transmissionError(uint8_t errorState)
    standard.h: steht nichts, da die funktion in der "RP6Control_I2CMasterLib.h" deklariert wird, und zwar so:

    void I2C_transmissionError(uint8_t errorState);
    könnte bitte jemand versuchen mir das zu erklären?
    gruß inka

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    Wenn es eine Funktion void batteryVoltageLow(uint8_t isVoltageLow) gibt, muss sie auch im Header (.h) so deklariert werden. Dabei reicht es auch, nur void batteryVoltageLow(uint8_t) anzugeben.
    Was man oft vergißt, ist auch, dass hinter den Funktionsdeklarationen im Header jeweils ein ; stehen muss.
    Gruß
    Dirk

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo Inka,

    Du wirfst noch etwas falsch mit den Begriffen um dich

    1. Rückgabewert, der steht links
    Also
    int f(void);
    Darf dann so verwendet werden:

    int f(void)
    {
    return (1);
    }

    void x(void)
    {
    int a;
    a = f();
    }

    2. void bedeutet nichts!
    Da wo also void steh gibt es keinen Parameter

    void f(void); // nimmt keine Werte an und liefert nichts zurück

    Folglich führt folgendes immer zu einem Fehler:

    int a;
    a = f(); // Error
    f(123); // Error

    3. Parameter, Übergabeparameter
    Das sind die Variablen welche in der Klammer stehen.
    void batteryVoltageLow(uint8_t isVoltageLow);
    Verlangt also nach ein Parameter , welcher beim Aufruf übergeben werden muss.
    In einem Fall kann die Funktion auch den Wert von sVoltageLow, im aufrufenden Teil, nicht verändern. Der Funktion wird nur eine Kopie von sVoltageLow übergeben.

    MfG Peter(TOO)

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    danke erstmal für die antworten...

    hier mein problem noch einmal (etwas detailierter):

    RP6Control_08_I2CMaster.c , auskommentierter bereich:
    /** * This is a new Event Handler and it gets called when the Battery Voltage
    * is getting low! The Parameter isVoltageLow is true, when the voltage
    * is low and false, when the voltage is OK.
    */
    /*
    void batteryVoltageLow(uint8_t isVoltageLow)
    {
    if(isVoltageLow)
    {
    writeString_P("\nBattery Voltage low: ");
    // Send Battery voltage to UART:
    writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
    writeChar('.');
    writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
    writeString_P("V\n");
    }
    else
    {
    writeString_P("\nBattery Voltage is OK!\n");
    }
    }
    */

    standard.c, funktion hinzugefügt:


    /************battery_voltage_low******************* ******/



    void batteryVoltageLow(uint8_t isVoltageLow)
    {
    if(isVoltageLow)
    {

    writeString_P("\nBattery Voltage low: ");
    // Send Battery voltage to UART:
    writeIntegerLength((((adcBat/102.4f)+0.1f)), DEC, 2);
    writeChar('.');
    writeIntegerLength((((adcBat/1.024f)+10)), DEC, 2);
    writeString_P("V\n");
    }
    else
    {
    writeString_P("\nBattery Voltage is OK!\n");
    }
    }


    standard.h, deklaration (die zeile, die moniert wird hervorgehoben):


    //void receiveRC5Data(void (RC5data_t) (rc5data));

    //void batteryVoltageLow(void);
    void batteryVoltageLow (uint8_t isVoltageLow);
    //void printAllSensorValues(void);
    //void task_LCDHeartbeat(void);
    //void watchDogRequest(void);


    erstellungsprotokoll beim kompilieren:


    -------------- Erstellen: RP6Control_08_I2CMaster in m32_samples ---------------


    Compiliere: ../../RP6Lib/RP6common/RP6I2CmasterTWI.c
    ../../RP6Lib/RP6common/RP6I2CmasterTWI.c: In function ‘I2CTWI_requestedDataReady_DUMMY’:
    ../../RP6Lib/RP6common/RP6I2CmasterTWI.c:55:46: warning: unused parameter ‘requestID’
    ../../RP6Lib/RP6common/RP6I2CmasterTWI.c: In function ‘I2CTWI_transmissionError_DUMMY’:
    ../../RP6Lib/RP6common/RP6I2CmasterTWI.c:62:45: warning: unused parameter ‘requestID’
    Compiliere: ../../RP6Lib/RP6common/RP6uart.c
    Compiliere: ../../RP6Lib/RP6control/RP6ControlLib.c
    Compiliere: ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c
    ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c: In function ‘IRCOMM_RC5dataReady_DUMMY’:
    ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c:62:42: warning: unused parameter ‘rc5data’
    ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c: In function ‘BATTERY_lowVoltage_DUMMY’:
    ../../RP6Lib/RP6control/RP6Control_I2CMasterLib.c:93:39: warning: unused parameter ‘isVoltageLow’
    Compiliere: ../../RP6Lib/RP6mio/RP6Control_MultiIOLib.c
    Compiliere: ../../RP6Lib/standard/standard.c
    In file included from ../../RP6Lib/standard/standard.c:1:0:
    ../../RP6Lib/standard/standard.h:38:33: error: expected ‘)’ before ‘isVoltageLow’

    Prozess wurde mit Status 1 beendet. (0 Minuten, 0 Sekunden)
    1 Fehler, 4 Warnungen
    ich kann keinen fehler erkennen, wüsste ich auch nicht wo ich dort die ")" hinzufügen soll?
    gruß inka

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    66
    Beiträge
    2.435
    Hallo inka,

    Das ist eine schwäche von C.
    Der Fehler ist immer zwischen dem Anfang der Datei und der Stelle welche der Compiler angibt!

    BTW: woher kennt der Compiler uint8_t ??
    Da müsste irgendwo eine Definition davon ein, vielleicht in einer Headerdatei, welche vergessen wurde?

    MfG Peter(TOO)

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von Dirk
    Registriert seit
    30.04.2004
    Ort
    NRW
    Beiträge
    3.803
    uint8_t kennt der Compiler in diesem Fall.
    Der Fehler liegt VOR dieser Fehlerzeile.
    Such mal die ganze Header-Datei ab oder poste sie hier (keine Ausschnitte, sondern den kompletten Header, so wie er kompiliert wurde).
    Gruß
    Dirk

  10. #20
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    das hier ist der komplette header:

    Code:
    #ifndef STANDARD_H_
    #define STANDARD_H_
    
    #endif /*STANDARD_H_*/
    
    
    
    
    void accuspannung(void);
    
    void accuzustand(void);
    
    void watchDogRequest(void);
    
    void task_LCDHeartbeat(void);
    
    void printAllSensorValues(void); 
    
    
    //void writeDoubleLCD(void);
    
    //void writeDouble(void);
    
    //void I2C_transmissionError();
    
    //void show_buttons();
    
    //ACS_setStateChangedHandler(acsStateChanged);
     
    void acsStateChanged(void);
    
    void bumpersStateChanged(void);
    
    //void receiveRC5Data(void);
    
    //void receiveRC5Data(void (RC5data_t) (rc5data));
    //void batteryVoltageLow(void);
    void batteryVoltageLow (uint8_t isVoltageLow);
    //void printAllSensorValues(void);
    //void task_LCDHeartbeat(void);
    //void watchDogRequest(void);
    
    
    //ACS_setStateChangedHandler(void);
    //ACS_setStateChangedHandler(acsStateChanged);
    gruß inka

Seite 2 von 5 ErsteErste 1234 ... LetzteLetzte

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 23.03.2012, 23:36
  2. Probleme feine Strukturen zu drucken für Platine
    Von Hellmut im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 12
    Letzter Beitrag: 20.12.2010, 14:35
  3. Antworten: 11
    Letzter Beitrag: 07.09.2008, 17:56
  4. Probleme bei Strukturen (Projekt Funkuhr)
    Von Wasserkäfer im Forum C - Programmierung (GCC u.a.)
    Antworten: 9
    Letzter Beitrag: 19.07.2008, 16:10
  5. Ein Quarz für ein ATMEGA8 und ein ATMEGA16
    Von boeseTURBO-CT im Forum AVR Hardwarethemen
    Antworten: 6
    Letzter Beitrag: 14.06.2004, 17:07

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Solar Speicher und Akkus Tests