erledigt: auf ein bestimmtes Array von verschiedenen Klassen aus zugreifen
-
[Edit]
Ein paar Sachen haben sich schon geklärt, am besten erst ab hier lesen.
[/Edit]Hallo allerseits!
Ich (als Anfänger) stoße gerade an eine Stelle, bei der ich den Eindruck habe, dass große Gefahr besteht, dass ich hier etwas umständliches oder unbrauchbares baue, daher wäre ich über Anregung von Erfahreneren ganz froh:
Es geht um den Umgang mit einer Variablen (ich nenne sie hier mal daten), die z.B. wie folgt aussehen könnte:
struct Datentyp { int: z,m; } Datentyp daten[xGroesse][yGroesse];Die Inhalte dieser Variablen sollen in verschiedenen Klassen (z.B. Klasse1) berechnet und in einer anderen (Klasse0) verarbeitet werden.
was dann z.B. so aussehen würde:
in Klasse1:include "Klasse0.h"; ... void Klasse1::berechnung(...) { ... daten[x][y] = ...; } ... Klasse0::verarbeitung(daten);...
mitvoid Klasse0::verarbeitung (Datentyp daten) {..}in Klasse0.
Meine Fragen dazu sind:
1. Geht das überhaupt? Ist ein Array einer selbst definierten Struktur als Parameter einer Funktion überhaupt möglich?
2. Ist das effizient? Ich könnte mir z.B. vorstellen, dass dieses Array dann beim Aufruf der Funktion verarbeitung in der anderen Klasse komplett kopiert werden müsste, was je nach Größe von xGroesse und yGroesse ja schon aufwendig sein könnte...
3. Ganz allgemein: Gibt es elegante Alternativen? Z.B. fände ich eine variable Größe des Arrays sher praktisch, aber das ist ja wohl nicht drin. Oder ginge das mit einem Vektor statt einem Array z.B.?
Danke und Gruß!
Edit:
Titel an Stand meines 4. Beitrags hier angepaßt
-
Hallo
1. Geht das überhaupt? Ist ein Array einer selbst definierten Struktur als Parameter einer Funktion überhaupt möglich?
Ja
2. Ist das effizient? Ich könnte mir z.B. vorstellen, dass dieses Array dann beim Aufruf der Funktion verarbeitung in der anderen Klasse komplett kopiert werden müsste, was je nach Größe von xGroesse und yGroesse ja schon aufwendig sein könnte...
Kannst ja mit Zeigern/Referenzen arbeiten.
3. Ganz allgemein: Gibt es elegante Alternativen? Z.B. fände ich eine variable Größe des Arrays sher praktisch, aber das ist ja wohl nicht drin. Oder ginge das mit einem Vektor statt einem Array z.B.?
Nimm std::vector, das ist wohl das einfachste und eleganteste. Kannst ja mal in die Artikel vom Magazin gucken, da steht was zur STL drin.
-
blup schrieb:
Hallo
1. Geht das überhaupt? Ist ein Array einer selbst definierten Struktur als Parameter einer Funktion überhaupt möglich?
Ja
Sehr schön

blup schrieb:
2. Ist das effizient? Ich könnte mir z.B. vorstellen, dass dieses Array dann beim Aufruf der Funktion verarbeitung in der anderen Klasse komplett kopiert werden müsste, was je nach Größe von xGroesse und yGroesse ja schon aufwendig sein könnte...
Kannst ja mit Zeigern/Referenzen arbeiten.
Ja, an so etwas dachte ich auch schon, allerdings fehlt mir dazu die Erfahrung.
Naiv kann ich nur folgendes vermuten:
In Klasse1 erzeuge ich neben dem Array daten einen Zeiger darauf:datentyp daten[xGroesse][yGroesse], *datenzeiger; datenzeiger = &daten;Der Aufruf der Verabeitungsfunktion der Klasse0 von Klasse1 sähe dann wohl so aus:
Klasse0::verarbeitung (*datenzeiger);Aber wie muss ich dann die Funktion verarbeitung in Klasse0 deklarieren?
Auch ganz klassisch alsvoid Klasse0::verarbeitung (Datentyp daten) {..}? Oder müßte ich dort auch irgendwie einbauen, dass ein Zeiger als Parameter übergeben wird?
blup schrieb:
Nimm std::vector, das ist wohl das einfachste und eleganteste. Kannst ja mal in die Artikel vom Magazin gucken, da steht was zur STL drin.
Danke schön, werde mich gleich auf die Suche begeben...

