Hallo zusammen,
erstmal ich bin ein total Noob in C#.
Ich möchte folgendes Realisieren:
Eine Klasse "Pufferspeicher" hat eine Struktur "Ebenen" in der 3
verschiedene Temperaturen hinterlegt sind. Die Anzahl der "Ebenen" in
dem Pufferspeicher kann man eingeben.
In abhängigkeit der "Ebenen" sollen nun automatisch beim Aufruf der
Klasse die Anzahl der Strukturen "Ebenen" erzeugt werden.
Ebene Ebene1 = new Ebene();
Ebene Ebenex = new Ebene();
usw...
public struct Ebene
{
double Tupper;
double Tlevel;
double Tunder;
double Tconv;
}
Die Temperaturen in den Ebenen werden im Laufe einer Simmulation ständig
neu berechnet und hier abgelegt.
Hat jemand eine Lösung oder wäre es einfacher für die 3 verschiedenen
Temperaturen Arrays zu nutzen.
Danke und Gruß
Kaiculon
Kai A. schrieb:> In abhängigkeit der "Ebenen" sollen nun automatisch beim Aufruf der> Klasse die Anzahl der Strukturen "Ebenen" erzeugt werden.
Was meinst du mit "Aufruf der Klasse"
Eine Klasse ist in der OOP sowas wie ein Schema, eine Beschreibung
zusammengehöriger Dinge. Im Prinzip das was in C ein struct ist, nur daß
eine Klasse zusätzlich zu den Daten auch Methoden hat (haben kann) um
die Daten zu ändern.
Um jetzt wirklich damit arbeiten zu können, musst du mit new() eine
Instanz dieser Klasse erzeugen. Das ist wie wenn du eine variable vom
Typ einer struct definierst.
Mit dieser Instanz/Variable kannst du jetzt arbeiten, Methoden aufrufen
oder auch öffentlich zugängliche (member)variablen direkt ändern.
Ausnahme sind Klassen die statische Methoden oder variablen definiert
haben. Nur da kann man direkt über den Klassennamen auf die
entsprechende Variable/Methode zugreifen.
Ja, das mit der Liste funktioniert. Danke!
Wie würde die Struct dann in einem Array aussehen?
Mit Aufruf der Klasse meine ich natürlich eine Instanz erzeugen ;)
Danke und Gruß
Ich habe die Liste nun wie folgt erzeugt.
public struct LEVEL
{
public double Tupper;
public double Tlevel;
public double Tunder;
public double Tconv;
}
List<LEVEL> Level = new List<LEVEL>();
for (int i =0; i < AnzahlLEVEL;i++)
}
Level.Add(new LEVEL());
}
Die Klasse "Pufferspeicher" wird in einer Form instanziert wenn ich
einen Button klicke. Gleichzig werden nun auch verschiedene Temperaturen
berechnet welche ich nun direkt in die variablen der Liste Struct
schreiben will. Ich kann aus der Form aber nicht auf die Liste
zugreifen.
Wie kann dass funktionieren?
Kai A. schrieb:> weil ich nicht weiß wie ;)
Ich dachte dein Datenspeicher ist ein Member der Form, aus der du auch
darauf zugreifen willst? Dann gibt es da doch keinerlei Hürden ;-)
Nein, ich instanziere in der Form die Klasse Pufferspeicher. Der
Datenspeicher ist ein Member der Klasse Pufferspeicher. In der Form
instanziere ich die Klasse Pufferspeicher.
Kai A. schrieb:> Nein, ich instanziere in der Form die Klasse Pufferspeicher. Der> Datenspeicher ist ein Member der Klasse Pufferspeicher. In der Form> instanziere ich die Klasse Pufferspeicher.
gut und wo ist nun das Problem?
Du kannst uns auch code zeigen.
Kai A. schrieb:> Nein, ich instanziere in der Form die Klasse Pufferspeicher. Der> Datenspeicher ist ein Member der Klasse Pufferspeicher. In der Form> instanziere ich die Klasse Pufferspeicher.
Nimms nicht persönlich, aber ich glaube dir fehlen ganz elementare
Grundlagen. An deiner Stelle würde ich einen Tag opfern, und mich durch
ein schönes C#-Tutorial arbeiten. Wenn du dann über Klassen, Member,
Properties, Methoden und ein paar Grundlegende Entwurfsmuster Bescheid
weißt, wird auch dein aktuelles Projekt deutlich leichter fallen.
Jaja, das letzte mal das ich programmiert hab war Turbo Pascal im
studium. Ich hab nächsten Monat einen Kurs, das dauert mir aber zu
lange. Ich posten den Code mal trotzdem und schreibe dazu was ich
"eigentlich" machen will. Wenn ihr keinen Bockt habt kann ich das auch
verstehen, nehm das nicht persönlich.
Also, bin für alle sinnvollen Vorschläge bzgl. Struktur und zum
grundsätzlichen Vorgehen dankbar.
Hier erstmal der Code der Klasse Pufferspeicher:
doublehlevel=PS.GetHLEVEL(VDOTS,DIA,LEVEL);// Berechnung der Schichthöhe
63
label1.Text=hlevel.ToString();
64
double[]vlevel=newdouble[LEVEL];
65
vlevel=PS.GetVLEVEL(VOLUME,LEVEL);// Berechnung des Volumens der verschiedenen Schichten
66
label4.Text=vlevel[2].ToString();
67
doubleuload=PS.GetULOAD(VDOTS,DIA);// Berechnung der Ladegeschwindigkeit
68
doubleuheat=PS.GetUHEAT(VDOTS,DIA);// Berechnung der Heizgeschwindigkeit
69
label15.Text=uload.ToString();
70
doubletest1=PS.GetTLEVEL(t,T0,tconv);
71
label8.Text=test1.ToString();
72
73
74
75
76
77
78
}
Der Pufferspeicher hat je nach eingabe eine Anzahl an Level. Ich will
für jedes level die 3 zugehörigen Temperaturen ausrechnen. Anschließend
bekommt der Speicher einen Input an Wärmeenergie und einen Output an
Wärmeeinergie. Das verändert die die innere Konvektion des Speichers und
der verschiedenen Schichten. Diese errechne ich in °C/s. in Abhängigkeit
der Simmulationsdauer ändert sich also die Temperatur der Schichten (T
Eingang in die Schicht, T Schicht und T Ausgang aus der Schicht).
Diese Werte sollen in das Struct LEVEL geschrieben werden und ständig
aktualisiert werden.
Danke und Gruß
das sieht sehr merkwürdig aus
> Level.Add(new LEVEL());
ok, ein neues objekt in Level
> LEVEL To = Level[0];
hier wird ein neues objekt als KOPIE von Level[0] angelegt
> To.Tupper = Tx;
ok
> Level[0] = To;
und wieder zurückkopiert, ok
> LEVEL Tl = Level[1];
woher soll jetzt auf einmal Level[1] kommen?
Ich denke da liegt ein grundsätzliches strukturelles Problem vor.
Du musst dir darüber im klaren sein, dass du in deinem Programm so etwas
wie eine Hierarchie brauchst.
d.h. da gibt es eine Klasse, welche als deine Applikation an sich
auftritt
In dieser Klasse sind alle 'globalen' Dinge versammelt, die eben deine
Appliktion ausmachen
Dann gibt es noch Forms, die zu dieser Applikation gehören und die zb
Zugang zu diesen applikationsweiten Daten haben und sie manipulieren.
Die Aussage "Hier erstmal der Code der Klasse Pufferspeicher:" und der
Klassenname "Puffersimulation" beissen sich schon mal für meine
Begriffe. Denn der Pufferspeicher ist Teil der Simulation. Aber er IST
nicht die Simulation.
Genauso wie hier:
Puffersimulation PS = new Puffersimulation();
Deine Form1 kann nicht die Puffersimulation erzeugen. Denn die Form ist
Teil der Simulation. Wenn schon, dann könnte höchstens das
Simulationsobjekt die Form erzeugt haben.
Wie Peter II schon sagte: das alles sieht sehr merkwürdig aus. Es sieht
nicht richtig aus, auch wenn es nicht nur eine einzige Stelle gibt, auf
die man zeigen könnte und sagen könnte: da steckt der Fehler. Es ist
irgendwie alles ein wenig falsch bzw. merkwürdig.
Jetzt ist es aber so, dass in diesen C# Forms Anwendungen eine Form
(deine Form1) als das Applikationsobjekt fungiert. D.h. die oberste Form
verwaltet alle applikationsweit verfügbaren Objekte. In diesem Sinne
kann diese Form dann sehr wohl das Puffersimulationsobjekt erzeugen
(auch wenn ich persönlich das für etwas seltsam halte, aber so ist das
nun mal in der Forms-Programmierung).
Aber: dann kann Puffersimulation keine Methode
1
// Methode Main
2
publicvoidMain()
3
{
4
List<LEVEL>Level=newList<LEVEL>();
5
for(inti=0;i<AnzahlLEVEL;i++)
6
{
7
Level.Add(newLEVEL());
8
LEVELTo=Level[0];
9
To.Tupper=Tx;
10
Level[0]=To;
11
LEVELTl=Level[1];
12
Tl.Tlevel=Tx;
13
Level[1]=Tl;
14
LEVELTu=Level[2];
15
Tu.Tunder=Tx;
16
Level[2]=Tu;
17
LEVELTc=Level[4];
18
Tc.Tconv=0;
19
Level[3]=Tc;
20
}
21
}
haben, denn die wird nie aufgerufen. Das Programm startet nicht hier,
sondern es startet mit der Erzeugung der ersten Form.
Und diese Form wiederrum erzeugt dann das Puffersimulation Objekt. Aber
es ruft nicht Main auf.
Und vor allen Dingen hält momentan das Puffersimulations Objekt nicht
die Liste der LEVEL Objekte, denn die ist ja hier
1
publicvoidMain()
2
{
3
List<LEVEL>Level=newList<LEVEL>();
lokal zu dieser Methode.
Alles in allem:
Da sind einige strukturelle Probleme. Du solltest dir erst mal klar
machen, welches Objekt welche anderen Objekte enthält. Enthalten muss.
Einfach drauf los coden, geht auch in einer objektorientierten Welt
schief.
Da war Turbo Pascal aber einfacher ;)
OK, das ist ein Ansatz mit dem ich arbeiten kann. Ich habe
beispielsweise die Klasse Pufferspeicher mit ihren Konstruktoren,
Eigenschaften und Methoden.
Dann habe ich eine Ausführende Klasse in der ich die Klasse
Pufferspeicher instanziere und alle globalen größen anordne und die
Methoden einer Klasse Pufferspeicher und z.B. einer Klasse Berechnungen
nutze und ausführe.
Ich versuche das mal so umzusetzen.
DAnke und Gruß