Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 02.01.2008 um 23:18 Uhr
Zuletzt editiert am: 02.01.2008 um 23:28 Uhr
|
|
Zitat von uwebaier:
Was genau meinst du mit fertigen Klassen? Für Datentypen usw. oder wie?
Na für dein Array "Objekts" zum Beispiel ... anstatt hier eine eigene Arrayverwaltung mühsam drumrum zu programmieren, obwohl dir noch sehr viel Hintergrundwissen zu Speicherverwaltung etc. fehlt (darf ich doch so behaupten oder?), solltest eine vorgefertigte Klasse nehmen, die dir die Speicherverwaltung abnimmt.
die C++ Standardbibliothek bietet hierfür zum Beispiel die Containerklassen
std::vector ; std::deque ; std::list
die nehmen dir für dein Array schonmal die Speicherverwaltung ab - bieten im Fall von deque und vector indizierten Zugriff, erlauben leichtes Löschen, Einfügen etc. von neuen Elementen und noch viele Dinge mehr
std::string für Zeichenketten bietet Vergleichsoperatoren und ebenfalls eine Reihe von nützlichen Funktionen um Informationen zu bekommen und zur Manipulation der Elemente
Ähnlich ist AnsiString aus der VCL, die du verwendest - einfach und intuitiv zu verwenden und du kannst dich auf die eigentliche Logik deines Programms konzentrieren anstatt dich mit Problemen von blöden C-Zeichenketten rumzuschlagen.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
|
Geschrieben am: 02.01.2008 um 23:31 Uhr
|
|
Naja, ich danke mal den beiden Herren ^^
std::string nehm ich schon aber die Sache mit der Speicherverwaltung muss ich wohl nachgooglen...
Vielen Dank für eure Hilfe, ich bin mir (fast) sicher, dass ich bald wieder eure Hilfe brauchen kann
UT3 Sucks ^^
|
|
bassmaster - 48
Profi
(offline)
Dabei seit 10.2004
631
Beiträge
|
|
Geschrieben am: 03.01.2008 um 04:05 Uhr
|
|
Zitat von Polaris: Zitat von uwebaier:
Was genau meinst du mit fertigen Klassen? Für Datentypen usw. oder wie?
Na für dein Array "Objekts" zum Beispiel ... anstatt hier eine eigene Arrayverwaltung mühsam drumrum zu programmieren, obwohl dir noch sehr viel Hintergrundwissen zu Speicherverwaltung etc. fehlt (darf ich doch so behaupten oder?), solltest eine vorgefertigte Klasse nehmen, die dir die Speicherverwaltung abnimmt.
die C++ Standardbibliothek bietet hierfür zum Beispiel die Containerklassen
std::vector ; std::deque ; std::list
die nehmen dir für dein Array schonmal die Speicherverwaltung ab - bieten im Fall von deque und vector indizierten Zugriff, erlauben leichtes Löschen, Einfügen etc. von neuen Elementen und noch viele Dinge mehr
std::string für Zeichenketten bietet Vergleichsoperatoren und ebenfalls eine Reihe von nützlichen Funktionen um Informationen zu bekommen und zur Manipulation der Elemente
Ähnlich ist AnsiString aus der VCL, die du verwendest - einfach und intuitiv zu verwenden und du kannst dich auf die eigentliche Logik deines Programms konzentrieren anstatt dich mit Problemen von blöden C-Zeichenketten rumzuschlagen.
http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider
|
|
bassmaster - 48
Profi
(offline)
Dabei seit 10.2004
631
Beiträge
|
|
Geschrieben am: 03.01.2008 um 04:07 Uhr
|
|
Zitat von uwebaier: Du würdest warscheinlich lachen, aber ich hab iregndwie das Gefühl das Mein Lehrer mit so was heillos Überfordert wäre...
dann wundern sich die leute, wieso fertig studierte mit besten noten zum teil absolut ungeeignet sind für die freie marktwirtschaft...
http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
Geschrieben am: 03.01.2008 um 10:36 Uhr
Zuletzt editiert am: 03.01.2008 um 10:50 Uhr
|
|
Und da fällt mir doch auch schon was ein:
Wie kann ich Ansistring in String umformatieren?
mit c_str() gehts, aber da dass ja nur temprär da ist müsste ich den ganzen Spaß kopieren....
Ich bin mir ziemlich sicher, dass es da ne komfortablere Lösung gibt, ne Funktion oder so was die mir das abnimmt...
(Und ich nicht selber schreiben brauch)
UT3 Sucks ^^
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
|
Geschrieben am: 03.01.2008 um 17:55 Uhr
|
|
Eins noch:
ein letztes mal bitte ich einen Fehler zu finden
Auch bitte keine Alternativen, ich will nur verstehen warum es eben nicht funktioniert...
Hier hab ich ein (eher kleines) Programm, das ich noch ein mal poste...
Ich bitte um keine Alternativen, sondern lediglich um Fehler und Lösung (wenns geht)
Zitat:
#include <iostream>
#include <conio.h>
#include <stdio.h>
using namespace std;
//----------------------------------
class Objekt
{
private:
int index;
public:
void operator=(Objekt Copy);
void operator=(Objekt *Copy);
int getIndex() {return index;};
Objekt();
Objekt(int pIndex);
~Objekt();
};
//----------------------------------
Objekt::Objekt(int pIndex)
{
index=pIndex;
cout << "\tObjekt erstellt\n";
}
Objekt::~Objekt()
{
cout << "\tObjekt geloescht\n";
}
//----------------------------------
class Control
{
private:
int Objektcount;
Objekt *(*Objekts);
public:
Control();
~Control();
void newobjekt();
void killobjekt(int index);
};
Control::Control()
{
cout << "Kontrolle erstellt!\n";
newobjekt();
}
Control::~Control()
{
killobjekt(0);
cout << "Kontrolle geloescht";
}
void Control::newobjekt()
{
int i;
Objekt *(*Temp)=new Objekt* [Objektcount++];
for (i=0; i<(Objektcount-1); i++)
{
Temp[i]=Objekts[i];
delete (Objekts+i);
}
Objekts=Temp;
Objekts[i]=new Objekt(i);
}
void Control::killobjekt(int index)
{
}
int main()
{
Control *Test=new Control();
system("pause");
delete Test;
return 0;
}
Wär schön, ich finds ja schon mal gut das man mir Lösungen zu meinem Problem bringt, aber wär nett, wenn einer das programm ausbessern könnte...
Momentaner error liegt bei der Funktion newobjekt, die Funktion killobjekt ist vorläufig zu vernachlässigen, error ist ein std::bad_alloc...
Wär nett wenn sich einer der Sache annimmt, ich hab alles probiert aber komm so echt nich weiter...
UT3 Sucks ^^
|
|
bassmaster - 48
Profi
(offline)
Dabei seit 10.2004
631
Beiträge
|
|
Geschrieben am: 03.01.2008 um 18:01 Uhr
|
|
Zitat von uwebaier: Und da fällt mir doch auch schon was ein:
Wie kann ich Ansistring in String umformatieren?
mit c_str() gehts, aber da dass ja nur temprär da ist müsste ich den ganzen Spaß kopieren....
Ich bin mir ziemlich sicher, dass es da ne komfortablere Lösung gibt, ne Funktion oder so was die mir das abnimmt...
(Und ich nicht selber schreiben brauch)
du musst einfach schauen, dass die lebzeit den ansistrings mindestens so lange ist wie du den string brauchst.
vermutlich willst du einem control den text übergeben. da kannst du c_str() verwenden. musst aber den ansistring als membervariable der form / window klasse definieren. damit wird sichergestellt, dass deine stringklasse genauso lange den speicher reserviert, wie die fensterklasse lebt - bzw. dein control sie braucht... auf keinen fall darfst du eine stringklasse in einer memberfunktion anlegen. per c_str() einem control übergeben, denn spätestens beim verlassen der memberfunktion wird der destruktor der stringklasse aufgerufen und der speicher freigegeben. dein programm muss nicht sofort abstürzen, wird aber ziemlich sicher früher oder später abstürzen oder der inhalt ist sehr komisch...
http://www.impala64.de/blog - http://www.impala64.de/ - www.myspace.com/impala64lowrider
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
|
Geschrieben am: 03.01.2008 um 19:05 Uhr
|
|
Das Prob is kein Prob mehr, das Problem ist das, was ich den Post drüber geschrieben hab...
Das mit den Strings und Lebenszeiten hab ich schon verbessert, aber das bringt mich auch nicht weiter...
Das Problem ist, wie schon gesagt, das oben beschriebene Programm, das mit Indexen funktionieren "sollte" aber es nicht tut
UT3 Sucks ^^
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 03.01.2008 um 19:31 Uhr
|
|
Zitat von uwebaier: Das Prob is kein Prob mehr, das Problem ist das, was ich den Post drüber geschrieben hab...
Das mit den Strings und Lebenszeiten hab ich schon verbessert, aber das bringt mich auch nicht weiter...
Das Problem ist, wie schon gesagt, das oben beschriebene Programm, das mit Indexen funktionieren "sollte" aber es nicht tut
Na ja, dann lass mal n bissel Erläuterungen zu deinem Code springen, was wie funktionieren soll und erkläre mal, was genau nicht funktioniert.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
Geschrieben am: 03.01.2008 um 20:14 Uhr
Zuletzt editiert am: 03.01.2008 um 20:15 Uhr
|
|
also gut:
Ich bin nicht der beste im erklären, aber ich versuchs mal:
Ich besitze eine Klasse die über Objekte "verwaltet"
Da die Objekte keine feste Anzahl haben speichere ich die Pointer der Objekte nicht in einem festen Array wie z.B. Objekt *Objekte[4], sondern ich speichere ihre die Pointer wiederum in einem dynamischen Array ab...
heißt:
Wenn ich ein Objekt erstelle muss dem Array, dass die Pointer auf Objekte speichert um den Pointer erweitert werden, der dem neuen Objekt gehört..
Ich versuchs mal grafisch darzustellen, vielleicht wirds klarer.
der buchstabe p vor einer Variablen soll hier zeigen, dass es ein Pointer ist
Zitat:
pObjekts[0]->pObjekt->eigentliches Objekt
pObjekts[1]->pObjekt->eigentliches Objekt
und so weiter...
Ihr werdet euch fragen warum ich das so umständlich mache und nicht einfach das Ganze so aufbaue:
Zitat:
pObjekts[0]->eigentliches Objekt
pObjekts[1]->eigentliches Objekt
und so weiter...
Die Antwort darin liegt dass ich nicht unbedingt einen Operator überladen will...
Nebenbei gesehen hab ich das Problem auch schon mit Operatorenüberladung und dem zweiten Beispiel gemacht, aber das hat genauso wenig funktioniert...
Der Sinn des ganzen ist eigentlich nur dass die Objekte sich untereinander verständigen können, den Rest bekomm ich selber hin...
Das eigentliche Problem:
Laut meiner Logik sollte alles laufen, das Problem besteht jedoch in dem erstellen und löschen von Objekten...
Diese Funktionen hab ich immer gepostet, weil sie Fehlerhaft liefen und nach gewisser Anzahl an Objekten einen Pointererror oder Ähnliches hervorgerufen haben...
Ich hoffe ich hab euch das Ganze jetz hinreichend erklärt und hoffe dass ihr mir damit helfen könnt
UT3 Sucks ^^
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
Geschrieben am: 03.01.2008 um 23:43 Uhr
Zuletzt editiert am: 04.01.2008 um 00:28 Uhr
|
|
ähm - wieso sollte das nicht ohne Operatorladung machbar sein?
Edit:
Was soll eigentlich sowas?:
Zitat:
int main()
{
Control *Test=new Control();
system("pause");
delete Test;
return 0;
}
warum kein Stackobjekt? - sieht irgendwie nach nem Javaprogrammierer aus, nur, dass der den Speicher nicht wieder freigegeben hätte ...
Zitat:
int main()
{
Control Test;
system("pause");
return 0;
}
abgesehen davon halte ich "system"-Aufrufe nicht für nicht ganz ungefährlich, außerdem sind sie hochgradig plattformabhängig ...
so fände ich es deutlich schöner:
Zitat:
int main() {
Control Test;
std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get();
return 0;
}
Die drei Befehle um auf die Eingabe zu warten, kannste natürlich in ner eigenen Funktion zusammenfassen.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
Teargas - 38
Champion
(offline)
Dabei seit 06.2006
2196
Beiträge
|
|
Geschrieben am: 04.01.2008 um 00:15 Uhr
|
|
Zitat von bassmaster: Zitat von uwebaier: Du würdest warscheinlich lachen, aber ich hab iregndwie das Gefühl das Mein Lehrer mit so was heillos Überfordert wäre...
dann wundern sich die leute, wieso fertig studierte mit besten noten zum teil absolut ungeeignet sind für die freie marktwirtschaft...
weil die nicht gelernt haben, mit problemen umzugehen, die 17 jährige beim "coden" haben ...
... so daß wir eine Weile hingerissen das Leben spielen, nicht an Beifall denkend.
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
Geschrieben am: 04.01.2008 um 09:27 Uhr
Zuletzt editiert am: 04.01.2008 um 09:28 Uhr
|
|
Zitat von Polaris: ähm - wieso sollte das nicht ohne Operatorladung machbar sein?
Edit:
Was soll eigentlich sowas?:
Zitat:
int main()
{
Control *Test=new Control();
system("pause");
delete Test;
return 0;
}
warum kein Stackobjekt? - sieht irgendwie nach nem Javaprogrammierer aus, nur, dass der den Speicher nicht wieder freigegeben hätte ...
Zitat:
int main()
{
Control Test;
system("pause");
return 0;
}
abgesehen davon halte ich "system"-Aufrufe nicht für nicht ganz ungefährlich, außerdem sind sie hochgradig plattformabhängig ...
so fände ich es deutlich schöner:
Zitat:
int main() {
Control Test;
std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get();
return 0;
}
Die drei Befehle um auf die Eingabe zu warten, kannste natürlich in ner eigenen Funktion zusammenfassen.
tut mir leid, das löschen ich bei meiner Schusseligkeit vergessen, aber trotzdem...
Mir ging es mit dem Programm nur darum überhaupt die Objekte zu erstellen...
Löschen ist dann nochmal ne ganz andere Sache...
Und das mit dem system, was soll ich dazu sagen, so hab ich halt gelernt den Bildschirm kurz festzuhalten
UT3 Sucks ^^
|
|
Polaris
Experte
(offline)
Dabei seit 07.2006
1766
Beiträge
|
|
Geschrieben am: 04.01.2008 um 11:47 Uhr
|
|
Zitat von uwebaier:
Und das mit dem system, was soll ich dazu sagen, so hab ich halt gelernt den Bildschirm kurz festzuhalten
hmm deinem Lehrer sollte man echt mal was erzählen ...
system("pause"); macht dein Programm nämlich sofort plattformabhängig von Windows und könnte Usern mittels Eingaben von Shellmetazeichen die Möglichkeit eröffnen über dein Programm andere Programme aufzurufen etc.
Das hier:
Zitat:
std::cin.clear();
std::cin.ignore(std::cin.rdbuf()->in_avail());
std::cin.get();
ist Standard-C++, baut dir keine Sicherheitslücken und das Programm kannst du mit den Compilern deiner Wahl für jede Plattform compilieren und auf dieser ausführen, das Resultat wird jedes Mal, das gleiche sein.
Patriotismus ist die Tugend der Bosheit! (Oscar Wilde)
|
|
uwebaier - 36
Halbprofi
(offline)
Dabei seit 06.2005
124
Beiträge
|
|
Geschrieben am: 06.01.2008 um 12:29 Uhr
|
|
Jo, das is schon OK...
Aber das eigentliche Problem wurde halt immer noch nich so recht angesprochen...
UT3 Sucks ^^
|
|