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
nessuno
Così come è scritto questo ciclo non viene mai eseguito, altro che infinito.

Forse c'è altro codice che non hai mostrato ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
nessuno
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?
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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
nessuno
No ... è impossibile.

Posta il codice con cui crei la lista ... e facci un esempio di input di dati per una lista ...
Ricorda che nessuno è obbligato a risponderti e che nessuno è perfetto ...
---
Il grande studioso italiano Bruno de Finetti ( uno dei padri fondatori del moderno Calcolo delle probabilità ) chiamava il gioco del Lotto Tassa sulla stupidità.
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