Linguaggio C, ritornare puntatore alla componente dell'array

di il
26 risposte

26 Risposte - Pagina 2

  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Oppure, al posto di

    --size

    hai

    size -= 1

    o equivalente

    size = size - 1
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Ok grazie. Una curiosità: c'è differenza tra --size e size-- ?
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Prova!
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Chiedi al professore, al libro, a google ...

    ... preincremento ... postincremento ...
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Sìsì, ho provato. Il codice funzione, grazie!

    Però ho delle difficoltà su alcuni passaggi, anzi diciamo tutti.

    if(--size==0)
    return (float *)array;


    1) Se size è la dimensione dell'array perché dovrebbe decrementare?


    min_c = minimo(array, size);

    2) Arrivati a questo punto c'è la ricorsione. Ma la funzione minimo riparte da capo oppure min_c si prende il valore della funzione e continua con l'istruzione successiva?

    if(*min_c < array[size])
    return min_c;

    return (float *)&array[size];


    3) Questre tre righe cosa fanno? *min_c cos'è? Size viene utilizzato come indice?


    Questo codice è fuori dalla mia portata, non riesco a capirlo. Non ci sarebbe un modo più semplice? Grazie ancora
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    No ... la ricorsione non è semplice e qualsiasi altro modo sarebbe di complessità simile.

    Che tu non la comprenda non è un problema dato che è un argomento ostico specialmente se non si hanno delle buone basi sul funzionamento a basso livello del sistema (gestione dello stack in particolare).

    Quello che mi meraviglia è che il professore (o chi per lui) ti dia questo tipo di esercizi viste le difficoltà di base che hai/avete.
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    1) Se size è la dimensione dell'array perché dovrebbe decrementare?
    Ricorda che la funzione viene chiamata più volte da sé stessa. Ogni volta che viene chiamata il valore di size passato come argomento viene diminuito di 1
    2) Arrivati a questo punto c'è la ricorsione. Ma la funzione minimo riparte da capo oppure min_c si prende il valore della funzione e continua con l'istruzione successiva?
    La funzione viene chiamata nuovamente e solo quando viene incontrato un return il valore viene passato a min_c
    *min_c cos'è?
    *min_c è il valore dell'array puntato da min_c
    Ricorda che min_c è un puntatore
    Size viene utilizzato come indice?
    In quella riga sì, è evidente

    Tieni sempre presente che le variabili sono locali alla funzione. Ovvero, tra una chiamata e l'altra esistono tante min_c quante sono le chiamate e sono tutte indipendenti tra loro.
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Ah ok! Un'altra cosa, scusa l'ignoranza. Se ogni volta che si arriva a min_c = minimo(array, size); la funzione viene richiamata e quindi "riparte da capo", quand'è che queste istruzioni:

    if(*min_c < array[size])
    return min_c;

    return (float *)&array[size];


    verranno eseguite?
    Comunque, tutti nel mio corso si lamentano di questo fatto. Conosci qualche sito che spieghi bene la ricorsione? Grazie
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    davide.fruci ha scritto:


    quand'è che queste istruzioni ...
    Quando questa if viene soddisfatta

    if(--size==0)
    return (float *)array;

    e viene eseguita quella return, la chiamata precedente si conclude e continua con le altre istruzioni.
    Conosci qualche sito che spieghi bene la ricorsione?
    Non esiste un sito o qualcuno che te lo spieghi bene o non bene ... il problema è "capirlo" ... e non c'è sito che ti garantisca di capirlo. Ci vuole un po' di tempo ... ma *ripeto* devi avere alcuni concetti di base come il funzionamento dello "stack" ... Lo conoscete? In caso negativo, studiatelo bene ...
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    D'accordo, proverò ad arrangiarmi in qualche modo.. Grazie mille
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    Se ti hanno parlato di ricorsione, ti avranno fatto il super classico esempio:

    definizione di fattoriale:

    il fattoriale di N (scritto come N!) e' il prodotto dei numeri 1*2*3*...*N

    che cosa e' il fattoriale di N-1? Il prodotto dei numeri 1*2*3*...*(N-1)

    quindi il fattoriale di N puo' essere scritto come il fattoriale di N-1 PER N

    Usando una pseudosintassi, la definizione di fattoriale potrebbe essere scritta come:

    fattoriale(N) := fattorial(N-1)*N

    Ecco la definizione ricorsiva di fattoriale: la definizione dipende da se stessa!

    Ora qui' nasce il problema: se il fattoriale di N dipende dal fattoriale di N-1, che dipende dal fattoriale di N-2 ... che dipende dal fattoriale di 2, che dipende dal fattoriale di 1 che dipende ...

    Quando ci si ferma?

    Serve una condizione che blocchi la ricorsione: la cosidetta base della ricorsione.

    La base della ricorsione, nel caso del fattoriale, e' la seguente: per definizione, il fattoriale di 0 e' 1 (uno).

    Quindi, la definizione ricorsiva di fattoriale, avrebbe una forma del tipo:

    fattoriale(N) := (N == 0) ? 1 : fattoriale(N-1)*N.


    Qui ci sono tutti i concetti fondamentali necessari per la realizzazione di una funzione ricorsiva:

    1) la funzione deve essere definita in base a se stessa, ma ci deve essere qualcosa che cambia, e che va verso la base della ricorsione
    2) ci deve essere la base della ricorsione, che blocca la ricorsione.


    Un'altro super stra classico esempio di definizione ricorsiva e' il principio di indizione:

    se un certo predicato P e' vero per 0, ed il fatto che sia vero per N implica che sia vero per N+1, allora il predicato e' vero per ogni N.

    Poi ci sono diverse varianti:

    1) invece di partire da 0 si potrebbe partire da K > 0.
    2) invece di passare da N a N+1, si puo' passare da N-1 a N
  • Re: Linguaggio C, ritornare puntatore alla componente dell'array

    migliorabile ha scritto:


    Se ti hanno parlato di ricorsione, ti avranno fatto il super classico esempio:

    definizione di fattoriale:

    il fattoriale di N (scritto come N!) e' il prodotto dei numeri 1*2*3*...*N

    che cosa e' il fattoriale di N-1? Il prodotto dei numeri 1*2*3*...*(N-1)

    quindi il fattoriale di N puo' essere scritto come il fattoriale di N-1 PER N

    Usando una pseudosintassi, la definizione di fattoriale potrebbe essere scritta come:

    fattoriale(N) := fattorial(N-1)*N

    Ecco la definizione ricorsiva di fattoriale: la definizione dipende da se stessa!

    Ora qui' nasce il problema: se il fattoriale di N dipende dal fattoriale di N-1, che dipende dal fattoriale di N-2 ... che dipende dal fattoriale di 2, che dipende dal fattoriale di 1 che dipende ...

    Quando ci si ferma?

    Serve una condizione che blocchi la ricorsione: la cosidetta base della ricorsione.

    La base della ricorsione, nel caso del fattoriale, e' la seguente: per definizione, il fattoriale di 0 e' 1 (uno).

    Quindi, la definizione ricorsiva di fattoriale, avrebbe una forma del tipo:

    fattoriale(N) := (N == 0) ? 1 : fattoriale(N-1)*N.


    Qui ci sono tutti i concetti fondamentali necessari per la realizzazione di una funzione ricorsiva:

    1) la funzione deve essere definita in base a se stessa, ma ci deve essere qualcosa che cambia, e che va verso la base della ricorsione
    2) ci deve essere la base della ricorsione, che blocca la ricorsione.


    Un'altro super stra classico esempio di definizione ricorsiva e' il principio di indizione:

    se un certo predicato P e' vero per 0, ed il fatto che sia vero per N implica che sia vero per N+1, allora il predicato e' vero per ogni N.

    Poi ci sono diverse varianti:

    1) invece di partire da 0 si potrebbe partire da K > 0.
    2) invece di passare da N a N+1, si puo' passare da N-1 a N

    Grazie mille!!
Devi accedere o registrarti per scrivere nel forum
26 risposte