Problema con ciclo for

di il
4 risposte

Problema con ciclo for

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?

4 Risposte

  • Re: Problema con ciclo for

    For(p = comps; p; p = p->n)
    dove è la condizione di uscita?
    ciclo sintassi ciclo for:
    for (condizione iniziale,condizione di uscita,incremento o assunzione nuovo dato)
    esempio
    for (int i =1,i > 10,i++) { quello che deve fare il ciclo}
    oppure
    for (i=x,i < x,i=y) { quello che deve fare il ciclo)
    il problema con quest'ultima opzione di ciclo sta nel fatto che fin quando y non varrà meno di x il ciclo non termina)

    spero di esserti stato d'aiuto
  • Re: Problema con ciclo for

    Il ciclo opera su una lista collegata di strutture, perciò controllando se p esiste si pone la condizione di termine del ciclo.
    Postato originariamente da drew99:
    
    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);
                }
    
    Se evito di scrivere i campi name e des, il ciclo funziona perfettamente. Si, n dell'ultima struttura è impostato a 0.
  • Re: Problema con ciclo for

    Allora fai confrontare p con null oppure p->n con 0
    comps quanto vale inizialmente ?
    perchè se vale 0 allora il problema stà li
  • Re: Problema con ciclo for

    Come puoi vedere dal codice postato, comps inizialmente vale 0. Se controllo la condizione
    p->n, perdo l'ultima struttura. Ho scoperto, però, che il problema si presenta se uso questo codice:
    
    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);
                }
    
    Se, invece, provo a scrivere solo il codice e la disponibilità del componente, il ciclo termina correttamente:
    
    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, "|    %09.9i    |\n", p->disp);
                }
    
    Qualche suggerimento?
Devi accedere o registrarti per scrivere nel forum
4 risposte