Mehrdimensionales CArray
-
Also meist du ich kann auch ruhig schlafen wenn ich die Arrays so (also einfach groß genug) lasse?! Das mit dem Zeiger bekomm ich leider nicht richtig hin, ich komm immer nur an das 0te Element, ich muß aber auf alle zugreifen könne!
In Klasse 1 hab ich folgendes:double array[2][21][3000];Soll dann in Klasse 2 in etwa folgendes?!
GetArray(double *array) { double *ar; ar=array; }Und in Klasse 1 übergeb ich dann das Array:
Klasse2.GetArray(array);Jetzt kann ich aber leider nicht auf die Element von array über ar zugreifen!??!

-
Erstmal: Ja, du kannst die Arrays auch so lassen, wenn es dir nicht so auf den Speicher ankommt.
Und zu der Übergabe:
Von wo nach wo willst du das Array geben und wo wird was damit gemacht?Also die Funktion, die du eben gepostet hast hat keine erkennbare Funktion.
Beschreib bitte mal genau, was du tun möchtest. Zur Not immer ein Problem pro Post, damit wir nicht durcheinander kommen.

-
Okay, dann bin ich beruhigt. Also, ich erklär mal:
Ich hab eine Klasse "Berechnen". Diese Klasse ließt viele Daten aus einer Datei in verschiedene (1, 2 und 3-Dim) Arrays ein. Wieviele ist eben immer verschieden, mehr als 2000 sind es aber nicht, deshalb hab ich die Arraydim. auf 3000 gesetzt. So, nun leß ich also z. B. Spannungs- und jeweils zugehörige Stromwerte in ein 2Dim Array (double str_spg[2][3000]) ein. Mit diesen und den anderen eingegebene Werten wird nun gerechnet und die berechneten Werte werden wieder in ein Array geschrieben. Dieses Array soll nun an die Klasse "Zeichnen" sowie an noch 3 andere Klassen übergeben werden. Bisher tu ich das so://Zeichnen.cpp GetArray(array[2][3000]) { for(int i=0;<=1;i++) for(int j=0;j<=2999;j++) m_newArray[i][j]=array[i][j]; }//Berechnen.cpp Zeichnen.GetArray(str_spg_berechnet);So habe ich jetzt ja in m_newArray alle Werte, aus str_spg_berechnet der Berechnen Klasse. So möchte ich das auch weiterhin haben, nur eben ohne den ganzen Schleifendurchlauf, da es wie gesagt um die 30 Arrays sind und jedes so zu druchlaufen ist doch bißchen kese!
Hoffe das ist jetzt einigermaßen verständlich, ist bißchen schwer zu erklären!Grüße Nico
-
So, ich hoffe ich hab jetzt verstanden, was du möchtest...
Also, in deiner Berechnen Klasse bleibt alles wie gehabt, das Array (die Arrays) wird wie gewohnt angelegt und gefüllt.
Und in der Zeichnen Klasse benutzt du nur einen Zeiger auf das Array, der ist etwas anders zu handhaben, da mach dich bitte mal aus Büchern schlau, ich hab nicht die Zeit das auszuprobieren, ist etwas her, dass ich reines C gebraucht hab.
Aber wie die Funktion zum Übergeben geht zeig ich dir:
// Diese Zeile muss sein, damit der Compiler sich sicher sein kann, dass // ein und dasselbe Array gemeint ist. typedef double array[2][21][3000] arraytypname; arraytypname arrayname; arraytypname* Berechnen::GetArray() { return arrayname; }So ungefähr sollte es stimmen. Ich bin da nicht mehr so fit. Frag wenn es nicht geht nochmal im C++ Forum oder im Ansi C Forum. Das ist ein Zeigerproblem.
Du solltest es auf jeden Fall vermeiden, deine Arrays immer zu kopieren, DAS ist Speicherverschwendung pur.
Zur Not mach sowas:
double Berechnen::GetFromArray(int x, int y, int z) { return arrayname[x][y][z]; } // Und in der Zeichnenklasse kommst du dann so an dein Array: // ... double temp = berechnen.GetFromArray(1,2,3); // ...Verstanden?

-
Vielen Dank! Die zweite Variante hatte ich auch schon in Betracht gezogen, aber die erste werd ich jetzt erstmal probieren, auf sowas wär ich nie gekommen!! Bin mal gespannt obs hinhaut

Viele Grüße
Nico
-
Ich halte dir die Daumen.
Wenns nicht geht kannste ja das Versuchsergebnis mal posten (Quelltext und Fehlermeldungen bzw. Beschreibung).

-
hab mich leider zu früh gefreut

bekomme nach dieser Zeiletypedef double array[2][21][3000] arraytypname;gleich den fehler:
Berechnungen.cpp(27) : error C2146: Syntaxfehler : Fehlendes ';' vor Bezeichner 'arraytypname'
Berechnungen.cpp(27) : error C2065: 'arraytypname' : nichtdeklarierter Bezeichnerund noch etwas ist mir aufgefallen: ich erzeuge ja in Berechnungen ein Objekt der Klasse Zeichnen, also bringt es mr ja gar nix, wenn ich in Berechnen eine GetArray Methode habe, ich brauch ja in Zeichnen eine Methode, die das Array aus Berechnen übernimmt.
-
F***, ja ich hab Schrott geschrieben, jetzt wo ich es lese...
aber ich weiß nicht mehr, wie das richtig wäre. *schäm*
Zu deiner Erkenntnis:
Gib das Array doch gleich dem Objekt in den Konstruktor.
-
Im Konstruktor übergeben geht ja net weil ich wie gesagt um die 30 Arrays habe. Ist die Speichervergeudung wirklich so groß, wenn ich die Arrays per Schleife kopiere? Die Laufzeit ist eigentlich sehr gut. Oder hast du eine Idee, wie ich das ganze sonst noch realisieren könnte?? Habs auch schon mit vector aus der STL probiert, hatte aber auch keinen Erfolg. Ich kann mir einfach nicht vorstellen, dass es keine oder nur sehr umständliche Möglichkeit gibt, dynamische, mehrdimensionale Arrays zu erzeugen und diese auch an andere Klassen zu übergeben

