Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » VC++ / MFC » probleme beim speicher allokieren

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 <
000
02.12.2003, 21:00 Uhr
~vincentve
Gast


Hallo zusammen!

Ich versuche Speicher zu allokieren um eine Matrix zu benutzen deren Größe erst zur Laufzeit feststeht. Ich benutze malloc().
Das funktioniert alles wunderbar bis beim x-sten mal komische Effekte auftreten. U.a. ist der entstehende Pointer NULL, was wohl darauf hindeutet dass nicht genügend Speicherplatz zur Verfügung steht. Das kann eigentlich nciht sein. Ich verwende höchtens 4kB (dynamisch allkoierten Speicher), da kann doch noch keiner an Grenzen stoßen. Aber vielleicht begrenzt das Visual Studio den zur Verfügungn stehenden Speicher. Weiß da einer was zu? Oder sonstige Tips?

Vielen Dank

Dirk
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
02.12.2003, 21:04 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


zeig mal den code
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
02.12.2003, 21:34 Uhr
~vincentve
Gast



C++:
float **productionCost;
    productionCost=(float **)malloc(items*sizeof(float *));
    productionCost[0]=(float *)malloc(items*periods*sizeof(float));
    for (i=1; i<items; i++)
    {
        productionCost[i]=productionCost[i-1]+periods*sizeof(float);
    }
    for (i=0; i<items; i++)
    {
        for (j=0; j<periods; j++)
        {
            productionCost[i][j]=0;
        }
    }




Bearbeitung von Pablo:

[ cpp ] tags gesetzt


Dieser Post wurde am 02.12.2003 um 23:20 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
02.12.2003, 21:36 Uhr
~vincentve
Gast


wird noch besser:

ab einer gewissen stelle im prog, nachdem ich schon n paar mal erfolgreiche allokiert habe (aber wie gesagt: <4 kB) funktionieren die ersten zwei zeilen nicht, die letze aber schon):

inventory[0]=(float *)malloc(800);
inventory[0]=(float *)malloc(900);
inventory[0]=(float *)malloc(1000);


und ich kriege ne access violation exception.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
02.12.2003, 22:47 Uhr
~vincentve
Gast


ok, hab jetzt statt variabel immer in der größe 4096 angelegt. das klappt.
da das nur ein testdummy ist, brauch ich da auch nix elegantes.
allerdings rufe ich ein upro auf (das ich testen will) und da sollten genau diese sachen funktionieren.
aber auch hier klappt weder obiges bsp nocht sowas:

this->carryOverOfActualSolution=new long[200];

this->carryOverOfActualSolution=new long[1024]; (entspricht größe 4096) funktioniert hingegen.
also allmählich werde ich doch nervös. kann das sein, dass man man nur noch in bestimmten größen-intervallen allkoieren kann, wenn man schon bestimmte speichermengen allkoiert hat?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
02.12.2003, 23:18 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


hm warum nimmst du den einen doppelpointer wenn du am ende doch nur eindimensionales array draus machst?


C++:
float **productionCost;
productionCost=(float **)malloc(items*sizeof(float *)); //hier allokierst du ein floatpointer array der grösse items
productionCost[0]=(float *)malloc(items*periods*sizeof(float)); //hier allokierst du für den ersten pointer des floatpointerarrays speicher der grösse items mal periods für floats also wohl er das was du nicht gewollt hast

//ab hier wird es dann ganz fatal   du lässt den doppelpointer productionCost auf einen anderen pointer des arrays zeigen für den du noch gar kein speicher allokiert hast. Aussedem kannst du dann nachher den allokierten speicher nur schwer wieder freigeben
for (i=1; i<items; i++){
        productionCost=productionCost[i-1]+periods*sizeof(float);
}
    for (i=0; i<items; i++)
    {
        for (j=0; j<periods; j++)
        {
            productionCost[j]=0;
        }
    }




