Codice in C

garnak.olegovitc1
Salve a tutti,
non capisco perché nel seguente codice la seconda stampa degli array ordinati non è con elementi ordinati e per giunta l'ultimo elemento dell'array B[] è 0 quando zero non lo è!!

#include <stdio.h> 
    int dim;
    int i;
    int A[100];
    int B[100];
    int flag;
    int flag_;
    int aux;
    int aux_;

void main(void)
{
    //Assegnamento dimensione agli array con verifica

    printf("Dai una dimensione minore di 100 e maggiore di 1 agli array\n");
    scanf("%d",&dim);
    printf("\n");
    if(dim>100 || dim <1)
    {
        do
        {
            printf("Hai superato la dimensione massima e minima");
            printf("\n");
            printf("Ridai dimensione inferiore a 100 e maggiore di 1 agli array\n");
            scanf("%d",&dim);
            printf("\n");
        }
        while (dim>100 || dim <1);
    }

    //Assegnamento valori all'array A[]

    printf("Dai i valori all'array A[]");
    printf("\n");
    for(i=0;i<=dim-1;i++)
    {
        printf("A[%d]:",i);
        scanf("%d",&A[i]);
        //printf("\n");
    }
    printf("\n");
    printf("\n");

    //Assegnamento valori all'array B[]

    printf("Dai i valori all'array B[]");
    printf("\n");
    for(i=0;i<=dim-1;i++)
    {
        printf("B[%d]:",i);
        scanf("%d",&B[i]);
        //printf("\n");
    }
    printf("\n");
    printf("\n");

    //Stampa array A[]

    printf("Array A[]:");
    for(i=0; i<=dim-1; i++)
    {
        printf("%d", A[i]);
        printf("\t");
    }
    printf("\n");

    //Stampa array B[]

    printf("Array B[]:");
    for(i=0; i<=dim-1; i++)
    {
        printf("%d", B[i]);
        printf("\t");
    }
    printf("\n");
    printf("\n");

    //Ordinamento col Bubble sort dell'array A[]

    do
    {
        flag=0 ;
        for(i=0;i<dim-1;i++);
        {
            if(A[i]>A[i+1])
            {
                aux=A[i];
                A[i]=A[i+1];
                A[i+1]=aux;
                flag=1;
            }
        }
    }
    while(flag==1);

    //Ordinamento col Bubble sort dell'array B[]

    do
    {
        flag_=0;
        for(i=0;i<dim-1;i++);
        {
            if(B[i]>B[i+1])
            {
                aux_=B[i];
                B[i]=B[i+1];
                B[i+1]=aux_;
                flag_=1;
            }
        }
    }
    while(flag_==1);

    //Stampa array ordinato A[]

    printf("Array A[]:");
    for(i=0; i<=dim-1; i++)
    {
        printf("%d", A[i]);
        printf("\t");
    }
    printf("\n");

    //Stampa array ordinato A[]

    printf("Array B[]:");
    for(i=0; i<=dim-1; i++)
    {
        printf("%d", B[i]);
        printf("\t");
    }
}


Ringrazio tutti anticipatamente!!

Cordiali saluti

P.S.=Ho potuto verificare che se inserisco una dimensione pari a 3 allora nella seconda stampa l'ultimo elemento di B[] è zero anche quando zero non lo è, stessa cosa vale anche per dimensione pari a 1... come mai?? Ora non saprei se anche per altre dimensioni il problema è lo stesso!!

Risposte
claudio862
Abilita i warning del compilatore:

> clang -std=c99 -pedantic -Wall -Wextra a.c
a.c:11:1: error: 'main' must return 'int'
void main(void)
^
a.c:83:29: warning: for loop has empty body [-Wempty-body]
        for(i=0;i<dim-1;i++);
                            ^
a.c:83:29: note: put the semicolon on a separate line to silence this warning
a.c:101:29: warning: for loop has empty body [-Wempty-body]
        for(i=0;i<dim-1;i++);
                            ^
