A kérdésre adott válasz szám 67208

Az a kérdés, memórialefoglalás dinamikus tömbök.

A következő memória kiosztás dinamikus tömböt:

írja TArrayOfDouble = array kettős;
var ArrayRunEvolutionFits: tömb TArrayOfDouble;






...
SetLength (ArrayRunEvolutionFits, NRun);

Debugger Eception Notification
Project ProjectPDB.exe emelt kivétel osztály EAccessViolation üzenettel „Hozzáférés megsértése címen 00405F13 modulban” Project.exe”. Olvassa cím 00000003”. A folyamat megállt. Használja lépés futtatása a folytatáshoz.

A projekt összeállítása és a program fut, amíg meg nem találtuk a teljesítménye a fent említett vonalon. Eljárások nem társított egy adott tömb is még mindig működik.

A hiba után kezdtek jelentkezni a következő, új dinamikus tömb (egyéb), amelyek maguk működnek. Ha eltávolítjuk, a hiba többé nem fordulhat elő.

A program van írva a Delphi 7 környezetben, és célja kutatási célokra a tanulmányok területén a szerkezet a fehérje molekulák. A tervezet a sorrendben 20 egység, a rendszer csak szabványos alkatrészek a renderelés és OpenGL molukul. Mivel a pre-felbontású adatsorok nem ismertek, akkor használja a dinamikus tömböket. Sami tömböket térfogata nem haladja meg a 50 000 típusú kettős.

Egy bizonyos ponton a hasonló hiba már bekövetkezett, akkor Project Options \ Linker Max stackzize emelkedés $ 01000000 megoldotta a problémát.

Lehetséges, hogy megoldja ezt a problémát most? Lehet, hogy van egy hiba a memória kiosztás; Lehet, hogy vannak eszközök segítségével nyomon követheti a memória kiosztás?

Egy másik lehetőség, ami azt hiszem, hogy részben pótolja tömbök TList típusú szerkezetek. azzal a céllal, hogy enyhíti a verem. De hogy lesz-e megoldás?

Követ akármi válasz erre a kérdésre via RSS

Dmitrij Shatalov
Hiba oka - banális túlmutató hegység, amely felmerül
a helytelen összehasonlítása a valós számok.

Ha tesz egy számlálót minden egyes ciklusban látni fogja, hogy
- Az első ciklusban Ön csak a „szerencsés” - vannak 4000 e-ing és 4000 hívásokat a tömbben.
Ez azért van, mert abban az állapotban, míg zd<=40 do begin равенство zd=40 не отрабатывается.
- A második ciklusban „jártál” - van hozzá egy másik 1000 E-nek és
majd 1001-ben fordul a tömbben. Ez azért van, mert abban az állapotban, míg zd<=50 do begin
egyenlőség teljesül ZD = 50, és ennek következtében fordul per
kezelése több => kimeneti tömbben.

Továbbá, ha lehet állítani, hogy hány e-ing tömb jobb
csinálni azonnal.

Jó napot kívánok. A kérdés természetesen az, a régi, de én ugyanaz voznakla meghatározatlan hiba. Ahol nem lehet - nem világos. A program egy dinamikus tömb:

eljárás createpart;
const da_len = 12;
var
profZall: tömb tömb kettős;
H: kettős; // növeljük a hosszanti koordináta
Vr, Vrmin: kettős; // Kontúr és csökkentett kontúr vágási sebesség
j_int: Longword; // növeljük a tömb kitölteni
zd, XD: kettős; // aktuális pozíció adatai

eljárás addpoint (Z, X, v: dupla); // töltse szélsőséges elem a tömb
var i: longword;
kezdődik
profZall [0, j_int]: = 0; // töltse az időt, amíg a nulla értékeket
profZall [1, j_int]: = Z;
profZall [2, j_int]: = X;
profZall [3, j_int]: = V;
i: = 4 (da_len- 1) do profZall [i, j_int]: = 0; // nulla értékeket töltse ki a többi
Inc (j_int);
végén;

j_int: = 0;
ZD: = 0;
// setlength (profZall, da_len, 500,000);

// vízszintes egyenes szakasz 40 mm






setlength (profZall, da_len, kerek (40 / h)); // száma e-mail, az azonos 4000
míg zd<= 40 do begin
XD: = 50;
addpoint (zd, xd, vr);
ZD: = ZD + H;
végén;

// része egy negyed kör - megy a sugár mentén
setlength (profZall, da_len, j_int + kerek (50 / h- 40 / h)); // száma e-mail, az azonos 5000
míg zd<= 50 do begin
XD: = 60 -roundto (sqrt (sqr (10) -sqr (zd- 40)) - 6);
addpoint (zd, xd, Vrmin);
ZD: = ZD + H;
végén;

// részén nyolc kör - az átmenet a sugár
setlength (profZall, da_len, j_int- 1 + kör (130 / h- 50 / h)); // ezután egyenlő 13,000, de eksepshn

j_int: = j_int; // + hibakeresés
végén;

