Re: Question c

トップ ページ

このメッセージに返信
著者: Edgar Bonet
日付:  
To: guilde
題目: Re: Question c
Le dimanche 22 juin, Patrick Dupre a écrit :
> Hier j'ai eu recu un commentaire concernant le cout de la reallocation
> d'element un par un, desole je n'ai pas garde le mail et je n'ai pas
> immediatement reagit.


Effectivement, vaut mieux dimensionner tout de suite la taille du
tableau pour limiter le risque de devoir faire un realloc. Voici un
exemple où on augmente la taille par pas de 8 MiB :

    #define ALLOC_STEP 1<<20    /* 2^10 doubles = 8 MiB */


    typedef struct {
        double *d;      /* data */
        int n;          /* length */
        int allocated;
    } double_array;


    static double_array new_array = { NULL, 0, 0 };


    /* Returns 0 in success, -1 on failure. */
    int array_push(double_array *a, double x)
    {
        if (a->n >= a->allocated) {
            double *old_d = a->d;
            a->allocated += ALLOC_STEP;
            a->d = realloc(old_d, a->allocated * sizeof(double));
            if (!a->d) {
                perror("realloc()");
                a->d = old_d;
                a->allocated -= ALLOC_STEP;
                return -1;
            }
        }
        a->d[a->n++] = x;
        return 0;
    }


Pour l'utiliser tu fais :

    double_array a = new_array;


puis autant de

    array_push(&a, <expression double>);


que tu veux.

Ciao,

Edgar.