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
 21/22 anonim ***** válasza:

Bontsd le részfeladatokra (függvényekre), fogalmakra (típusok) és "szereplőkre" (modulok, OOP esetén osztályok), hogy könnyebben kezelhető legyen mind a probléma, mind a megoldására szolgáló kód.


Bár a C procedurális nyelv, érdemes legalább részben "objektumokban" (szereplők, fogalmak) gondolkodni puszta algoritmusok helyett.

Fogalomra példa a mátrix, szereplőre pedig a mátrixot kezelő függvények gyűjteménye (plusz ami ehhez szükséges). Egy másik szereplő például a szöveg fájlból történő beolvasásáért felelős.

Ha így teszel, a kódod moduláris lesz, az egyes részfeladatok jól elkülönülnek, és így sok galibától óvhatod meg magad.


Törekedj arra is, hogy egy függvényed blokkja (a { és } közti rész), a main-t is beleértve, lehetőleg ne legyen hosszabb 10-20 sornál, így bármit is vizsgálsz, a teljes műveletsor ott lesz közvetlenül a látómeződben. Könnyebb megérteni, nehezebb fejlesztéskor/módosításkor hibázni. Minél rövidebb, annál jobb.

Nálam most épp nyitva van egy forráskód, a leghosszabb függvény 7 soros.

Ha egy függvény 10-20 sornál hosszabb, akkor 100%, hogy a benne található lépéseket szét tudod csoportosítani több "alárendelt" függvénybe.


A main-be például elég ennyi:


int main(int argc, char **argv) {

˙˙˙˙Matrix *matrix = getMatrixFromFile('test.dat');

˙˙˙˙printMatrix(matrix);

˙˙˙˙return 0;

};


a getMatrixFromFile-ba pedig ennyi:


Matrix *getMatrixFromFile(char *path) {

˙˙˙˙char *source = readTextFile(path);

˙˙˙˙return parseMatrix(source);

};


stb.


Remélem, látszik, mire gondolok.

Lényeges, hogy pl. a függvény elolvasásakor a szükséges mértékben tudod, látod, mi történik, de nem vagy túlterhelve feleslegesen a részletekkel.


A bemásolt kódod esetében például egy egész sor (nem igazán időszerű) deklaráción, fájlmegnyitáson és egyéb dolgokon, műveleteken végig kellett az embernek rágnia magát, hogy rábukkanjon a problémára, mert minden egyben volt, a main-ben, ömlesztve. Önmagában már csak az, ha jól el tudod különíteni a részfeladatokat, nagyon sokat segít az átláthatóságon. A lebontásra kiválóan ösztönöz, ha mintegy megtiltod magadnak, hogy egy függvényed hosszabb legyen 20 (10) sornál.


A fontos fogalmakhoz illik saját típust definiálni, szintén elsősorban a jó érthetőség végett.

A mátrixunk legyen mondjuk tetszőleges méretű (X, Y).

Valahogy így lehetne definiálni:


typedef struct __Matrix {

˙˙˙˙int width, height;

˙˙˙˙double **data;

} Matrix;


Egy mátrix szöveges fájlból történő beolvasása és kiírása lebontható olyan egységekre, mint a fájlkezelés, a fájlból beolvasott szöveg mátrixszá alakítása, maga a mátrixkezelés (jelen esetben igazából létrehozod, beleírsz egy számot egy bizonyos helyre, kiolvasol egy számot egy bizonyos helyről, illetve dolgod végeztével megsemmisíted), és a mátrix formázott kiírása.

Vigyázz, ezek nem egy az egyben függvények, hanem a program részegységei, amelyek több függvényt is tartalmazhatnak; a mátrixkezelés esetében látható négy darab függvényt (meg ezek alfüggvényeit, stb).


Fontos, hogy minden szereplőnek meghatározott szerepe legyen és ne foglalkozzon más szereplők dolgával. Például a szöveges fájlt kezelő egységed függvényeinél ne legyen nyoma annak, hogy az adat mátrixba lesz. Itt csak annyi a dolog, hogy fel legyen nyalva a lemezről a string (így pl. az input buffert nem kell és nem is szabad együtt kezelni a később a mátrixadatokat konkrétan tároló bufferrel).


Hogy hogyan tudod ezeket elkülöníteni (ha esetleg nem tiszta), azt ide hosszú lenne kifejteni, itt tényleg nem tudok belemenni a részletekbe, de ha bármi nem tiszta, akkor privátban nagyon szívesen segítek eligazodni.


Ilyen és ehhez hasonló megoldások alkalmazásával a programod távolról nézve ugyan bonyolultabbnak tűnhet, közelebbről megvizsgálva azonban szögegyszerű, és a feladat megoldásában egyértelmű módon együttműködő részegységekből fog állni.


Kissé hülye hasonlattal élve, az otthonodban sincs a berendezés random elhajigálva, hanem a fürdőszobában vannak az odavaló dolgok, a konyhában azok, amiknek a konyhában van a helye, stb., és bár a falak látszólag bonyolítanak a lakáson, valójában csak egyértelműbbé, jobbá teszik az elrendezést, így ott találod a dolgokat, ahol lenniük kell, és alvás közben sem fog senki vizelni melletted.

2016. márc. 14. 23:19
Hasznos számodra ez a válasz?
 22/22 A kérdező kommentje:

köszönöm mindenkinek, ment a zöld!

ezt a temp= ... dolgot egy fórumba láttam, ezt elhagytam

átírtam buff=realloc(buff,.. stb és így jó lett minden, legalábbis amit szerettem volna.

2016. márc. 15. 00:33
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!