Weiß denn gar niemand Hilfe, ich verzweifle noch

-
Wenn du ein Array kopierst brauchst du den doppelten Speicher (hast ja zwei Arrays).
Kleines Rechenbeispiel:
Der Einfachheit halber ein char array.sieht dann so aus:
char array[2][21][3000];Macht 2*21*3000 Byte = 126KB.
Du hast 30 Arrays:
126KB * 30 = 3780KB das sind fast 4 MB.Ein schlechter PC hat maximal 128BM RAM, das ist nur 32 mal mehr... (32 solche Programme und dein Speicher is futsch.)
Ich finde das ist viel. Zumindest als Preis für "Das ist so viel einfacher...".
Ich könnte dir jetzt zusätzlich einen Vortrag über die erhöhte Laufzeit halten, aber das kannst du ja auch ausprobieren.
Lass dir mal die Zeit geben für:for (int s = 0; s < 3780000; s++) int x = 1;bzw.
int x = 1;Vielleicht kannst du es ja auch sehen...
Hast du schonmal im C Forum wegen dem typedef gefragt? Oder mal nachgeschaut? In einem Buch? Im Netz?
-
Hm, das stimmt natürlich, hab mal im Taskmanager nachgeschaut, mein Prog bruacht 24MB Speicher...
In Büchern und INet hab ich schon gesucht, aber leider nix gescheites gefunden. Im C Forum werd ich wohl noch fragen...
Aber ich hab noch eine andere Idee: wäre es evtl besser, wenn ich die Arrays mit new anlege und lösche, sobald sie nicht mehr gebraucht werden? Wäre das evtl ein Kompromis?!
-
Das mit new wäre wirklich ein Kompromiss.
Vielleicht könntest du das beim new sogar so machen, dass du dir nur so viel holst, wie du brauchst - das wäre richtig gut.
Vielleicht fällt dir bei dem Umbau auch gleich ein (auf), wie du einen Zeiger auf dein Array kriegst. Dann wäre doch das mit dem Kopieren überflüssig.
Ich guck jetzt nochmal in meine alte Mappe, ob da was passendes drin steht.

-
Okay, dann werd ich das doch gleich mal alles umstellen!
Das wär super, falls du was findest poste einfach nochmal!
THX!!
-
Ich poste dir jetzt einfach mal die Links zu typedef, die ich gut finde:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dndeepc/html/deep08032000.asp
http://c.mincando.pe.kr/c_097.htm
http://www.iplusplus.com/CppRef/Typedef_Specifier.html
und hier dein Problem in einem englischen Forum: http://www.mainframeforum.com/t423883.htmlUnd der Beitrag hier ist auch noch interessant für dich: http://www.tutorials.de/tutorials65918.html
Viel Spaß beim Lesen
PS: Meine Mappe ist leider gerade nicht auffindbar - aber es gibt ja das Internet.

-
So, jetzt hab ich mal alles mit new gemacht, hab jetzt nen Speicherverbrauch von ca. 6MB in der Release Konfig. Denk das ist soweit okay, Laufzeit ist auch gut!
Vielen Dank nochmal für deine Hilfe! Mit dem Thema "Multilanguage" kennst du dich nicht zufällig aus?!
-
Schön, dass es doch noch geklappt hat.

Kopierst du die Arrays denn noch? Oder geht die Zeigerübergabe jetzt auch?
Mit Multilanguage habe ich mich vor über 2 Jahren mal beschäftigt, ein bisserl weiss ich also. Eine Schritt für Schritt Anleitung kann ich dir aber leider nicht geben. Ich weiss nur noch, dass das damals über Resourcendlls gelöst wurde. Den Teil hat aber leider jemand anderes programmiert.
-
Das mit der Zeigerübergabe hab ich leider nicht hinbekommen, aber ich erstell die Arrays jetzt ja über new, kopiere dann nur die tatsächlich enthaltenen Elemente und geb den Speicher des "alten" Arrays dann wieder frei, dadurch geht es auch mit kopieren denk ich. Ich hab in der FAQ einen Beitrag zu Multilanguage gefunden, aber leider kapier ich das mit den DLL's nicht. Ich muß eine neue DLL erstellen und dort dann irgendwie die Dialoge aus meinem Hauptprog laden, aber wie? Und dann in der DLL einen Stringtable für die entsprechende Sprache anlegen, aber wie sag ich dann meinem Hauptprog welche Stringtable und welche Dialoge er aus der DLL laden soll

-
Schade, du scheinst bei der Sache mit der Mehrsprachigkeit wirklich von Anfang an Hilfe zu brauchen, das kann ich nicht.
Poste es mal als neuen Thread, damit sich das Thema ändert und andere das lesen.
Viel Erfolg noch

-
hatte ich schonmal, leider keine Antwort erhalten

Trotzdem nochmal Dankeschön, schönen Tag noch!
Grüße Nico