Miért nem működik a realloc (C nyelv)?
#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);
}
"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.
Látom, közben elküldted. Legközelebb ne szégyellősködj, legalább konkrét tanácsokat kaphatsz.
Nno, lássuk...
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.
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
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.
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!