- LiTime Speicher und Akkus         
Seite 2 von 3 ErsteErste 123 LetzteLetzte
Ergebnis 11 bis 20 von 23

Thema: class mit übergebenen array Größen erstellen

  1. #11
    HaWe
    Gast
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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?

  2. #12
    shedepe
    Gast
    Testest du das am PC? Dann kompilier es mit Debug informationen (-g bei gcc) und führe 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
    HaWe
    Gast
    danke,
    habe es geändert,
    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)

  4. #14
    shedepe
    Gast
    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.
    Für 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 außerdem noch: Du solltest aufpassen, dass dir nicht der Speicher ausgeht. Das sind dann nämlich wirklich komische Fehler und die sind in der Konstruktion nicht zur Compilezeit zu erkennen.

  5. #15
    HaWe
    Gast
    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 müsste zumindest jetzt noch genug Speicher für 1 solches Menü haben.

  6. #16
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.643
    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 für 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
    HaWe
    Gast
    update
    stimmt immer noch, gerade kontrolliert:
    selber runtime error auch für

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

    Zähler 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 später noch öfters .
    Geändert von HaWe (05.12.2018 um 23:19 Uhr)

  8. #18
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.643
    Wie kommst Du auf einen Runtime Error?

    Hier mal die Ausgabe, die ich mit Deinem Code habe, das "Hallo" habe ich in loop() eingefügt, 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.
    Geändert von Moppi (05.12.2018 um 23:07 Uhr)

  9. #19
    HaWe
    Gast
    manno, du hast Recht, danke!
    Vor lauter indices schwirrt mir schon der Schädel.
    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 heißen
    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!

  10. #20
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.643
    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
    Geändert 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 sämtlichen Größen :)
    Von squelver im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 0
    Letzter Beitrag: 22.11.2007, 13:02
  4. SMD-Größen für SMD-Anfänger
    Von jeybo im Forum Elektronik
    Antworten: 22
    Letzter Beitrag: 29.08.2006, 08:04
  5. Eagle - Größen
    Von BlackDevil im Forum Konstruktion/CAD/3D-Druck/Sketchup und Platinenlayout Eagle & Fritzing u.a.
    Antworten: 9
    Letzter Beitrag: 27.03.2006, 23:58

Berechtigungen

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

LiFePO4 Speicher Test