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
 1/22 anonim ***** válasza:
100%
Hát pedig a realloc működik, a programod az ami nem. És programkód nélkül szinte lehetetlen hogy megmondjuk neked mit hibáztál. Egy tippem van: nem vetted figyelembe hogy realloc-nál változhat az allocált memóriaterület címe és a régi címmel dolgozol. Miért nem próbálod debuggolni amúgy?
2016. márc. 13. 23:27
Hasznos számodra ez a válasz?
 2/22 A kérdező kommentje:

#include <stdio.h>

#include <stdlib.h>

#include <ctype.h>

#include <string.h>



int main()

{

int i,j=0, c,k,d,z=9,sor,oszlop;

char *temp, *buff;



double *mtx, *tmp;


FILE* ptr=fopen("test.dat", "rt");



mtx=(double*)malloc(12*sizeof(*mtx));

buff=(char*)malloc(10*sizeof(*buff));



for(;;){

c=fgetc(ptr);



if(c==' ' || c=='\n' || c=='\t'){continue;}



i=0;

if(isdigit(c) || c=='-' || c=='.')

{

buff[i]=c;

do{

d=fgetc(ptr);


i=i+1;

k=i+1;

if(d==' ' || d=='\n' || d=='\0' || d=='\t')

{if(d=='\n'){sor++;break;}else break;}

if(isdigit(d) || d=='-' || d=='.')

{buff[i]=d;

/*if(k=strlen(buff))

{

temp=realloc(buff,k*sizeof(char));

if ( temp != NULL ) {

buff=temp;}

else {

printf("Error allocating memory!\n");

return -1;}

}*/


}

}

while(d!=' ');

}


mtx[j]=atof(buff);

j++;


free(buff);

if(j>z)

{

tmp=realloc(mtx,(2*j)*sizeof(double));

if ( tmp != NULL ) {

mtx=tmp;}

else {

printf("Error allocating memory!\n");

return -1;}

z=(2*j)-3;

}

buff=(char*)malloc(sizeof(*buff));



if(c==EOF){break;}}


oszlop=(j-1)/sor;



for (i = 0; i < sor; i++)

{

for (j = 0; j < oszlop; j++)

{

printf("%lf ", mtx[oszlop * i + j]);

}

printf("\n");

}

fclose(ptr);

free(buff);

free(mtx);



}

2016. márc. 13. 23:42
 3/22 A kérdező kommentje:
Nemrég kezdtem tanulni a programozást, nem tudom még hogy kell használni a debuggert:(
2016. márc. 13. 23:44
 4/22 anonim ***** válasza:

"bizonyos okból"


Pedig ha olyan a kód, amilyen az eset leírása alapján érzésem szerint* lehet, akkor az üzleti (vagy más komoly) célra alkalmatlan...


*jobban belegondolva a megérzés fogalmát kihúznám az egyenletből, mert szerepel a kérdésben a "tömb" szó. Tömböt maximum az iskolában használunk, meg mikrokontrolleren, ahol be kell érni néhány bájt RAM-mal.


Az előttem válaszoló kolléga jól leírta a legvalószínűbb gyanúsítottakat, egyébként meg ne realloc-oljunk orrba-szájba tömböket, hanem libet használjunk (listák), vagy ha valami oknál fogva nagyon fázzujnk a 3rd party libektől, akkor implementáljunk egy tisztességes listát és használjuk azt mindenhol.


Kód nélkül nem lesz olyan egyszerű rábökni, hol a gond.

2016. márc. 13. 23:48
Hasznos számodra ez a válasz?
 5/22 anonim ***** válasza:

Látom, közben elküldted. Legközelebb ne szégyellősködj, legalább konkrét tanácsokat kaphatsz.

Nno, lássuk...

2016. márc. 13. 23:49
Hasznos számodra ez a válasz?
 6/22 anonim ***** válasza:

Nekem a fordító kapásból kidobta hogy a k változót úgy használod hogy nem adtál neki kezdőértéket, nem csoda hogy nem működik jól a következő sor:


temp=realloc(buff,k*sizeof(char));


Nincs igazán ingerem ennél jobban belemerülni.

2016. márc. 14. 00:00
Hasznos számodra ez a válasz?
 7/22 anonim ***** válasza:
Bocsánat elnéztem a dolgot, ebben a kódban keresni is nehéz olyan mintha obfuszkálva lenne.
2016. márc. 14. 00:03
Hasznos számodra ez a válasz?
 8/22 anonim ***** válasza:

Hmm... Rögtön az első szembetűnő probléma a cryptic (itt tkp. érthetetlent jelent) azonosítók használata.


"c,k,d,z,mtx,buff,tmp", mégis honnan találja ki az ember, melyik mire szolgál? Milyen adatokat tartalmaznak?

Ha el kell magyarázni (vagy oda kell kommentelni), az rossz.

A "tmp" és "temp" egyidejű használata még ennél is egy szinttel nagyobb kiszúrás. Nem csak másokkal, saját magaddal is, mert talán már egy óra elteltével sem fogod tudni, mire valók, mit takarnak.

Beszéljen a kód, és beszéljenek benne a változók is. Azért ne "matrix" legyen az "mtx"-ből, mert az nem sokat segít. Mi van benne? Az lesz a jó név.


Két realloc-ból egyébként az egyik ki van kommentezve. Gondolom, az nem akar működni. Copy-paste programoztál, ami nagyon-nagyon rossz ötlet. Így esett, hogy a doube pointerbe is sizeof(k * char)-t allokálsz.


Ha érdekel, szívesen végigmegyek rajtad a kódon, hogy hol hogyan tudnál javítani rajta és miért.


Szerdáig nem dolgozom, úgyhogy ráérek :D

2016. márc. 14. 00:04
Hasznos számodra ez a válasz?
 9/22 anonim ***** válasza:
Sorry, a k * char dolgot benéztem, az jó kell, hogy legyen, viszont a k nem lesz rendben, mert pl. nincs kezdőértéke (így bármi lehet benne).
2016. márc. 14. 00:06
Hasznos számodra ez a válasz?
 10/22 anonim ***** válasza:

Tehát még egyszer:


if(k=strlen(buff))


== az összehasonlítás, = az értékadás

A k változó itt értéket kap, szerintem nem ezt szeretnéd.

2016. márc. 14. 00:06
Hasznos számodra ez a válasz?
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!