a.c:101:29: note: put the semicolon on a separate line to silence this warning
2 warnings and 1 error generated.

garnak.olegovitc1
Salve claudio86,

"claudio86":
Abilita i warning del compilatore:

> clang -std=c99 -pedantic -Wall -Wextra a.c
a.c:11:1: error: 'main' must return 'int'
void main(void)
^
a.c:83:29: warning: for loop has empty body [-Wempty-body]
        for(i=0;i<dim-1;i++);
                            ^
a.c:83:29: note: put the semicolon on a separate line to silence this warning
a.c:101:29: warning: for loop has empty body [-Wempty-body]
        for(i=0;i<dim-1;i++);
                            ^
a.c:101:29: note: put the semicolon on a separate line to silence this warning
2 warnings and 1 error generated.


io uso code::blocks!! Come dovrei fare?

Cordiali saluti

P.S.=In effetti ho corretto i warning da te segnalati, e devo ammettere che sono stupidi gli errori di questo tipo ma non capisco come è possibile che non me ne sia accorto, e tutto va a buon fine... tu che compilatore usi?

garnak.olegovitc1
Salve Claudio86,
penso di esserci riuscito, perà il punto e virgola dopo la parentesi tonda del ciclo for non lo rivela come warning...
Cordiali saluti

claudio862
"garnak.olegovitc":
Salve Claudio86,
penso di esserci riuscito, perà il punto e virgola dopo la parentesi tonda del ciclo for non lo rivela come warning...
Cordiali saluti


Cambia compilatore :P
Scherzi a parte, pensavo che GCC se ne accorgesse. Io uso Clang, che in quanto a diagnostica batte ampiamente qualsiasi altro compilatore abbia provato (per non parlare della velocità di compilazione). Qui avevo scritto qualche appunto su come installarlo su Windows.

garnak.olegovitc1
Salve Claudio86,
grazie mille tanto!! :wink:
Lo proverò subito!!
Cordiali saluti

apatriarca
Per curiosità ho provato a compilare il programma su diversi compilatori che ho per confrontarli (attivando tutti i warning). I risultati:
- Pelles C non ha restituito alcun warning riguardo al punto e virgola dopo il for, mentre ha trovato da ridire sul valore di ritorno del main e sul mancato utilizzo del valore di ritorno di scanf.
- Visual Studio 2012 si lamenta solo della scelta di usare scanf, per via della sua strana scelta di ritenere tale funzione deprecata.
- A quanto pare anche Mingw32/gcc in Code::Blocks su Windows non restituisce un warning in quella posizione. Si lamenta del main.
- Il compilatore Intel su Windows si lamenta del main e ti informa (ma sono messaggi e non warning) del fatto che scanf è deprecata (usa le librerie di Microsoft dove tale funzione è segnata come deprecata con ogni probabilità). Se gli chiedo di farmi un'analisi statica del codice si lamenta invece che la variabile dim è stata letta da uno scanf e usata come condizioni di fine di un ciclo in apparenza senza controllare in quale intervallo si trova (ma si sbaglia). Quell'if con all'interno un ciclo do/while è comunque impresentabile essendo del tutto equivalente ad un ciclo while con la stessa condizione.

A quanto pare l'errore è riuscito a trovarlo solo clang. Se qualcuno ha provato con altri compilatori e vuole condividere.. Mi ha più che altro deluso l'analisi statica del compilatore Intel che ha trovato un errore improbabile ma non ha evidenziato qualcosa che il più delle volte è fatto per errore. Considerando il costo mi aspettavo molto di meglio..

garnak.olegovitc1
Salve apatriarca,

"apatriarca":
Quell'if con all'interno un ciclo do/while è comunque impresentabile essendo del tutto equivalente ad un ciclo while con la stessa condizione.


hai ragione, ;-) si può fare a meno dell'if.....!!!! Che sbadato....!!! #-o

Cordiali saluti

Rispondi
Per rispondere a questa discussione devi prima effettuare il login.