Pointer Array Zuweisung..

MortenV

Mitglied
Hi,
ich habe folgendes Problem:

Ich habe 2 Klassen. In jeder gibt es eine Member-Variable vom selben Typ und Größe:

Code:
  typedef long	THistogram  [256];

KlasseA Variable:
m_Histo

KlasseB Variable:
*m_HistoDraw

Mit dieser Methode aus KlasseA:
Code:
THistogram* KlasseA::GetHistogram(void){
 return &m_Histo;
}

hole ich die Variable nach Klasse B....
Code:
 KlasseA dlg;
  m_HistoDraw=dlg.GetHistogram();

Nach meinem Verständis müssten nun doch beide Array's identisch sein,
sie halten jedoch unterschiedliche Daten... warum ?
Wäre für jede Idee dankbar,
mfg Morten
 
Klassischer Denkfehler:

Arrays kann man nur kopieren in dem man den kompletten Inhalt, Element für Element,
kopiert. Mit ner for-Schleife, damit ich nicht falsch verstanden werde.

Ansonsten mußt du es mit richtigen Zeigern machen, sprich, das Feld der einen Klasse
fest anlegen, und dann mit der anderen Klasse nur einen Zeiger holen. Ist für deine
Anwendung (so wie mir scheint ) allerdings nicht sinnvoll.

Greets,
BadMourning
 
du meinst das sicher so, oder?

Code:
for (int i=0;i<256;i++){
 *m_HistoDraw[i]=(long)dlg.GetHistogram()[i];
 }

Nur leider habe ich wohl ein Problem mit dem Zeiger:
Zur Laufzeit schmiert die Anwendung an dieser Stelle ab.
 
Du hast noch ein zwei Schönheitsfehler:

1. GetHistogramm:

m_histo ist bereits ein Pointer, deswegen

Code:
return m_histo;    // statt return &m_histo

2. for-Schleife
ich weiß nicht, ob es wirklich geht nach dem Funktionsaufruf eine [] zu setzen.
besser so:

Code:
for (int i=0;i<256;i++)
{
m_HistoDraw[ i ] = *( dlg.GetHistogram() + i);
}

3. bist du sicher daß der typedef so geht ? Hab ich noch nie ausprobiert...

Greets
BadMourning
 
hm.. geht auch nicht.
Ich hab das jetzt ganz einfach gemacht, ich kopiere keine Array's mehr, sondern greife direkt auf das original zu.

in KlasseA liegt m_Histo (long [256])

nun will ich die 256 Werte aus dem Array aber in einer anderen Klasse/Dialog weiterverarbeiten:

Code:
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
 
Sorry, irgendwie steig ich nicht ganz dahinter was da passieren soll.
Und ich zweifle langsam an meinen Programmierkenntnissen.

Sicher, irgendwo greifst du auf falschen Speicher zu. Könnte
weiterhin an deiner Kopieraktion liegen.

Was mir immer noch spanisch vorkommt ist dein typedef.
Wieso gibst du zum Beispiel ein THistogram* statt einfach ein long*
zurück. Du brauchst nicht unbedingt Pointer auf Pointer, was nach
meinem Verständnis THistogram* ist, da das ja wieder long*[256], also
long** ist. Wahrscheinlich hast du dich mit diesen Pointern vertan, und
du liest deine Werte einmal aus long* und einmal aus long**. Wie gesagt:
lasse den typedef weg und arbeite nur mit long-Feldern/Pointern. Das stiftet
nur Verwirrung, sowohl bei mir als auch bei dir...

Greets
BadMourning
 
Da die CdlgView Instanz noch existiert, wenn du DrawHisto der CHistoDlg Instanz aufrufst,
und du den Pointer m_Histo von CdlgView richtig (nehm ich mal an) geholt hast, sollte der
Inhalt natürlich identisch sein.
Wobei der Code den du geschrieben hast, anders gedeutet werden kann. In CHistoDlg::OnGo legst du einen CDlgView dlg an, den du aber in DrawHist nicht kennen kannst. Wahrscheinlich legst du dort nocheinmal ein Objekt CDlgView an. Damit hast du zwei verschiedene Objekte von CDlgView.

Trotzdem solltest du nicht direkt auf das Objekt m_Histo in CdlgView zugreifen. Mach eine Methode in CdlgView, die den Inhalt zurückgibt.

Code:
void CDlgView::GetHistogram(THistogram &h)
{
  for(int i = 0; i < sizeof(THistogram)/sizeof(long); i++)
  {
 h[i] = m_Histo[i];
  }
}

Damit kannst du in CHistoDlg ein Objekt von THistogramm anlegen und den Inhalt ausgeben
Code:
void CHistoDlg::OnGo() 
{
  CdlgView dlg;

  dlg.GetHistogram(m_HistoVonHistoDlg);

  CString str;
  str.Format ("%i",dlg.m_Histo[100]); 
  MessageBox(str);
  DrawHisto (); 
}


Wobei es sicher noch bessere Lösungen für das gesamte Problem gibt, z.B.: um Abhängigkeiten der Klassen untereinander zu minimieren.
Aber wie es aussieht bist du noch nicht sehr lang beim C++ programmieren. Deshalb ist es sicher OK mit einer einfachen Lösung weiterzumachen.
 
Es ist folgendermaßen:

Es existiert ein Fenster der Klasse CdlgView..
Dann wird ein Fenster aus Klasse CHistoDlg gerufen..

Mein Fehler war, dass ich hier..
Code:
CdlgView dlg;
 CString str;
 str.Format ("%i",dlg.m_Histo[100]); 
	MessageBox(str);

.. eine neue Instanz der Klasse CdlgView kreiere und gedacht habe, sie würde alle Daten der bereits vorhandenen Instanz beinhalten.
Ich muss also irgendwie auf die bereits vorhandene Instanz der Klasse CdlgView zu greifen können. Demnach fallen auch Get-Methoden in CdlgView aus, da ich ja eine Instanz derer anlegen müsste... und wieder komme ich nicht an die Daten der aktuellen,laufenden Instanz heran..
 
Wenn die Klasse CdlgView Zugriff auf CHistoDlg hat, oder CHistoDlg sogar anlegt, dann übergib der CHistoDlg das m_Histo über eine CHistoDlg Methode oder im Konstruktor und kopier die Daten dort.
Code:
class CHistoDlg ...
{
 ...
 ...
public:
   void SetHistogram(const THistogram &h);

private:
  THistogram m_HOutput;  // Histogram to show
};
void CHistoDlg::SetHistogram(const THistogram &h)
{
   for(int i = 0; i < sizeof(THistogram)/sizeof(long); i++)
   {
      m_HOutput[i] = h[i];
   }
}

In deiner Ausgaberoutine von CHistoDlg hast du damit die Daten des Histograms.

Dort, wo du CHistoDlg anlegst oder bevor er angezeigt wird, übergibst du das Histogram.
CldgView::JetztGehtsLos()
{
CHistoDlg dlg;
dlg.SetHistogram(m_Histo);
dlg.DoModal();
...
}
 
Zurück