Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » Dynamisch Speicher anlegen

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
18.11.2004, 07:45 Uhr
~der ralf
Gast


Hi,
ich komme mit der dynamischen Speicherverwaltung nicht zurecht. Und zwar habe ich mir ein struct definiert:


C++:
nstruct DataMemberFilter
{
    int Member;
    CString Datatype;
    CString Telegram;
    CString FromByte;
    CString Check;
    CString Min;
    CString Max;
    CString Value;
};


und dann einen Zeiger:


C++:
nDataMemberFilter *MemberFilter;


jetzt möchte ich zur Laufzeit ein Array belibiger Größe von DataMemberFilter erzeugen. Hab es mal so versucht:



C++:
nMemberFilter = new DataMemberFilter[Number];

wobei Number ein Integerwert ist. Wenn jetzt Number = 1 ist stürzt das Programm sofort ab wenn ich auf die Attribute von DataMemberFiler zugreifen will:
MemberFilter[i].Datatype = Data.GetAt(Position+10);
i ist der Zähler einer for - Schleife.
Ist Number = 2 oder höher kann ich bei i = 1 alle Attribute füllen. Bei i=2 stürzt mir das Programm dann wieder ab wie gehabt. Könnt ihr mir helfen. Denke da ist mit der Speicherzuweisung was schief gelaufen, weiß aber nicht so recht was ich ändern kann.

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
18.11.2004, 07:58 Uhr
Tommix



'Morgen

Zitat:

C++:
nMemberFilter = new DataMemberFilter[Number];



heißt, es gibt nMemberFilter[0] ... nMemberFilter[Number-1]. nMemberFilter[Number] gibt es nicht mehr und das erklärt das von Dir beschriebene Verhalten.

Gruß, Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
18.11.2004, 08:18 Uhr
~der ralf
Gast


Ah da liegt der Fehler. Meine for - Schleife ist Schuld:



C++:
for (int i=1;i<=Number;i++)
{
.....
}



nach der Änderung:

C++:
for (int i=0;i<Number;i++)
{
.....
}


klappts auch...... Dankeschön für die schnelle Antwort....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
18.11.2004, 10:38 Uhr
(un)wissender
Niveauwart


Und denk dran, delete ist der Bruder von new, keiner kann ohne den anderen.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
18.11.2004, 10:55 Uhr
Tommix



... und delete[] der Bruder von new[].

- Tommix
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
18.11.2004, 12:40 Uhr
~der ralf
Gast


Hab dran gedacht.Was würde passieren wenn ich den Speicher nicht wieder freigebe?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
18.11.2004, 12:51 Uhr
~der ralf
Gast


Ach ja. Eine Frage dazu hab ich noch. Ich lege ja mit :

C++:
nMemberFilter = new DataMemberFilter[Number];

Speicher an. Könnte ich auch wenn ich nicht weiß wie groß Number, und somit das Array, eigentlich wird, die Länge(Number) nicht gleich festlegen sondern die Felder des Array einzeln hinzufügen wenn ich eins brauche?
Wenn ja wie muß ich das denn machen?

Gruß
der ralf
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
19.11.2004, 16:09 Uhr
~Zerocool
Gast


Hallo!

Bin zwar auch kein C++ Guru, aber ich würde sagen, dein letztes Problem lässt sich am besten mit einer verketteten Liste lösen. Dazu benötigst du noch zusätzliche Pointer für einen Typ vom selben struct. Also:



C++:

struct DataMemberFilter
{
    int Member;
    CString Datatype;
    CString Telegram;
    CString FromByte;
    CString Check;
    CString Min;
    CString Max;
    CString Value;
    struct DataMemberFilter *next; // Zeiger auf nächstes Element
    struct DataMemberFilter *prev; // Zeiger auf vorheriges Element (doppelt verkettet)
};




Wenn du jetzt einen neuen Eintrag zu den bestehenden machen willst, schreibst einfach:


C++:

next = new DataMemberFile;
prev = new DataMemberFile;




Um auf die neuen Elemente zugreifen zu können, musst halt dann die Pointer richtig zuweisen. So was wie:


C++:

prev = current;
current = next;





Übrigens, wenn du mit 'new' allokierten Speicher nicht mit delete bzw. delete[] freigibst, erzeugst Speicherlöcher, auf die nicht mehr zugegriffen werden kann. Irgendwann geht dir dann halt der Speicher aus (wenn auch bei heutigem Hauptspeicherkontigenten das bei "normalen" Programmen eh nicht passiert - ABER: das gehört nun mal zu einem guten Programmierstil)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
19.11.2004, 23:38 Uhr
Devil



Wenn du es dynamisch erweitern willst, dann kannst du das schön über
Listen realisieren, allerdings haben diese i.d.R. keinen op[].
Wenn du also keinen op[] benötigst, dann kannst du zum Beispiel
std::list<DatenTyp> verwenden, und über std::list<DatenTyp>::iterator darauf
zugreifen.
Wenn du doch einen op[] brauchst bietet sich ein vector an, wobei du
wissen musst, das vector für jedes neue Element den Rest kopiert,
es sei denn, du sagst ihm, das er für n elemente vorallokieren soll.

Devil
--
Intelligenz ist eine Illusion des Menschen
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
20.11.2004, 10:43 Uhr
FloSoft
Medialer Over-Flow
(Administrator)



Zitat von ~Zerocool:


C++:
next = new DataMemberFile;
prev = new DataMemberFile;




Sorry, aber das ist schwachsinn

wenn dann:


C++:
current->next = new DataMemberFile;
next->prev = current;
current = next;



wobei current ein pointer auf das aktuelle Item ist.
dann kann man in der liste mit


C++:
while(current->next)
{
  current = current->next;
}



vorwärts, mit


C++:
while(current->prev)
{
  current = current->prev;
}



rückwärts "scrollen"
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ VC++ / MFC ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: