Kezdőoldal » Számítástechnika » Programozás » Miért nem működik a realloc...

Miért nem működik a realloc (C nyelv)?

Figyelt kérdés
A programban van egy buffer és egy másik tömb, amibe a buffer ürül. Mind a kettős dinamikus tömb. Külön-külön mindegyiknél működik a reallocolás, de ha egyszerre van bennt mindkettő nem történik semmi, a program lefut és csak feketeség van a terminálba. Tehát ha az egyiknél realloclok és a másiknál nem lépem túl a mallocolt méretet jól fut a kettő egyszerre nem. miért lehet ez? előre is köszönöm!(nem véletlenül nem írtam le ide a kódot, bizonyos okból, remélem anélkül is tudtok segíteni, ha valami tipushibáról van szó
2016. márc. 13. 22:58
1 2 3
 11/22 anonim ***** válasza:
Hmm... Látom, a többi kolléga is megküzd vele és nekem sem esett le rögtön, hogy k=9. Biztos jó az a 9?
2016. márc. 14. 00:10
Hasznos számodra ez a válasz?
 12/22 anonim ***** válasza:

Demó pufferelt beolvasásra:

[link]

2016. márc. 14. 00:10
Hasznos számodra ez a válasz?
 13/22 anonim ***** válasza:

Megizzadtam, de ha jól értem, akkor egy szöveges fájlban tárolt double mátrixot szeretnél beolvasni, ahol egy érték maximum 10 ASCII karakteren van reprezentálva.

Így van?

2016. márc. 14. 00:25
Hasznos számodra ez a válasz?
 14/22 anonim ***** válasza:
0%

X86, MMU-val védett rendszerekben allokálni csak egész rendszerlapméret N számú többszörösét szabad dinamikusan, nem pedig összevissza mindenféle egzotikus bájtmennyiséget, mert a futó rendszereden fogalmad sincs, mi történik a töredéklappal, vagy egyáltalán a foglalás sikerességéről.


így kérheted le a rendszered lapméretét:

size_t page_size = sysconf(_SC_PAGESIZE);


[link]


(általában 4 kilóbájt, de inkább a külső library-val kérdezd le, mert más gépeknél más lehet)


Azt, hogy te hogyan struktúrálod belül az allokált heapet, az már a te programozói problémád lesz.

2016. márc. 14. 08:35
Hasznos számodra ez a válasz?
 15/22 anonim ***** válasza:

#14 Tudnál linkelni valamilyen oldalt hogy honnan vetted ezt? Valahogy a hitelességét ennek erősen kétlem. Az oprendszer számára tökmindegy hogy a virtuális memóriában hány bájtot tesz írhatóvá.


Ahogy azt az általa linkelt oldalon is leírták, semmi sem garantálja hogy a malloc laphatártól lphatárig foglal majd ha egész lapméretet adsz meg, sőt semmi sem garantálja hogy annyit foglal le amennyit megadsz. Biztosan többet fog mert általában lefoglalás információit a pointer előtti területre írja, pl. hogy a free-nek mennyit kell felszabadítani. Az allocálás optimalizálását hagyd az oprendszerre.

2016. márc. 14. 10:23
Hasznos számodra ez a válasz?
 16/22 anonim ***** válasza:

"Az allocálás optimalizálását hagyd az oprendszerre."


Bizonyos utolsó mondatok egyike.


Ha valaki nem tud dinamikus memóriahasználatot optimálisan design-olni, annak akkor inkább még mindig jobb a statikus térben foglalni, mintsem kicsinálja a lehetséges vevő informatikai rendszerét, és ezzel akár milliárd dolláros kárt okozva neki. Jobb esetben maga a rendszer fog stderr-re kiküldeni misztikus Killed. üzeneteket szálankként, amik nem azonnal debugoláskor derülnek ki, hanem csak a sokadik, ezres nagyságrendű kódhívás után.


Az oprendszer nem azért van, hogy te ne is foglalkozz bizonyos alapvető runtime dolgokkal, hanem csak megkönnyíti a design dolgaidat azzal, hogy alapvető rendszerhívásokat előre csomagol neked.


A buffer méretezés meg pontosan olyan feladat, amit nem lehet csak úgy hasracsapva ledesignolni, mint egy sorbarendezést. A kódnak a 160-adik órádban is, az egymilliárdodik hívásnál is működnie kell, nemcsak az első 4 hívásnál, amit türelmesen ki tudsz debugolni munkaidőben.


Ha nem akarsz ilyen fragmentáció-debug dolgokkal foglalkozni, akkor tudsz használni erre a célra kifejlesztett library-kat. IPC-hez például NanoMSG.


Ha valaki ezt nem érti meg, akkor sürgősen hagyja abba a C/C++ nyelvek tanulmányozását, és váltson át mondjuk JAVA-ra (itt úgy fragmentálod a ramodat, ahogy neked éppen jólesik).

2016. márc. 14. 12:56
Hasznos számodra ez a válasz?
 17/22 anonim ***** válasza:

Te elolvastad amit írtam? Nekem úgy tűnik hogy nem igazán érted a program, O/S és a hardver kapcsolatát és hasráütésszerűen irkálsz valamit, de semmivel sem tudod alátámasztani azt. Meg sem próbálod alátámasztani amit írsz. Most cáfoltam meg miért nem szabad 4K memóriát lefoglalni: mert az nem 4K memóriát fog lefoglalni és még csak nem is úgy ahogy azt te akarod. A programnak csak a virtuális memória fölött van valamilyen szintű befolyása, a fizikai memória fölött nincs, és jó esetben amit a mallocal lefoglalsz már le van foglalva fizikailag is és a fizikai helyét az oprendszer úgy helyezi el hogy az ne töredezze a memóriát. Azaz egy már lefoglalt lapon belül, aminek a teljes kapacitását még nem használtuk ki. De még egyszer mondom, e fölött nincs befolyásod, és ha sokkal többet foglalsz le mint amennyire szükséged van legfeljebb lassítod a program futását. Ha nem érted hogy miről szól a virtuális memória akkor olvass utána:

[link]


A föntiek megértésének hiányában nem is értheted mit csinál a NanoMSG. Úgy tűnik nem is érted ha felhoztad témaként.


Tényeket írj ne valami "ha nem tudod optimalizálni a memóriát inkább használj JAVA-t minthogy dollármilliós károkat okozz"-féle wtf mondatokat. :)

2016. márc. 14. 13:44
Hasznos számodra ez a válasz?
 18/22 anonim ***** válasza:
Az utolsó mondatot kicsit eltúloztam de tényleg olvass utána mielőtt válaszolsz és ha találsz valami ellenem szólót akkor inkább linkeld azt be mert tényleg nem értem mire föl mondod azt amit írsz.
2016. márc. 14. 13:47
Hasznos számodra ez a válasz?
 19/22 A kérdező kommentje:

igen, mátrixot szeretnék beolvasni, úgy hogy a buffer és a mátrix is dinamikus. ugye mallocoltam a buffernek és a mátrixnak is valamennyit. ezután ha csak az egyiknek reallocolok (tehát az input pl a buffernél lehet nagyobb mint a mallocolt, a mátrix elemszáma pedig kevesebb mint a mallocolt hely, vagy fordítva) akkor működik, csak egyszerre kettő nem.

a k==strlen(buff)-os részt már kijavítottam,de úgy sem volt jó, aztán átírtam a buff reallocolását is úgy mint a mátrixét csak más változókkal nyílván, de nem volt jó egyszerre a kettő.b

2016. márc. 14. 16:02
 20/22 A kérdező kommentje:

és feltűnt még egy furcsaság:

elhagytam a buff realloccolást és továbbmentem.

meg akartam nyitni még egy file-ból miután ezzel készen volt, de erre is az történik, hogy lefut de semmi. A "működő" program végére, ha ennyi van írva plusszba:

FILE* ptr2=fopen("abc.dat","rt");

fclose(ptr2);

2016. márc. 14. 16:21
1 2 3

Kapcsolódó kérdések:




Minden jog fenntartva © 2024, www.gyakorikerdesek.hu
GYIK | Szabályzat | Jogi nyilatkozat | Adatvédelem | Cookie beállítások | WebMinute Kft. | Facebook | Kapcsolat: info(kukac)gyakorikerdesek.hu

A weboldalon megjelenő anyagok nem minősülnek szerkesztői tartalomnak, előzetes ellenőrzésen nem esnek át, az üzemeltető véleményét nem tükrözik.
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!