-         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: class mit bergebenen array Gren erstellen

  1. #11
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beitrge
    3.518
    Anzeige

    niemand eine Idee, warum die Funktion
    mymenu.init();
    oben die runtime errors produziert,

    warum man anscheinend damit keine strings intern kopieren/initialisieren kann,

    warum selbst beim "rechnen" per
    list[i*CAPTLEN]...
    der runtime error passiert,

    und wie man stattdessen korrekt einen einen intern adressierbaren und beschreibbaren 2-dim array konstruieren kann?
    ≠≡≈αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  2. #12
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beitrge
    1.344
    Testest du das am PC? Dann kompilier es mit Debug informationen (-g bei gcc) und fhre es mit einem Debugger aus. Dann siehst du genau das Problem.
    Code:
    char ** list;
    list = new char*[menulen];
    for(int i = 0; i < captlen; i++)
    {
       list[i] = new char[captlen];
    Dann solltest du auch sehen, dass du in der For Schleife die falsche Variable verwendest

    for(int i = 0; i < captlen; i++)

    zu:
    for(int i = 0; i < menulen; i++)

  3. #13
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beitrge
    3.518
    danke,
    habe es gendert,
    trotzdem sofort nach mymenu.init wieder der selbe runtime error mit der exeption

    Exception (29):
    epc1=0x40205d63 epc2=0x00000000 epc3=0x00000000 excvaddr=0x00000000 depc=0x00000000

    ctx: cont
    sp: 3fff0280 end: 3fff0560 offset: 01a0

    >>>stack>>>
    3fff0420: feefeffe 00000028 3ffef250 402025a1
    3fff0430: feefeffe feefeffe feefeffe feefeffe
    3fff0440: feefeffe feefeffe feefeffe feefeffe
    3fff0450: feefeffe feefeffe feefeffe feefeffe
    Code:
    tMenu mymenu(20,10);
    
    void setup(void)
    {
    
      Serial.begin(115200);
      delay(2000); // wait for Serial()
      Serial.println("Serial started");
      
      char test[15]="5 newline_";
      strcpy(mymenu.list[5], test);
      Serial.println(mymenu.list[5]);
       
      mymenu.list[5][0]='>';
      Serial.println(mymenu.list[5]);
      Serial.println();
      for(byte i=0; i<10; i++) {
         Serial.print("-");
         Serial.println(mymenu.list[i]);
      }
    
      // bis hierhin no problem
    
    
      mymenu.init();  // >>> runtime error, exeption
      // ...
    }
    Code:
     
    class tMenu {
      
      protected:    
            int16_t  MENULEN, CAPTLEN; 
            char buf[20];                 
              
      
      public:      
         char    **list;     
         tMenu (int16_t menulen, int16_t captlen) // constructor
         {
            MENULEN = menulen;
            CAPTLEN = captlen;
           
            list = new char*[MENULEN];
            for(int i = 0; i < MENULEN; i++)
            {
              list[i] = new char[CAPTLEN];
            }        
         }      
         
         void init() {
            for(int i=0; i<MENULEN; i++) {
               sprintf(buf,"%d line %d", i);
               strcpy(list[i*MENULEN], buf);
            }
         }
    
     
    };
    (habe keinen debugger, nur die Arduino IDE)
    ≠≡≈αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  4. #14
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    22.06.2009
    Beitrge
    1.344
    strcpy(list[i*MENULEN], buf);

    Warum mal *MENULEN?
    Du schreibst damit meilenweit aus deinem Array aus.
    strcpy(list[i], buf);

    Dein Array ist ja eigentlich eine Liste von char pointern.
    Fr jeden char pointer allokierst du speicher. Und dann willst du den Speicher der von dem Char Pointer an der Stelle i allokiert wird mit Text beschreiben.

    Eine Sache auerdem noch: Du solltest aufpassen, dass dir nicht der Speicher ausgeht. Das sind dann nmlich wirklich komische Fehler und die sind in der Konstruktion nicht zur Compilezeit zu erkennen.

  5. #15
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beitrge
    3.518
    der array geht doch so:
    list[MENULEN][CAPTLEN],
    also muss ich doch alle Zellen von 0<i<MUNULEN mit den cstrinds beschreiben?
    ohne die i*MENULEN hat er aber denselben Fehler erzeugt - muss ich nochmal kontrollieren...

    ich habe den esp8266, der msste zumindest jetzt noch genug Speicher fr 1 solches Men haben.
    ≠≡≈αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  6. #16
    Erfahrener Benutzer Roboter-Spezialist Avatar von Moppi
    Registriert seit
    18.03.2018
    Beitrge
    508
    Ich hab versucht, dem zu folgen. Habe aber den Eindruck, dass die Arrays nicht richtig gehandhabt werden. Was mir auch nicht ganz klar war: warum fr einen Index der Datentyp "char" und nicht "int" verwendet wird.
    Deshalb habe ich einen Sketch erstellt, um auch ein Array zur Laufzeit zu erstellen.

    Code:
    int MENULEN=2;
    int CAPTLEN=32;
    char buf[]="Hallo";
    int i=2;
    int a=0;
    
    
    
    
    void setup() {
    
    
    Serial.begin(115200);
    delay(1000);
    
    
    
    
    
    
    }
    
    
    void loop() {
     char list[MENULEN][CAPTLEN];
     if(a==0){
     strcpy(list[i], buf);
     a++;
     }
    
    
     Serial.println(list[i]);
     delay(1000);
    }
    Zumindest so funktioniert es. Blo ob das jetzt im Sinne des Erfinders (HaWe) war?

    MfG

  7. #17
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beitrge
    3.518
    update
    stimmt immer noch, gerade kontrolliert:
    selber runtime error auch fr

    Code:
      
         void init() {
            for(int i=0; i<MENULEN; i++) {
               sprintf(buf,"%d line %d", i);
               strcpy(list[i], buf);  // editiert
            }
         }
    - - - Aktualisiert - - -

    Zhler ist ggf auch char, weil es nur von 0 bis 20 geht maximal

    - - - Aktualisiert - - -

    @moppi:
    ja, so mit der externen Funktion ging es bereits vorher.
    Das Problem ist ja gerade, es per OOP-Methode intern zu machen, genau solche r/w Zugriffe brauche ich spter noch fters .
    Gendert von HaWe (05.12.2018 um 23:19 Uhr)
    ≠≡≈αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  8. #18
    Erfahrener Benutzer Roboter-Spezialist Avatar von Moppi
    Registriert seit
    18.03.2018
    Beitrge
    508
    Wie kommst Du auf einen Runtime Error?

    Hier mal die Ausgabe, die ich mit Deinem Code habe, das "Hallo" habe ich in loop() eingefgt, er schreibt es immer wieder hin, das Programm arbeitet also weiter:

    Code:
    Serial started
    5 newline_
    > newline_
    
    
    - 8245
    -⸮O⸮⸮
    
    
    -s⸮⸮
    
    
    -[⸮⸮
    
    
    -⸮⸮⸮
    
    
    -> newline_
    -⸮⸮*⸮
    
    
    -οy⸮
    
    
    -⸮⸮
    
    
    -⸮}⸮t
    
    
    Hallo
    Hallo
    Hallo
    Hallo

    Wenn ich die init() ndere:

    Code:
         void init() {
            for(int i=0; i<MENULEN; i++) {
               sprintf(buf,"%d line %d", i);
               strcpy(list[i], buf); //i*MENULEN
            }
    kommt das raus:

    Code:
    0 line 8245
    1 line 8245
    2 line 8245
    3 line 8245
    4 line 8245
    5 line 8245
    6 line 8245
    7 line 8245
    8 line 8245
    9 line 8245
    Jedenfalls kein Error und kein Abbruch bei mir.
    Gendert von Moppi (05.12.2018 um 23:07 Uhr)

  9. #19
    Erfahrener Benutzer Robotik Einstein Avatar von HaWe
    Registriert seit
    09.10.2014
    Beitrge
    3.518
    manno, du hast Recht, danke!
    Vor lauter indices schwirrt mir schon der Schdel.
    Auch ich kriege jetzt

    0 line 126
    1 line 65280
    2 line 65280
    3 line 65280
    4 line 65280
    5 line 65280
    6 line 65280
    7 line 65280
    8 line 65280
    9 line 65280

    und es muss ntl heien
    sprintf(buf,"%d line %d", i, i);

    dann steht da auch
    0 line 0
    1 line 1
    2 line 2
    3 line 3
    4 line 4
    5 line 5
    6 line 6
    7 line 7
    8 line 8
    9 line 9


    vielen Dank nochmal!
    ≠≡≈αγελΔΣΩ∞ Schachroboter:www.youtube.com/watch?v=Cv-yzuebC7E Rasenmher-Robot:www.youtube.com/watch?v=z7mqnaU_9A8

  10. #20
    Erfahrener Benutzer Roboter-Spezialist Avatar von Moppi
    Registriert seit
    18.03.2018
    Beitrge
    508
    Dennoch verstehe ich nicht, wie es zum Runtime Error kam? - Du hast es doch in den Code rein geschrieben? Oder war das nur, um etwas Verwirrung zu stiften?

    Davon abgesehen, shedepe hatte schon was von falschen Variablen in der Schleife geschrieben und mir war das auch aufgefallen, dass die Handhabung der Arrays irgendwie etwas konfus war. Hatte ja Gestern, 20.40 Uhr geschrieben: "Habe aber den Eindruck, dass die Arrays nicht richtig gehandhabt werden." Das hast Du dann wohl irgendwie bersehen ...

    MfG
    Gendert von Moppi (06.12.2018 um 06:37 Uhr)

Seite 2 von 3 ErsteErste 123 LetzteLetzte

hnliche Themen

  1. Change member of a class from another class
    Von iciwi im Forum Arduino -Plattform
    Antworten: 1
    Letzter Beitrag: 27.08.2016, 10:45
  2. neues Byte aus Byte-Array erstellen
    Von BoondockDuck im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 4
    Letzter Beitrag: 06.09.2008, 08:53
  3. Bits in smtlichen Gren :)
    Von squelver im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 22.11.2007, 13:02
  4. SMD-Gren fr SMD-Anfnger
    Von jeybo im Forum Elektronik
    Antworten: 22
    Letzter Beitrag: 29.08.2006, 08:04
  5. Eagle - Gren
    Von BlackDevil im Forum Konstruktion/CAD/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 9
    Letzter Beitrag: 27.03.2006, 23:58

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhnge hochladen: Nein
  • Beitrge bearbeiten: Nein
  •