-         

Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 14

Thema: ein Int-Array einer Funktion

  1. #1
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.118
    Blog-Einträge
    1

    ein Int-Array einer Funktion

    Anzeige

    Hallo ,
    ich Suche mal wieder Hilfe oder Anregung.
    ich habe vor 3 Messwerte(MW) in einem Intarray MW[] beim Funktionsaufruf zu speichern und dieses Array als Return zurück zu bekommen, es geht nicht. Was mache ich falsch:
    Code:
    int mess()
    {
    int MW[3];  
    MW[0]  = analogRead(IR_RFL_V) ;
    MW[1]  = analogRead(IR_RFL_L) ;
    MW[2]  = analogRead(IR_RFL_R) ;
    return     MW[];
    }
    Hier der Aufruf im Programm:
    Code:
    void loop()
    {....
    IR_RFL_I[] = mess();
    ....
    }
    IR_RFL_I ist so definiert:

    int IR_FL_I[3];

    Ich finde nicht den Fehler, warum es nicht zu kompilieren geht....

    Gruss Gerhard
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo Gerhard,

    1. int MW[3]; ist eine automatische lokale Variable und wird auf den Stack abgelegt wenn die Funktion aufgerufen wird.
    Wenn die Funktion mit return beendet wird, wird aber er Stack wieder abgeräumt, inklusive der Variablen MW.
    Abhilfe:
    entweder
    a) static int MW[3];
    b) MW als globale Variable deklarieren
    c) Die Funktion mess() so schreiben, dass das Array als Zeiger auf das Array übergeben wird. Dann muss der Speicherplat für MW im AUfrufenden Teil deklariert werden.

    2. Die Funktion soll einen int zurückgeben.
    MW[] ist aber ein Zeiger auf eine Array aus int.
    MW[] entspricht &MW[0]
    Du müsstest also
    int *mess()
    schreiben, dann sollte das Compilieren gehen, aber das zurückgelieferte Array kann dann irgendwelche Random Werte enthalten. Es kann dann manchmal die gewünschten Werte enthalten und, wenn z.B. ein Interrupt auftritt, nur noch irgendwelchen Schrott.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    oder so:
    Code:
    ...
    int MW[3];//globales Variablenfeld
    ...
    void updateMW(){
    MW[0]  = analogRead(IR_RFL_V) ;
    MW[1]  = analogRead(IR_RFL_L) ;
    MW[2]  = analogRead(IR_RFL_R) ;
    }
    ...
    void loop() {
    ....
    updateMW();
    ....
    }

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    27.08.2013
    Ort
    Region Basel
    Alter
    59
    Beiträge
    2.435
    Hallo,
    Ist zwar die einfachste, aber leider auch unschönste Variante:

    - Seiteneffekte sind nun mal unschön:
    In einem grösseren Projekt, wird schnell übersehen, dass update() die globale Variable verändert.
    Jeder darf sich ausmalen, was man da an Zeit zur Fehlersuche aufwenden kann, besonders wenn ein Fremder etwas am Code ändern muss.

    - unflexibel
    Am flexibelsten ist die Variante bei welcher das Array über einen Zeiger übergeben wird.
    Man kann beliebig viele Messwerte abspeichern. Zudem ist es auch egal, ob man die Messwerte Global. lokal oder auf dem Heap ablegen will, update muss dazu nicht verändert werden.

    MfG Peter(TOO)
    Manchmal frage ich mich, wieso meine Generation Geräte ohne Simulation entwickeln konnte?

  5. #5
    Erfahrener Benutzer Roboter Genie Avatar von oderlachs
    Registriert seit
    17.05.2010
    Ort
    Oderberg
    Alter
    67
    Beiträge
    1.118
    Blog-Einträge
    1
    Ich habe es auch so erst ein mal gelöst..:
    Code:
    void mess()
    {
     
    IR_FL_I[0]  = analogRead(IR_RFL_V);
    IR_FL_I[1]  = analogRead(IR_RFL_L);
    IR_FL_I[2]  = analogRead(IR_RFL_R);
    
    }
    int IR_FL_I[3] ist in meiner Lib zum Projekt global deklariert...

    praktische Erfahrungen habe ich noch nicht damit..muss noch was löten, montieren...usw..

    Danke für Eure Hilfe..
    ich werde berichten wie ich weiter komme...

    Gerhard

    Hier mein bisheriger CODE zum Projekt
    Geändert von oderlachs (17.02.2014 um 09:40 Uhr)
    Arduinos, STK-500(AVR), EasyPIC-40, PICKIT 3 & MPLABX-IDE , Linux Mint

  6. #6
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Code:
    void mess(int *arr) {
    arr[0]  = analogRead(IR_RFL_V) ;
    arr[1]  = analogRead(IR_RFL_L) ;
    arr[2]  = analogRead(IR_RFL_R) ;
    }
    
    void loop()
    {....
    mess(MW);
    ....
    }
    Sollte in deinem Fall die beste Lösung sein. Globale Variablen sollte man wenn möglich vermeiden.
    Funktion ist natürlich nicht sicher, da keine Überprüfung des Arrays stattfindet.

    mfg

  7. #7
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Die Ideale Variante währe (so wird das auch von den C Standard Funktionen gemacht):

    Code:
    int * mess(int *arr, int length)
    {
        //Array befüllen und dabei length beachten
        return arr;
    }

  8. #8
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    13.01.2014
    Beiträge
    398
    Blog-Einträge
    3
    Wir programmieren hier für einem Arduino. Da sind globale Variablen einfach praktisch.
    Wer schon mal größere objektoorientierte Programme geschrieben hat, weiß das das Gefahren birgt.
    Je größer ein Arduino Sketch, desto unübersichtlicher. Die Probleme fangen an, wenn man nicht mehr weiß, wie groß z.B. ein Variablenfeld ist und über die Feldgrenzen hinweg schreibt oder ließt. Oder wenn sich ein zweiter Programmierer über den Code hermacht.

    Aber für einfachere Sketches finde ich es durchaus empfehlenswert mit globalen Variablen zu arbeiten.
    Wenn man seinen Code anständig kommentiert, und sprechende Namen vergibt, ist es für mich ok.
    Es ist halt auch die schnellste Variante, da die Variablen global erhalten bleiben und keine Parameter übergeben werden.

    Da hat halt jeder hat seinen eigenen Stil.

  9. #9
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beiträge
    1.266
    Globale Variablen würde ich nicht als eigenen Stil sondern als sehr schlechte Angewohnheit bezeichen, besonders wenn die Alternative kaum Mehraufwand bedeutet.
    Also Regel würde ich mal sagen: so lokal wie möglich, so global wie nötig. Also wenn ich eine Variable nur in einer Funktion brauche, dann deklare ich die auch nur dort, usw.

  10. #10
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    08.08.2008
    Ort
    DE
    Beiträge
    523
    Zitat Zitat von shedepe Beitrag anzeigen
    Globale Variablen würde ich nicht als eigenen Stil sondern als sehr schlechte Angewohnheit bezeichen, besonders wenn die Alternative kaum Mehraufwand bedeutet.
    Also Regel würde ich mal sagen: so lokal wie möglich, so global wie nötig. Also wenn ich eine Variable nur in einer Funktion brauche, dann deklare ich die auch nur dort, usw.
    ^this

    mfg

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 03.06.2013, 23:20
  2. Array an Funktion übergeben
    Von Che Guevara im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 02.05.2013, 22:23
  3. [erledigt]Array aus Funktion zurückgeben
    Von guenter1604 im Forum C - Programmierung (GCC u.a.)
    Antworten: 0
    Letzter Beitrag: 24.11.2012, 11:46
  4. int Array in einen String wandeln
    Von Hotte Meyer im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 28.12.2008, 12:45
  5. Funktion als Rückgabewert einer Funktion?
    Von Jaecko im Forum C - Programmierung (GCC u.a.)
    Antworten: 1
    Letzter Beitrag: 08.09.2008, 11:25

Berechtigungen

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