-
also mit ner Referenz hat es leider nicht geklappt:
void Klasse0::verarbeitung(float &z[3])führt beim Builden zur Fehlermeldung:
arrays of references are illegal
Hmmm....
Solangsam zweifle ich, ob es ünerhaupt möglich ist, die Berechnung eines eines Arrays in einer anderen Klasse vorzunehmen:
- Arrays sind als Rückgabetyp von Funktionen nicht erlaubt.
- Referenzen auf Arrays als Parameter sind auch nicht erlaubt!Wie bekomme ich das dann überhaupt hin?
(Erläuterung:
Ich bin gerade dabei, ein Projekt neu aufzusetzen.
Die erste Verion war vom Aufbau her recht dilatantisch, es spielte sich alles in der Klasse des Hauptdialogs ab. Das Array legte ich damals als globale Variable an, so hatten alle Funktionen darauf Zugriff.Nun will ich das aber sauberer machen, diese bisherige Klasse spaltet sich also in drei Klassen (bzw. später mehr) auf:
Die Dialog-Klasse(n) (MFC),
Die Berechnungs-Klasse(n) und
Die Verarbeitungs-Klasse
(letztere werden per include in die Dialog Klasse eingebunden, diese ist Quasi die Schaltzentrale)Könnte ich das Array auch im alten Sinne als eine Art globale Variable anlegen, so, dass von allen Klassen darauf zugegriffen werden kann?)
Danke und Gruß!
-
So, ich bin jetzt einen Schritt weiter:
Ich habe das Array einfach als Public Variable in Klasse0 angelegt, dann kann ich auch von der Dialogklasse darauf zugreifen.
(Und ich muss es nicht mehr als Parameter an eine Funktion übergeben.)Allerdings weiß ich nicht, wie ich dann von Klasse1 aus auf dieses Array zugreifen kann:
Die Variable des Typs Klasse0 in der Dialogklasse musste ich als globale (also nicht Membervariable) anlegen, da ich sie in einer Threadfunktion nutze, die ja statisch sein muss und somit mit Membervariablen nichts anfangen kann.
Daher kann ich von der Klasse1 nicht auf die Varibale des Typs Klasse0 in der Dialogklasse zugreifen.
Hat jemand also noch eine Idee, wie ich doch noch von Klasse1 aus auf dasselbe Array zugreifen kann, dass ich auch in Klasse0 und der Dialogklasse benutze?
Danke und Gruß!
-
dong schrieb:
Die Variable des Typs Klasse0 in der Dialogklasse musste ich als globale (also nicht Membervariable) anlegen, da ich sie in einer Threadfunktion nutze, die ja statisch sein muss und somit mit Membervariablen nichts anfangen kann.
OK, solangsam lerne ich es hoffentlich:
Dann legt man halt einen globale Zeigervariable auf die public Membervariable, auf die kann man auch im Thread zugreifen.
Jetzt noch gucken, ob dann der Zugriff von der Klasse1 auf das Array in Klasse0 über die Membervariable in der Dialogklasse klappt, mal gespannt....
Gruß!
-
So, noch einen Schritt weiter, es klappt aber immer noch nicht:
In Klasse1 habe ich Klasse0 included.
Dem Public Array aus Klasse0 habe ich den Namen "wert" gegeben.
In der Dialog Klasse kann ich auch wunderbar darauf zugreifen:
Klasse0 sfenster; sfenster.wert[0]=0.0; //klappt einwandfreiJetzt versuche ich auf genau dieses Array von Klasse1 aus zuzugreifen.
Dazu machte ich eine Klasse1 Member Funktion, die von der Dialog Klasse aus aufgerufen wird und der als Parameter die Variable sfenster vom Typ Klasse0 übergeben wird:void Klasse1:funktion (Klasse0 sfenster) { sfenster.wert[0]=5.0; }mit dem Aufruf in der Dialog Klasse:
Klasse1 egal; egal.funktion(sfenster);und das Array wird dann leider nicht beschrieben!
(genauer gesagt: Beim Debugen wird die Änderung in den locals angezeigt, aber sobald aus der funktion herausgesprungen wird, hat sfenster.wert[0] wieder den alten Wert!)
woran liegt das?(Ich habe alternativ auch schon einen Zeiger auf sfenster übergeben, brachte auch nichts....)
Danke & Gruß!
-
So klappt es, als Referenz:
void Klasse1:funktion (Klasse0 &sfenster) { sfenster.wert[0]=5.0; }Danke, dass ich durch das Schreiben hier meine Gedanken ordnen konnte.

-
Hi,
DAs liegt daran, dass du die Klasse nicht als Referenz übergibst und dann eine Kopie dieser Klasse erzeugt wird, in der du die Daten änderst.
So dürfte es funktionirenKlasse1::funktion(Klasse0 &sfenster) { //.... }Tschau
-
@Cappo:
Da war ich wohl 2s schneller

Trotzdem herzliches Danke!