Ich vermute mal das du sowas machen wolltest
Du hast produktionskosten für verschiedene artikel und perioden (vermute ich jetzt mal


C++:
//speicher für ein 2d array der grösse items mal periods allokieren
float **productionCost;
productionCost=(float **)malloc(items*sizeof(float *));
for(i=0;i<items;++i) productionCost[i]=(float *)malloc(periods*sizeof(float));

//alle werte 0 setzen könnte man auch mit memset machen
for (i=0; i<items; i++)
for (j=0; j<periods; j++)
     productionCost[i][j]=0; //produktionskosten des i'ten items der j'ten periode auf Null

//damit arbeiten


//am ende  speicher wieder freigeben
for(i=0;i<items;++i) free(productionCost[i]);
free(productionCost);



Schau dir mal hierzu an was beefy in diesem Thread dazu geschrieben hat ist völlig analog
Machs dann am besten auch so wie beefy das du dir eine funktion zum allokieren des speichers und eine zum freigeben schreibst aber versuch erstmal zu verstehen wie genau malloc funktioniert...

das hier was du vorhin versucht hast würde auch gehen das ist quasi ein 1d-array das ein 2darray darstellt

C++:
productionCost[0]=(float *)malloc(items*periods*sizeof(float));  





C++:
float *productionCost;
productionCost=(float *)malloc(items*periods*sizeof(float));  //wenn du hier dann auf die einzelnen felder zugreifen willst müsstest du dann mit indices "trixen";

//angenommen k ist der index für die items und j der für die perioden dann könntest du auf dein k'tes item der j'ten periode zugreifen indem du k+j*items verwendest. IN diesem fall würde immer ein produkt mit den costen seiner zugehörigen perioden hintereinander im speicher liegen danach kommt dann das nächste produkt. Man könnte das natürlich auch umgekehrt machen das immer erst alle kosten der produkte der periode Null hintereinander im speicher liegen, dann der periode 1 usw.

free(productionCost); //speicher am ende wieder freigeben



--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.12.2003 um 23:25 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
02.12.2003, 23:23 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



C++:
inventory[0]=(float *)malloc(800);
inventory[0]=(float *)malloc(900);
inventory[0]=(float *)malloc(1000);



das ist ganz fatal. du weisst dem pointer inventory[0] ständig neuen speicher zu und der alte hängt dann irgendwo verloren rum und belastet dein os. Mach sowas blos nicht. du musst vorher den speicher wieder mit free freigeben oder zumindest einem anderen pointer übergeben damit du ihn dann ggf. später freigeben kannst
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
02.12.2003, 23:34 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)



Zitat:

ok, hab jetzt statt variabel immer in der größe 4096 angelegt. das klappt.
da das nur ein testdummy ist, brauch ich da auch nix elegantes.
allerdings rufe ich ein upro auf (das ich testen will) und da sollten genau diese sachen funktionieren.
aber auch hier klappt weder obiges bsp nocht sowas:

this->carryOverOfActualSolution=new long[200];

this->carryOverOfActualSolution=new long[1024]; (entspricht größe 4096) funktioniert hingegen.
also allmählich werde ich doch nervös. kann das sein, dass man man nur noch in bestimmten größen-intervallen allkoieren kann, wenn man schon bestimmte speichermengen allkoiert hat?



irgendwie schmeisst du jetzt alles durcheinander jetzt benutzt du auf einmal new und nicht malloc. Mach das blos nie und mische malloc und new das bringt dich wenn du pech hast in teufels küche
Wenn du die möglichkeit hast und c++ benutzen willst nimm new (bzw. delete) zum speichermanagement.

in deinem konkreten fall geht das mit new dann so

C++:
float **productionCost;
productionCost=new float*[items];
for (i=0; i<items; i++)
productionCost[i]=new float[periods];

//speicher wieder freigeben
for (i=0; i<items; i++)
delete [] productionCost[i];
delete [] productionCost;


um beefys bemerkung vorzugreifen. Wenn du gepeilt hast wie es geht und du ein bisschen mit klassen umgehen kannst schreib dir ne klasse die das automatisch macht. ALso das speicher allokieren im konsturktor und das freigeben in destruktor
--
...fleißig wie zwei Weißbrote

Dieser Post wurde am 02.12.2003 um 23:35 Uhr von Windalf editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
03.12.2003, 08:50 Uhr
vincentve



danke soweit.
aber zumindest bei malloc weiß ich wies funktioniert (schließt natürlich immer noch keinen fehler aus).
mein konstrukt macht (behaupte ich jetzt mal):
zunächst wird ein array von pointern angelegt. diese pointer werden nachher auf die zeilen der matrix verweisen. dann wird der platz für die matrix allokiert.(der platz beginnt logischerweise da wo die erste zeile anfängt).
dann wird der pointer für die n+1. zeile auf den pointer für die n. plus ein displacement gesetzt.

zu "new" und "malloc": ich weiß dass ich das was vermische.das malloc nutze ich in meinen testtreiber. das eigentl proggi is n upro und wird nachher von beliebigen progs aufgerufen. der testtreiber sollte weder schön noch effizient sein, er sollte halt nur möglichst einfach funktionieren.

und dass inventory[0] ständig neuen speicher bekommt, der alte aber nicht freigegeben wird: das war nur ein testen weiviel speicher ich kriege und wieviel nicht. die zelen stehen nachher natürlich nicht so im prog.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ 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: