- Reichelt Elektronik    Werbung      
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 16

Thema: nochmal Arraypointerreferenztohuwabohu

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    HaWe
    Gast
    vermutlich hat gestört, dass von der Form
    char list1[a][b]
    in die Form von
    char **list2
    übertragen werden sollte, daher mein Versuch des expliziten casts
    (char**) list1 // list1[a][b] ->-> **list1
    dann --> als Parameter für Funktion importlist (char ** list2)

    führt dann aber zu Laufzeitfehlern, wenn die array-Inhalte kopiert werden sollen

    Ich weiß nur absolut nicht, wie es stattdessen richtig geht
    Geändert von HaWe (09.12.2018 um 13:23 Uhr)

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Hier definierst Du die Liste:

    Code:
    char mlist0[6][11]
    mit ** mlist0 erzeugst Du einen Zeiger. (mit dem ersten * auf mlist0[x] und mit dem zweiten * auf mlist[x][x])

    Was ist, wenn Du so den Aufruf machst: menu0.importlist(*mlist0);

    Und Deine Funktion so gestaltest: void importlist ( char * extlist )

    Weil, beim Kopieren verwendest Du ja nur:extlist[line] nicht: extlist[x][line]

    Aber wie gesagt, ich glaube, ich stifte nur mehr Verwirrung!

  3. #3
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    11.12.2007
    Ort
    weit weg von nahe Bonn
    Alter
    41
    Beiträge
    3.416
    deine Deklaration macht mir irgendwie Kopfschmerzen ... aber für die symmetrie ist es schon nicht ganz verkehrt

    (nicht böse gemeint, da schrillen nur ein paar alarmglocken)

    deklariere doch ein

    char* mlist[]

    und fülle es mit

    char* entry0 = "bla"
    char* entry1 = "foo"
    mlist[0] = entry0;
    mlist[1] = entry1;

    ist zwar etwas umständlich aber explizit

    und in deiner import funktion kannst du auch so etwas schreiben
    void importlist ( char * extlist[] )
    damit sollte es besser funktionieren, probiert haeb ich es aber nciht ... das Problem ist nämlich dass die strings dabei unterschiedlich lang sind was weider andere phänomene hervorrufen kann
    Es gibt 10 Sorten von Menschen: Die einen können binär zählen, die anderen
    nicht.

  4. #4
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Ich habs jetzt mal so:

    void importlist (char ** extlist )

    und so:

    tMenu menu0(char ** mlist0);


    Nur so wird es für ein ESP-12E ohne Warnung und Fehler compiliert.

  5. #5
    HaWe
    Gast
    man kann eine
    char ** mlist;
    ja nicht initialisieren als
    {"Titel","ESC","Ja","Nein","foo","bas"}; // error !!

    Das ist aber wesentlich, sonst wird es bei der Initialisierung aller Menüpunkte aller Menüs und Untermenüs zu kompliziert.

    also brauche ich für den Original-Array
    char mlist[6][11] = {"Titel","ESC","Ja","Nein","foo","bas"};

    und den will ich jetzt an die Funktion
    tMenu::import() // (fraglich ob hier als Argument (char ** extlist) richtig ist ?!? )
    übergeben,

    denn man kann als Funktions-Argument kein
    import(char extlist[MENULEN][LINELEN])
    definieren, zumal MENULEN und LINELEN grundsätzlich in der Class variabel sind und keine Konstanten (ihre Größe wird erst bei Instanziierung des Objekts bekannt gegeben, wenn die interne list erzeugt wird)

    Code:
    public:      
         char ** list;
    
      tMenu (int16_t menulen, int16_t linelen, tMenu* pMenu) {   // constructor
         MENULEN = menulen;    
         LINELEN = linelen; 
         list = new char*[MENULEN];
            for(int i = 0; i < MENULEN; i++)
            {
              list[i] = new char[LINELEN+1];
            }
    habe ich es erst mal übergeben, kann ich die Liste von strings in der Objekt-Methode weiterverwenden:

    for(int line=0; line<MENULEN; line++) {
    strncpy( list[line], extlist[line], strlen( list[line] ) );
    ...

    Offenbar ist das für die Übergabe mit den ** falsch, aber wie geht es richtig?

    Wie übergibt man einen 2-dim array (bzw. eine Aufzählung von cstrings) per Pointer oder als Kopie an einen zweiten 2-dim array?
    Geändert von HaWe (09.12.2018 um 16:16 Uhr)

  6. #6
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Code:
    char mlist0[6][11] = {"menu0","ESC >","Ja","Nein","foo","bas"};
    
    class tMenu{
     private:
       int MENULEN;
     public:
       char ** list; //char * list[];
    
    
       void importlist (char ** extlist ) {
            int16_t N = MENULEN;
            for(int line=0; line<N; line++) {
               strncpy( list[line], extlist[line], strlen(extlist[line]) );
            }
      }
    };
    
    
    void setup(){
    }
    
    
    void loop(){
      tMenu menu0(char ** mlist0);
    }

  7. #7
    HaWe
    Gast
    ist das nicht mein eigener Code?
    Der war zwar zu kompilieren, aber ergab ja einen Runtime Error.

    Oder hast du daran etwas verändert?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    Der ist geändert. Produziert bei mir keinen Error.

  9. #9
    HaWe
    Gast
    ach so, du übergibst auch schon die Liste an den Constructor...
    mal sehen...

    - - - Aktualisiert - - -

    Code:
    tMenu menu0(char ** mlist0);
    gehört aber global instanziiert, nicht jedes Mal neu in der loop,
    und warum übergibst du die Liste mlist0 als Doppelpointer mitsamt Variablentyp char** ?
    Parameter führen doch keine Typen beim Aufruf...?
    Das gibt bei mir zumindest auch einen compile error.

    Instanziiere ich indes global per
    Code:
    tMenu menu0(6,11, (char**)mlist0 );
    lässt es sich kompilieren, erzeugt aber ebenfalls wieder einen Laufzeitfehler, wie schon zuvor
    rst cause:4, boot mode: (1,7)
    wdt reset
    Code:
    class tMenu {       
      protected:  
         int16_t    MENULEN, LINELEN, VISLNUM, FONTHI; 
      
      public:      
         char ** list; 
         tMenu * preMenu;
         int16_t act; 
    
         tMenu (int16_t menulen, int16_t linelen, char ** extlist)    // constructor     
         {
            MENULEN = menulen;  // number of available menu options        
            LINELEN = linelen;  // line length of menu options       
                            
            list = new char*[MENULEN];
            for(int i = 0; i < MENULEN; i++)
            {
              list[i] = new char[LINELEN+1];
              strncpy( list[i], extlist[i], LINELEN);
            }     
                           
         }      
    };
    //
    Geändert von HaWe (09.12.2018 um 18:31 Uhr)

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    18.03.2018
    Beiträge
    2.690
    gehört aber global instanziiert, nicht jedes Mal neu in der loop
    Ja, weiß ich, war nur zum Test.

    warum übergibst du die Liste mlist0 als Doppelpointer mitsamt Variablentyp char** ?
    Weil alles andere zu Fehlermeldungen führte. Ich habe mir die Meldungen durchgelesen und das gegeben, was der Compiler haben wollte. Meine Arduino-IDE ist so damit zufrieden.

    Und wie gesagt, bin ich eher hier an der Stelle eine schlechte Hilfe. Weiß noch nicht mal, ob Dich das so in irgendeiner Weise weiter bringt. Weil ich zu wenig damit programmiert habe, gerade in C/C++. Ich muss mich unbedingt mehr damit beschäftigen, allerdings ist die Sprache teils sehr eigenartig, das gefällt mir nicht so gut. Da gibt es andere mit denen es sich einfacher umgehen lässt und man wegen so einem Mini-Problem nicht tagelang suchen muss. Aber so ist es nun mal mit C.

    Ich hole die Tage mal mein dickes C-Buch aus dem Schrank, mal schauen, was dort zur Parameterübergabe drin steht, ob man das hier in der Arduino-IDE überhaupt brauchen kann. Dann übe ich mal ein wenig.


    MfG
    Geändert von Moppi (09.12.2018 um 19:24 Uhr)

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. Nochmal zu den adc Ports
    Von Fenriz im Forum Robby RP6
    Antworten: 2
    Letzter Beitrag: 30.08.2008, 12:20
  2. Nochmal Uhrzeit
    Von martin66119 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 05.11.2007, 12:42
  3. nochmal : Greifarm
    Von JonasK im Forum Mechanik
    Antworten: 4
    Letzter Beitrag: 30.06.2007, 15:25
  4. Nochmal Roboterbau
    Von N00b|Linux im Forum Allgemeines zum Thema Roboter / Modellbau
    Antworten: 5
    Letzter Beitrag: 28.01.2005, 09:06
  5. Motortreiber (nochmal)
    Von Gottfreak im Forum Controller- und Roboterboards von Conrad.de
    Antworten: 10
    Letzter Beitrag: 20.03.2004, 14:12

Berechtigungen

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

    Werbung      fchao-Sinus-Wechselrichter AliExpress