Oppure

Loading
24/11/11 15:27
drewnik99
Il mio problema è il seguente: un ciclo for che dovrebbere scrivere in un file gli elementi di strutture collegate, continua all'infinito.
Ecco il codice:

struct comp
{
    int code;
    char name[27];
    char des[52];
    int disp;
    struct comp *n;
};

struct comp *comps = 0, *p;

FILE *fw = fopen("miofile.txt", "w");

for(p = comps; p; p = p->n)
            {
                s1 = ((((float)(25 - strlen(p->name))) + 0.5) / 2);
                s2 = ((((float)(25 - strlen(p->name))) - 0.5) / 2);
                s3 = ((((float)(52 - strlen(p->des))) + 0.5) / 2);
                s4 = ((((float)(52 - strlen(p->des))) - 0.5) / 2) - 1;
                fprintf(fw, "|  %09.9i  ", p->code);
                fprintf(fw, "| %*s%.25s%*s ", s1, " ", p->name, s2, " ");
                fprintf(fw, "| %*s%.50s%*s ", s3, " ", p->des, s4, " ");
                fprintf(fw, "|    %09.9i    |\n", p->disp);
            }
fclose(fw);


Qualche suggerimento?
Ultima modifica effettuata da drewnik99 24/11/11 15:28
aaa
24/11/11 15:50
Così come è scritto questo ciclo non viene mai eseguito, altro che infinito.

Forse c'è altro codice che non hai mostrato ...
24/11/11 16:13
drewnik99
Si, scusa, questa è solo una piccola porzione di codice, ma il ciclo corrisponde interamente alla mia funzione salvataggio del mio database. Perciò, bisogna considerare che via siano delle strutture collegate da scrivere su file. Il ciclo scrive quelle che io inserisco tramite un'apposita funzione, ma continua all'infinito e il file di testo assume dimensioni stratosferiche.
aaa
24/11/11 16:16
Si vede che il problema è nella costruzione della lista perché il codice del salvataggio non ha nulla di strano.

Se provi solo a visualizzare a video la lista, ci riesci?
24/11/11 16:23
drewnik99
Certamente, utilizzando lo stesso ciclo.

for(p = comps; p; p = p->n)
{
//codice
}
aaa
24/11/11 16:32
No ... è impossibile.

Posta il codice con cui crei la lista ... e facci un esempio di input di dati per una lista ...
24/11/11 16:35
drewnik99
Questa è la funzione di inserimento dati:

void inserisci()
{
    struct comp *p, *c, *nn = calloc(1, sizeof(struct comp));

    if(!nn)
    {
        fputs("Memoria piena. Impossibile aggiungere il componente.\n", stderr);
    }

    fputs("\nInserisci il codice del componente (max. 99999999): ", stderr);
    fflush(stdin);
    scanf("%9i", &nn->code);

    for(c = comps, p = 0; c && nn->code > c->code; p = c, c = c->n);
    if(c && (nn->code == c->code))
    {
        fputs("Il componente esiste gia'. Impossibile aggiungere il componente.\n", stderr);
        return;
    }

    fputs("Inserisci il nome del componente: ", stderr);
    llinea(nn->name, 25);
    fputs("Inserisci la descrizione del componente: ", stderr);
    llinea(nn->des, 100);
    fputs("Inserisci la disponibilita' del componente: ", stderr);
    fflush(stdin);
    scanf("%i", &nn->disp);

    nn->n = c;
    if(!p)
    {
        comps = nn;
    }
    else
    {
        p->n = nn;
    }
}

int llinea(char *str, int n)
{
    int c, i = 0;

    fflush(stdin);
    while(isspace(c = getc(stdin)));

    while(c != '\n')
    {
        if(i < n)
        {
            str[i++] = c;
        }
        c = getc(stdin);
    }

    if(n == i)
    {
        str[i++] = (int) "*";
    }
    str[i] = 'Questa è la funzione di inserimento dati:


void inserisci()
{
    struct comp *p, *c, *nn = calloc(1, sizeof(struct comp));

    if(!nn)
    {
        fputs("Memoria piena. Impossibile aggiungere il componente.\n", stderr);
    }

    fputs("\nInserisci il codice del componente (max. 99999999): ", stderr);
    fflush(stdin);
    scanf("%9i", &nn->code);

    for(c = comps, p = 0; c && nn->code > c->code; p = c, c = c->n);
    if(c && (nn->code == c->code))
    {
        fputs("Il componente esiste gia'. Impossibile aggiungere il componente.\n", stderr);
        return;
    }

    fputs("Inserisci il nome del componente: ", stderr);
    llinea(nn->name, 25);
    fputs("Inserisci la descrizione del componente: ", stderr);
    llinea(nn->des, 100);
    fputs("Inserisci la disponibilita' del componente: ", stderr);
    fflush(stdin);
    scanf("%i", &nn->disp);

    nn->n = c;
    if(!p)
    {
        comps = nn;
    }
    else
    {
        p->n = nn;
    }
}

int llinea(char *str, int n)
{
    int c, i = 0;

    fflush(stdin);
    while(isspace(c = getc(stdin)));

    while(c != '\n')
    {
        if(i < n)
        {
            str[i++] = c;
        }
        c = getc(stdin);
    }

    if(n == i)
    {
        str[i++] = (int) "*";
    }
    str[i] = '{parsed_message}';

    return i;
}

'; return i; }
Ultima modifica effettuata da drewnik99 24/11/11 16:36
aaa
24/11/11 16:39
drewnik99
Posso dirti di più, se guardi la discussione "Scrivere su files una lista concatenata di strutture", noterai che il programma comprende anche una funzione di salvataggio del database(in binario) e questa funziona.
aaa