Individuare errori nel codice.

di il
40 risposte

40 Risposte - Pagina 2

  • Re: Individuare errori nel codice.

    
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // corretto sintassi e allungato la stringa in modo da
        // pareggiare il vettore sotto
        char a[] = "aceilprsderf";
    
        int v[12] = {5,2,7,1,2,8,0,2,6,3,4,2};
    
        char *p;
    
        int i;
    
        // Conversione da void* a char*
        p=(char*)malloc(sizeof(char)*12);
    
        // Riduzione da 20 a 12 e unificazione dei cicli
        for(i=0; i<12;i++)
         {
            p[i] = a[i] + v[i]; // corretto da a + v[i] a ....
            printf("%c", *(p + i));
         }
    
        // Libero memoria, malloc alloca, free libera
        free(p);
    
    	return 0;
    }
    
    
    
  • Re: Individuare errori nel codice.

    Rispondo alla domanda che mi poni, cioè cosa sono gli indici.

    Pensiamo ad un vettore:
    int a[10]

    si definisce vettore di grandezza 10, cioè un blocco di 10 oggetti consecutivi denominati
    a[0], a[1], a[2] ....

    in questo caso, gli indici sono numerati e sono proprio questi:
    a[i]
  • Re: Individuare errori nel codice.

    Gli indici sono i numeri all'interno delle quadre, ovvero

    0 1 2 3 ... i

    mentre

    a[0] a[1] ... a[ i ]

    sono i valori degli elementi di indice 0 1 ... i
  • Re: Individuare errori nel codice.

    Dobbi, ti ringrazio per aver postato la soluzione!
    Adesso voglio capire tutto punto per punto e sto studiando il capitolo 5 del testo K&R!

    Grazie.
  • Re: Individuare errori nel codice.

    oregon ha scritto:


    Gli indici sono i numeri all'interno delle quadre, ovvero

    0 1 2 3 ... i

    mentre

    a[0] a[1] ... a

    sono i valori degli elementi di indice 0 1 ... i


    Ok, chiaro!

    Ti posso chiedermi di farmi domande a cui io risponderò così come hai fatto con questa domanda?
    Così riesco a capire le mie lacune!
    Grazie!


    P.S. Sul testo c'è ovviamente il capitolo che ho sottomano adesso e che sto studiando punto per punto, mi trovo precisamente a pag 97 del capitolo 5 di K&R in italiano
  • Re: Individuare errori nel codice.

    Oregon, ti ho scritto in pvt, se ti devo inviare le slide del prof., leggi il messaggio in pvt.
    Grazie
  • Re: Individuare errori nel codice.

    Ho finito adesso di studiare il capitolo 5 del K&R e l'unica cosa che dice di concreto è la sintassi di questi puntatori.
    Per il resto spara programmi e concetti senza una spiegazione chiara!
    Assurdo!

    Adesso sto studiando da un altro testo il capitolo dei puntatori nella speranza di riuscire ad acquisire le conoscenze necessarie per capire quello che è stato fatto dall'amico Dobby nella soluzione esposta:
    #include <stdio.h>
    #include <stdlib.h>
    
    int main()
    {
        // corretto sintassi e allungato la stringa in modo da
        // pareggiare il vettore sotto
        char a[] = "aceilprsderf";
    
        int v[12] = {5,2,7,1,2,8,0,2,6,3,4,2};
    
        char *p;
    
        int i;
    
        // Conversione da void* a char*
        p=(char*)malloc(sizeof(char)*12);
    
        // Riduzione da 20 a 12 e unificazione dei cicli
        for(i=0; i<12;i++)
         {
            p[i] = a[i] + v[i]; // corretto da a + v[i] a ....
            printf("%c", *(p + i));
         }
    
        // Libero memoria, malloc alloca, free libera
        free(p);
    
    	return 0;
    }
    
    
    


    Ed entro oggi devo far chiarezza!
  • Re: Individuare errori nel codice.

    Scusatemi, ma questa riga:
    p=(char*)malloc(sizeof(char)*12);


    Cosa vuol dire?
  • Re: Individuare errori nel codice.

    Ma allora quando descrivi l'allocazione dinamica di un vettore di char di 12 elementi non sai di cosa parli, perché è proprio quello che fa quella riga.
  • Re: Individuare errori nel codice.

    oregon ha scritto:


    Ma allora quando descrivi l'allocazione dinamica di un vettore di char di 12 elementi non sai di cosa parli, perché è proprio quello che fa quella riga.
    Concettualmente so che allocare una parte della memoria significa riservare parte di memoria per far contenere determinati dati, ma non so cosa c'è dietro e come tradurre quella riga!

    Adesso il K&R mi ha portato al paragrafo 8.7 dove c'è l'esempio di allocatore di memoria, sto cercando di far chiarezza me non c'è una traduzione di quella riga che per me è incriminata!
  • Re: Individuare errori nel codice.

    Ma che traduzione vuoi?

    La malloc è la funzione che alloca la memoria, non so se è nel tuo programma di studi ma dovresti conoscerla.

    Puoi mostrare un esempio di compito d'esame passato per capire cosa è previsto e cosa no? Altrimenti non so cosa aggiungere.
  • Re: Individuare errori nel codice.

    oregon ha scritto:


    Ma che traduzione vuoi?

    La malloppo è la funzione che alloca la memoria, non so se è nel tuo programma di studi ma dovresti conoscerla.
    Ho trovato il paragrafo che spiega l'allocazione dinamica della memoria, sul testo che ho trovato in rete, appena finisco di studiare questo paragrafo, dovrei riuscire ad esporre cosa accade in quel programma!
  • Re: Individuare errori nel codice.

    Allora.... ecco cosa dice quella riga......

    Siamo nel contesto di Allocazione dinamica della memoria.

    Le funzioni malloc free e sizeof sono essenziali per l'allocazione dinamica della memoria.

    -Funzione malloc riceve come argomento il numero di byte da allocare e restituisce un puntatore di tipo (void) alla memoria allocata,

    - Un puntatore di tipo (void *) può essere assegnato ad una variabile di un qualsiasi puntatore.

    - La funzioni malloc viene usata normalmente con l'operatore sizeof.

    Esempio:
    newPtr = malloc(sizeof(struct node));


    abbiamo che leggendo da destra a sinistra, che l'istrusione valuta sizeof(struct node) per determinare la dimensione dell'oggetto struct node, alloca una nuova area nella memoria di quel numero di byte e memorizza un puntatore alla memoria allocata in newPtr.

    - La funzione free libera la memoria, ossia la memoria viene restituita al sistema per essere riallocata in futuro. Per liberare la memoria allocata dinamicamente dalla malloc si usa l'istruzione
    free(newPtr);


    -Il C fornisce anche le funzioni calloc e realloc per creare e modificare array dinamici.

    Oregon, penso che ho compreso correttamente il concetto di qulla riga di programma, giusto

    Adesso mi chiedo:

    Perchè pareggiare i conti allungando la stringa di caratteri?
    // corretto sintassi e allungato la stringa in modo da
        // pareggiare il vettore sotto
        char a[ ] = "aceilprsderf";
    
        int v[12] = {5,2,7,1,2,8,0,2,6,3,4,2};


    Per quale motivo questo artificio?
  • Re: Individuare errori nel codice.

    Hai visto che dopo somma i 12 elementi di a e di v con

    a[ i ] + v[ i ]

    ? Quindi i caratteri e i numeri dei due vettori devono essere 12
  • Re: Individuare errori nel codice.

    oregon ha scritto:


    Hai visto che dopo somma i 12 elementi di a e di v con

    a[ i ] + v[ i ]

    ? Quindi i caratteri e i numeri dei due vettori devono essere 12
    Ok, ma perche' devono essere 12?
    O meglio, che senso ha quella somma?

    Resta il fatto che nel complesso, non sto capendo il senso di questo programma?!
Devi accedere o registrarti per scrivere nel forum
40 risposte