So - bin jetzt wieder daheim.
Ist es nun möglich diese Klassen mit Indexen zu versehen? Also class app(0), app(1), ...
Ich möchte diese dann später über eine Schleife aufrufen können:
Code:for (int x=0; x<APP_CNT;x++) { app(x).Run(); }
Hier sind Klassen erklärt:
http://www.cplusplus.com/doc/tutorial/classes/
Klassen haben einen Konstruktor und einen Destruktor. Beim Erzeugen eines Objekts der Klasse, also z.B. wenn du eine Klasse CMyClass hast, dann erzeugst du so ein Objekt: CMyClass MyClass; wird der Konstruktor aufgerufen, der das Objekt initialisiert, z.B. Speicher reserviert. Bei Programmende wird das Objekt gelöscht. Dadurch wird automatisch der Destruktor aufgerufen, der z.B. reservierten Speicher wieder freigibt.
So - bin jetzt wieder daheim.
Ist es nun möglich diese Klassen mit Indexen zu versehen? Also class app(0), app(1), ...
Ich möchte diese dann später über eine Schleife aufrufen können:
Code:for (int x=0; x<APP_CNT;x++) { app(x).Run(); }
Nein ist es nicht. Du müsstest ein Array von Klassenobjekten erstellen, also quasi so: CMyClass aMyClassObjects[10]; Jetzt kannst du über aMyClassObjects[i] auf die einzelnen Objekte zugreifen, also wie bei einem normalen Array. Auf die Elemente eines Objekts greift man wie bei Strukturen mit dem Punkt (.) zu.
Warum nimmst du eigentlich keine Struktur? Das wäre doch praktischer.
Weil ich noch recht neu zu C++ bin - hab bis jetzt immer C genutzt. Was ist denn da der Vorteil?Warum nimmst du eigentlich keine Struktur? Das wäre doch praktischer.
Wenn ich jetzt aber ein Array mit "CMyClass aMyClassObjects[10];" erstelle, hab ich doch 10 mal die gleiche Klasse (also Anwendung). Es sollen aber verschiedene sein.
Oder hab ich das falsch verstanden?
Oder kann ich das irgendwie mit Pointern machen?
Strukturen sind eindeutig aus C (kennst du das Keyword struct nicht?!)
Ich verstehe nicht ganz was zu du vorhast. Bei diesem Array hättest du 10 Objekte, diese sind von der gleichen Klasse, können aber natürlich verschiedene Werte annehmen. Das ist wie bei einem Array von integern, alles sind Integer, aber alle Elemente können unterschiedliche Werte haben. Falls du unterschiedliche Objekte (also Objekte von verschiedenen Klassen) erstellen willst, kannst du natürlich kein Array nehmen.
Am besten du suchst dir im Internet mal ein Tutorial zu Klassen oder kaufst dir gleich ein C++-Buch, wenn du es ernst meinst mit dem Lernen, das bringt dir nämlich 100x mehr.
Zu deinem Beispiel, ich nehme an, dass du eine Klasse CApplication erstellen würdest. Nehmen wir an, du hast 10 Apps, dann erzeugst du die Objekte als Array: CApplication aApps[10]; Jetzt kannst du über eine SChleife auf ein Objekt nach dem anderen zugreifen:
for(int i = 0; i < 10; i++)
aApps[i].run();
Mit Zeigern kannst du natürlich auch arbeiten, aber wozu die Sache unnötig kompliziert machen?
Erkläre am besten mal, was du genau vorhast.
OK - noch mal von ganz vorne.
Ich habe mehrere Klassen mit unterschiedlichem Inhalt. Also (so wie ich es mir vorstelle):
OK... jetzt stoß ich selbst bei der Planung auf Probleme. Aber trotzdem:Code:class app[0] { void Run() { // Z.B. Text ausgeben: Hallo Welt! } void Close() { //Tschuess Welt! } } class app[1] { void Run() { // Z.B. Text ausgeben: Hallo Universum! } void Close() { //Tschuess Universum! } }
Die Klassen haben auch noch eine static Variable mit dem Namen der Anwendung.
In main wird also erst eine Schleife durchlaufen: (Syntax: CreateButton(ID, Caption);)
for (int x=0;x<2;x++) {
CreateButton(x,app[x].name);
}
Dann wird in einer unendlichen Schleife geprüft ob einer der Buttons gedrückt wird und dann ggf. die Klasse erstellt und danach Run() aus der erstellten Klasse ausgeführt. Dann gibt es noch ne Taste um die Anwendung zu beenden - also erst Close() aufgerufen und dann die Klasse zerstört.
Ich hoffe es ist jetzt klarer. Ja ich kenne struct. Jedoch verstehe ich nicht was ich in meinem Fall damit machen kann. [/code]
Programmierst du jetzt eigentlich für einen AVR oder für Windows??
Sorry, aber das ist 1. nicht der Sinn einer Klasse und 2. ist die Syntax total falsch.
Les mal das durch (es reicht, wenn du verstehst, zu was eine Klasse gut ist und wie sie grundlegend aufgebaut ist, den Abschnitt über Operatoren z.B. musst du nicht wissen:
http://www.rpgstudio.de:8181/scienti...en_und_Objekte
Hier noch was über statische Elemente:
http://www.rpg-studio.de:8181/scient...en_von_Klassen
Und noch was zur Objektorientierung (warum man Klassen verwendet und zu was):
http://de.wikipedia.org/wiki/Objekto...Programmierung
OK Danke. Ich werde dann mich mal noch etwas einarbeiten...
Und es geht schon noch um AVRs, wobei es bei diesem Thema egal ist.
Du solltest mal genau beschreiben was du machen willst. Wenn auf einem AVR mit Klassen RAM "gespart" werden muss, ist doch schon am Konzept was verkehrt!? Wie viele Daten, und vor allem was für Daten müssen ausgetauscht werden? Wie voll ist das RAM bisher, und womit? Was soll das insgesamt mal werden?
Wie wird es überhaupt realisiert, das zur Laufzeit mehrere deiner "Apps" ausgeführt werden können? Hast du eine Art Thread-handler implementiert? Oder ist das viel mehr nach dem Motto "Der Anwender wählt etwas aus, das wird einmal ausgeführt und gut"?
Ich glaube du machst dir das Leben hier unnötig schwer.
Mehr Infos!
Also mal das ganze Projekt:
[glow=red:a788bbb513]1. Hardware: [/glow:a788bbb513]
Die Hardware ist grundsätzlich ein Atmega644/32 und ein Datavision DG-16080 GLCD. Näheres auf http://www.youtube.com/watch?v=HRuNeVdNExo
[glow=red:a788bbb513]2. Software: [/glow:a788bbb513]
Ich habe nun vor eine einfache programmierung für dieses Board zu ermöglichen. Man soll also die Möglichkeit haben, eine Anwendung (dafür ist die Klasse) zu schreiben, die dann automatisch in einer Anwendungsliste auftaucht und das "Multitasking" (Ist eigentlich keins, sondern es soll immer zwischen den AppProc()-Funktionen der einzelnen laufenden Anwendungen gewechselt werden.Also immer nacheinander.) unterstützt.
Für dieses Prinzip soll jede Anwendung wie folgt aufgebaut sein:
AppName="NAME";
AppIcon=[Icon];
//Nun der optionale Teil mit den Variablen die das Programm benötigt. (Z.B. die GUI-Elemtente)
AppStart() Der Code der einmal am Start der Anwendung ausgeführt wird. (Also z.B. Daten aus dem EEPROM holen)
AppFocus() Wird ausgeführt wenn die Anwendung den Fokus ERHÄLT. (Also z.B. das akt. Formular aufbauen)
AppProcFocus() Wird ausgeführt, wenn die Anwendung den Fokus HAT. Z.B. zum verarbeiten von Tasteneingaben.
AppProc() Wird immer ausgeführt, sobald die Anwendung läuft. (Z.B. für ein Programm, dass einen Wert über die serielle Schnittstelle sendet)
AppClose() Wird beim schließen des Programms aufgerufen. (Z.B. zum Speichern eines EEPROM-Werts)
Und diese Apps werden zur Laufzeit gestartet und beendet.
Ich hoffe es wurde ein bisschen klarer,was ich vorhabe und wenn ihr noch Fragen habt, stellt diese bitte.
Auf jedenfall schon mal Danke für eure bisherige Hilfe!
C_Classic
Lesezeichen