Ami érdekes, hogy ha pokoldovat és hozzá különböző számítástechnikai szemét, mindenki jól működik. Mégis, a feladat minden bizonnyal nagyszámú elem (50000) lenyelése, de még mindig ott van eksepshn ugyanazon a helyen.
Egy másik nagyon érdekes viselkedést kódot, ha az eljárás tolóerő egy konzol alkalmazás. Olyan, mint hozzárendelése tekercs, de kimarad a vonal j_int: = j_int; és legyek eksepshn InvalidFloatingPointer működését. Hozzárendelése egy sor nulla nem segít. Általában bármely hibák.
Igen, a fejlesztési környezet D7

Az eredmény egy olyan megoldás. váratlanul, a probléma megoldódott (véglegesen vagy csak egyelőre) felhívja SetLength permutációs funkciók:

A forrás lefoglalt memória dinamikus tömbök 3:
.
SetLength (ArrayRunEvolution, NRun);
SetLength (ArrayRunEvolutionFits, NRun);
SetLength (ArrayRunEvolutionBestFits, NRun);
.
EAccessViolation hiba történt, a második sor ArrayRunEvolutionFits. Ennek során a probléma megoldásának kód megváltozott több helyen adott tanácsot a 777 Low (), Nagy (). De a fejlődés mindig hiba a programban történt ugyanazon a helyen.

Egyébként az ötlet, hogy változtatni a sorrendjét memóriafoglalási. Hiba eltűnt, amikor az első két sor került átrendeződött.

Rendezzük át a sorokat az eredeti helyzetbe, hogy EAccessViolation nem vezet!

Sajnos, most már nem marad változata a projekt, hogy nem. EAccessViolation visszatér sikertelen. Azt reméljük, hogy a hiba a hiba a Delphi fordító, hanem a nem megfelelő használata a dinamikus adatokat.

MBO. nézd meg a kódot:

A IRÚN: = 1-től nRun nem kezdődik
...
ReadRunEvolution (ArrayRunEvolution [Irun-1]);
...
végén;

1. Itt megtalálja az összes helyes.
2. A program nem terjed ki a végrehajtását ebben a sorban, míg hibát jelez
3. Az opció „Range ellenőrzése” be van kapcsolva, és hiba lenne, ha ez egy tévedés összeállításában
4. előtt ezen a helyen (hibák után kezdtek jelentkezni a következő, új dinamikus tömböket. A eltávolításuk hiba megszűnik fordul elő).
5. nagyon hasonlítanak az említett Anton memória Zaparyvaniya. De hogyan elkapni? Debug akarják használni, hogy azonosítsa a hiba forrását

> A Irún: = 1 nRun
Ez az, ahol a kutya matatott.
Dinamikus tömbök vannak számlálva a nullától.

Úgy vélem, hogy ezeken a helyeken több program.
És mi a helyzet az alacsony Nagytanács nagyon a helyén.

Köszönöm mindenkinek a válaszokat.

Anton. kösz a tisztázása Zaparyvaniya memóriát. Nagyon hasonlít ez a hiba, és valószínűleg zaparyvanie nem társított tömb, amely úgy tűnik, a hozzáférés megsértését. Ismét egy hasonló helyzetben már találkozott, de a hiba forrását, sajnos, még nem állapították meg. Az első esetben a meghosszabbított verem, és ez segített, de a második optimalizált kód, törölje a nem kívánt dinamikus struktúra és a program teljes mértékben kiérdemelte. Ezután a benyomást kelti, hogy nem elég verem.

Matvey. Köszönöm a linket acedutils és emlékeztető Knut.

Mbo. Itt vannak a részletek kód:

írja TArrayOfDouble = array kettős;
var ArrayRunEvolutionFits: tömb TArrayOfDouble;
...
SetLength (ArrayRunEvolutionFits, NRun);
...
A IRÚN: = 1-től nRun nem kezdődik
...
ReadRunEvolution (ArrayRunEvolution [Irun-1]);
...
végén;

// függvény, ahol ReadRunEvolution difinirana mint

funkció ReadRunEvolution (var Ezekhez: TArrayOfDouble);

// és az ő memóriát a második szintre.

A hiba valószínűleg korábban, és úgy tűnik, csak a sorban. Megjegyzem még egyszer, hogy ha a program nem használja ezt a funkciót, egyéb műveletek elvégzésére, akkor működik, a hiba nem fordul elő.

Zaparyvanie memória - ez az, amikor egy bizonyos területen a memória, hogy valami van írva, hogy megkerülje az eljárásokat, hogy vydeleli és viseli a felelősséget. Ennek eredményeképpen az adatok konzisztenciája hrangyaschihsya törve, ami oda vezethet, hogy a különböző hibák további műveletek a memóriát.

Egy másik lehetőség, ami azt hiszem, hogy részben pótolja tömbök TList típusú szerkezetek érdekében, hogy kirak a köteget. De hogy lesz-e megoldás?
Amikor a dimenzió 50.000 elemek fastruktúrák, hogy nagyon hatékony. Algoritmusok, okait és matematikai számítások az elméleti sebesség adott Knuth a 6. fejezetben a harmadik kötet. Tehát, a kezdők, akkor nézd meg acedutils.

ype TArrayOfDouble = array kettős;
var ArrayRunEvolutionFits: tömb TArrayOfDouble;
...
SetLength (ArrayRunEvolutionFits, NRun);

Láthatjuk, hogy peremennaya- kétdimenziós tömböt, és SetLength tenni csak az első mérést.
Ne a memóriát tömbök magukat elfelejtette a második szint?




Kapcsolódó cikkek