Array Zugriff



  • Hi,
    ich habe folgendes Problem:

    In Klasse CdlgView befindet sich das Array m_Histo vom Typ long und Länge 256.

    Nun will ich die 256 Werte aus dem Array aber in einer anderen Klasse/Dialog (CHistoDlg) weiterverarbeiten:
    Also mache ich folgendes um ein beliebiges Feld auf den Inhalt zu prüfen. (hier das Feld 100).

    void CHistoDlg::OnGo() 
    {
     CdlgView dlg;
    
    CString str;
    str.Format ("%i",dlg.m_Histo[100]); 
     MessageBox(str);
     DrawHisto (); 
    }
    

    Warum erhalte ich jetzt hier für das Datum auf Feld 100 einen anderen Wert, als wenn ich die Ausgabe (wie oben) in der CdlgView-Klasse aufrufe ? Dort stimmen die Werte noch..
    Das hat sicher etwas damit zu tun dass ich nicht auf die richtige Stelle im Speicher zeige, richtig ?

    mfg Morten



  • Wie sieht denn dein ctor für CdlgView aus ?

    Wenn da das Array nicht initialisiert wird, ist es klar, dass du komische Werte bekommst.



  • Wenn ich dort im Construktor alle Werte des Array's auf 0 setzte,
    bekomme ich nur Nullen als Ausgabe.. aber das ist doch logisch, oder ?



  • Ja sicher ist das logisch.

    Das kann ich aber anhand deines codes nicht sehen. Ich weiss ja nicht wie dein ctor aussieht.

    Ich sehe nur dass ein objekt instanziert wird und dann auf einen member zugegriffen wird, der offensichtlich ein array ist. Wenn ich davon ausgehe dass du nur einen trivialen ctor hast, dann stell ich fest dass das array zum zeitpunkt der benutzung nicht initialisiert ist.

    Soweit zur logik meiner frage.

    Was erwartest du dir bitte von dem code ?



  • asoo 😃
    Ich versteh 😉
    Das Array wird an andere Stelle schon instanziert und ist schon mit Werten belegt. Es wird also in einer Klasse das Histogramm errechnet (in CdlgView)
    und in der Klasse CHistoView will ich diese Werte aus dem schon existierenden und gefüllten Array zur Darstellung weiterverabeiten. Dies ist aber mom. nicht möglich, da ich im Array der Darstellungsklasse nur Müll habe.
    Wenn ich aber das Array in der Berechnungsklasse auslese, sind die Daten korrekt.
    Daher meine Vermutung dass ich das Array irgendwie falsch aus der Berechnungsklasse in die Darstellungsklasse übertrage.
    Als Test diente diese Ausgabe des 100. Feldes:

    void CHistoDlg::OnGo() 
    {
    	CdlgView dlg; //Instanz der Berechnungsklasse anlegen 
    
    	CString str;   //hier teste ich ob das Array 
    	str.Format ("%i",dlg.m_Histo[100]); //mit korrekten
             MessageBox(str);    //Daten hier ankommt 
    }
    


  • Ja und schon wieder seh ich nur,dass du:

    CdlgView dlg;
    //keine operationen dazwischen
    str.Format ("%i",dlg.m_Histo[100]);
    

    schreibst. Ich sehe nicht wo was kopiert wurde. Wenn du also nichts ausgelassen hast und die Berechnung nicht im ctor stattfindet, arbeitest du logischerweise mit nem nicht initialisierten Array.

    CdlgView dlg; erzeugt eine neue Instanz, die nichts mit einer eventuell vorhandenen zu tun hat.



  • prolog schrieb:

    CdlgView dlg; erzeugt eine neue Instanz, die nichts mit einer eventuell vorhandenen zu tun hat.

    Ui.. mist. Da war mein Fehler !
    Wenn die neue Instanz nichts mit der bereits vorhandenen zu tun hat, wie komm ich dann an das Array der bereits existierenden Instanz ?



  • Kopieren. Oder per Referenz. Die Möglichkeiten sind vielfälltig.

    Zum Beispiel kannst du deiner CdlgView-Klasse eine Methode getArray oder so etwas geben, oder du implementierst den op= für CdlgView. Dann kannst du sowas machen:

    CdlgView inst1,inst2;
    
    inst1=inst2; //wenn der op= richtig implementiert ist werden auch die internen Daten richtig kopiert
    

    Kommt halt ganz auf die spezifische Fragestellung an. Wenn du evtl. ein bisschen konkreter werden könntest, würde das unter umständen helfen.



  • was meinst du mit op ?

    Was für infos brauchst du denn noch ? 😃

    ctr/dstr der array-füllenden Klasse:

    CdlgView::CdlgView()
    	: CFormView(CdlgView::IDD)
    {
    
    	//{{AFX_DATA_INIT(CdlgView)
    	//}}AFX_DATA_INIT
    }
    
    CdlgView::~CdlgView()
    {
    }
    

    ..der Klasse die die Array-Daten weiterverarbeiten soll:

    CHistoDlg::CHistoDlg(CWnd* pParent /*=NULL*/)
    	: CDialog(CHistoDlg::IDD, pParent)
    { 
    	//{{AFX_DATA_INIT(CHistoDlg)
    	//}}AFX_DATA_INIT
    }
    

    .. sind also leer.

    P.S. danke für deine Geduld 👍



  • Mit op= meine ich den operator= oder auch zuweisungsoperator.

    Du musst irgendwie deiner Histoklasse die Daten übergeben.

    Am einfachsten ist du übergibst der Methode der Histoklasse, die die Berechnungen ausführt das Array als parameter.

    class foo{
      public:
         const int *getArray();
         void getInput();
      private:
        int  *somedata_;
    
    };
    
    class bar{
      public:
         const bool doSthWithData(const int *);
    };
    
    foo fooinst;
    bar barinst;
    
    foo.getInput(); //Benutzer daten holen ..wie auch immer
    bar.doSthWithData(foo.getArray()); //mit daten irgendwas anstellen
    

Anmelden zum Antworten