Realloc pola - C

Programovacie jazyky, rady, poradňa...
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Realloc pola - C

Príspevok od používateľa marek788 »

Ahojte, potrebujem pomoc z realokovanim pola, na zaciatku programu si alokujem pole takto

Kód: Vybrať všetko

 pole=(double *)malloc(sizeof(double)*n);
premenna n=10.
Potom mam while na nacitavanie vstupov a vo while mam podmienku

Kód: Vybrať všetko

    if(n==pocet){
        n=2*n;
    pole=(double *)realloc(pole, (sizeof(double)*n));
v premenej pocet je pocet cyklov kolko prebehlo. ked zadam viac ako 10 prvkov vypise mi nieco taketo

Kód: Vybrať všetko

a.out: malloc.c:2369: sysmalloc: Assertion `(old_top == (((mbinptr) (((char *) &((av)->bins[((1) - 1) * 2])) - __builtin_offsetof (struct malloc_chunk, fd)))) && old_size == 0) || ((unsigned long) (old_size) >= (unsigned long)((((__builtin_offsetof (struct malloc_chunk, fd_nextsize))+((2 * (sizeof(size_t))) - 1)) & ~((2 * (sizeof(size_t))) - 1))) && ((old_top)->size & 0x1) && ((unsigned long)old_end & pagemask) == 0)' failed.
Aborted (core dumped)
Neviete mi niekto poradit? Dakujem.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Realloc pola - C

Príspevok od používateľa BX »

Ukáž celý ten cyklus aj s tým, kde nastavuješ a inkrementuješ premennú pocet
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Realloc pola - C

Príspevok od používateľa marek788 »

while (scanf("%d", &x) == 1){
pocet = pocet +1;

if(n==pocet){
n=2*n;
pole=(double *)realloc(pole, (sizeof(double)*n));
}
pole[pocet-1]=x;
}
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Realloc pola - C

Príspevok od používateľa BX »

A pole alokuješ ako? Toto vyzerá správne, takžep osledná možnosť je, že nealokuješ pole.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Realloc pola - C

Príspevok od používateľa marek788 »

pred whileom alokujem pole takto
pole=(double *)malloc(sizeof(double)*10);

ked naalokujem napr 10 000 tak to vsetko funguje, ale akonahle tam dam nizsie cislo, kde potrebujem nasledne realok, tak uz to nefunguje.
BX
Addict
Addict
Používateľov profilový obrázok
Príspevky: 4572
Registrovaný: 10 jan 2008, 15:30

Re: Realloc pola - C

Príspevok od používateľa BX »

Kód: Vybrať všetko

#include <stdio.h>
#include <stdlib.h>

int main( int argc, const char * argv[] )
{
    int pocet = 0, n = 4, x;
    double * pole;

    pole = malloc( sizeof(double)*n );
    while (scanf("%d", &x) == 1)
    {
        pocet = pocet +1;

        printf( "n = %d | pocet = %d\n", n, pocet );
        if(n==pocet)
        {
            n=2*n;
            pole=(double *)realloc(pole, sizeof(double)*n);

            if( pole == NULL )
                printf( "WTF?\n" );
        }

        pole[pocet-1]=x;
    }

    return 0;
}
Skús toto, či ti to funguje. Musí, tak hľadaj chybu :) A potom ju napíš, som zvedavý.
marek788
Light Star
Light Star
Príspevky: 234
Registrovaný: 08 okt 2013, 12:40

Re: Realloc pola - C

Príspevok od používateľa marek788 »

Jo funguje, a uz som myslim aj objavil chybu, testoval som ci ten realloc v pripade potreby bude fungovat, a namiesto premennej n do mallocu, kde bolo 10 000prvkov som dal rovno cislo 10, tym padom som potom porovnaval nko s poctom, ale nko zostalo stale 10000 a pocet nebol rovny tomuto cislu. Kazdopadne dik za radu :)
Napísať odpoveď