Miért nem működik a realloc (C nyelv)?
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.
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.
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
Ha kifogással szeretne élni valamely tartalommal kapcsolatban, kérjük jelezze e-mailes elérhetőségünkön!