Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Copiare un array
Forum - C/C++ - Copiare un array

Pagine: [ 1 2 ] Precedente | Prossimo
Avatar
NewAge (Normal User)
Pro


Messaggi: 153
Iscritto: 23/08/2009

Segnala al moderatore
Postato alle 22:41
Venerdì, 06/11/2009
Devo assegnare gli stessi valori a caratteri_correnti di caratteri_ultimi
Codice sorgente - presumibilmente C/C++

  1. int caratteri_ultimi[4];
  2.    int caratteri_correnti[4];
  3.    
  4.     caratteri_ultimi[0]=0;
  5.     caratteri_ultimi[1]=0;
  6.     caratteri_ultimi[2]=0;
  7.     caratteri_ultimi[3]=0;



Ho provato con
Codice sorgente - presumibilmente Plain Text

  1. caratteri_correnti=caratteri_ultimi;


ma non funziona... ( Quanti problemi 'sto c... asd )

PM Quote
Avatar
()
Newbie


Messaggi:
Iscritto:

Segnala al moderatore
Postato alle 22:51
Venerdì, 06/11/2009
includi l'header "memory.h" e fai:
Codice sorgente - presumibilmente Plain Text

  1. memcpy( caratteri_ultimi, caratteri_correnti, sizeof(char) * 4 );


oppure
Codice sorgente - presumibilmente C/C++

  1. int i;
  2. for ( i=0; i<4; i++ )
  3. {
  4.    caratteri_ultimi[ i ] = caratteri_correnti[ i ];
  5. }


PM Quote
Avatar
lorenzo (Normal User)
Guru


Messaggi: 1178
Iscritto: 15/04/2008

Segnala al moderatore
Postato alle 22:55
Venerdì, 06/11/2009
Testo quotato

Postato originariamente da NewAge:

Devo assegnare gli stessi valori a caratteri_correnti di caratteri_ultimi
Codice sorgente - presumibilmente C/C++

  1. int caratteri_ultimi[4];
  2.    int caratteri_correnti[4];
  3.    
  4.     caratteri_ultimi[0]=0;
  5.     caratteri_ultimi[1]=0;
  6.     caratteri_ultimi[2]=0;
  7.     caratteri_ultimi[3]=0;






allora...tu con queste istruzioni assegni il valore 0 a tutte le celle del primo vettore

Testo quotato


Ho provato con
Codice sorgente - presumibilmente Plain Text

  1. caratteri_correnti=caratteri_ultimi;


ma non funziona... ( Quanti problemi 'sto c... asd )



mentre qui fai una cosa completamente sbagliata. Stai assegnando un puntatore(perché DOVRESTI SAPERE che il nome di un array è un puntatore al primo elemento dell'array stesso) ad un array...infatti il compilatore ti dovrebbe segnalare errore.

un'assegnamento del genere si può fare se dichiari caratteri_correnti in questo modo:
Codice sorgente - presumibilmente C/C++

  1. int *caratteri_correnti;



così non ci sono errori tuttavia stai attento perché copiando in quel modo i vettori se modifichi un elemento di caratteri_correnti andrai a modificare in automatico anche caratteri_ultimi.

Di conseguenza, per copiare gli elementi tra due vettori mantenendone uno diverso dall'altro, devi usare un ciclo:
Codice sorgente - presumibilmente C/C++

  1. int i = 0;
  2. for(; i < 4; i++)
  3.     caratteri_correnti[i] = caratteri_ultimi[i];




ps: il C non è facile però basta studiare le cose...

PM Quote
Avatar
NewAge (Normal User)
Pro


Messaggi: 153
Iscritto: 23/08/2009

Segnala al moderatore
Postato alle 23:09
Venerdì, 06/11/2009
E' il mio secondo giorno di c, e sto facendo un corso intensivo, non tutti i concetti mi sono immediatamente lampanti, ma pian piano ci sto facendo la mano.

Come guida sto seguendo quella di html.it, qualche altro consiglio?

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 2:11
Sabato, 07/11/2009
Piccolo consiglio:
Se hai intenzioni serie riguardo al C, lascia perdere i tutorial e le guide online. Compra un bel libro, quegli affari composti di alberi morti che stampava Gutenberg nell'era dei dinosauri...

Linguaggio C, di Brian Kernighan e Dennis Ritchie, costa 20 euro (o anche meno) in qualunque libreria decente che abbia testi informatici oltre la serie "for dummies".

Ciao e buono studio!

PS: Ricorda una cosa... in C gli array non esistono... infatti,
il tuo codice funziona correttamente anche se lo compili così:
Codice sorgente - presumibilmente C/C++

  1. int caratteri_ultimi[4];
  2.    int caratteri_correnti[4];
  3.      
  4.     0[caratteri_ultimi]=0;
  5.     1[caratteri_ultimi]=0;
  6.     2[caratteri_ultimi]=0;
  7.     3[caratteri_ultimi]=0;



Se riesci a spiegarmi il perchè, usando il ragionamento e non google, vuol dire che hai capito il C. ;-)

PM Quote
Avatar
NewAge (Normal User)
Pro


Messaggi: 153
Iscritto: 23/08/2009

Segnala al moderatore
Postato alle 13:31
Sabato, 07/11/2009
mhmmm....

Visto che un numero non può essere una variabile, il compilatore va a cercare nell' 'array' indicato il valore con il corrispondente 'indice' ( non so se si chiami così )

Dimmi se sbaglio, ho tentato :)

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:08
Sabato, 07/11/2009
sbagliato... :D

PM Quote
Avatar
TheKaneB (Member)
Guru^2


Messaggi: 1792
Iscritto: 26/06/2009

Segnala al moderatore
Postato alle 14:26
Sabato, 07/11/2009
in C gli array sono in realtà locazioni di memoria contigue, e basta.

Codice sorgente - presumibilmente C/C++

  1. int mioVettore[10];



mioVettore è il puntatore alla cella di memoria contenente il primo elemento. La sintassi di dereferenziazione (che brutta parola!) ci dice quindi che *mioVettore (cioè il contenuto della cella puntata da mioVettore) corrisponde a mioVettore[0].

In C esiste anche la cosiddetta "aritmetica dei puntatori". Se io ho un puntatore a int, posso sommarlo ad un numero intero ottenendo l'indirizzo di un'altra cella di memoria secondo questo semplice meccanismo:

Supponiamo che:
Codice sorgente - presumibilmente C/C++

  1. int *mioPuntatore;


sia il nostro puntatore a int preferito. Supponiamo che la cella puntata sia quella all'indirizzo 0x20000010 (un numero a caso in base esadecimale). La variabile mioPuntatore conterrà esattamente il numero 0x20000010.
Se eseguiamo la somma mioPuntatore + 1, non otterremo 0x20000010 + 1 = 0x20000011 !! Bensì  otterremo 0x20000014!
Il motivo è semplice: mioPuntatore è un puntatore di tipo int*. Ogni intero "misura" 4 byte (su una macchina a 32bit), quindi se io faccio mioPuntatore + 1, voglio sommare a mioPuntatore la quantità di byte corrispondenti ad 1 intero. Se avessi fatto mioPuntatore + 3, avrei ottenuto un avanzamento di 12 byte, cioè 3 interi da 4 byte ciascuno.

Fatta questa premessa, vediamo come il C tratta gli array.

Codice sorgente - presumibilmente C/C++

  1. int mioVettore[10];
  2.  
  3. mioVettore[3] = 100;



il compilatore prende l'indirizzo di partenza del segmento di memoria che contiene il vettore. L'indirizzo di partenza è mioVettore. Cioè, il compilatore tratta la variabile mioVettore come se fosse un int*. A questo indirizzo somma il numero di interi che gli hai passato come indice, cioè 3. Ma l'aritmetica dei puntatori dice che 3 interi misurano 12 byte, quindi in realtà sta sommando 12 byte al puntatore iniziale.

l'indirizzo ottenuto è
Codice sorgente - presumibilmente Plain Text

  1. int* nuovoIndirizzo = mioVettore + 3;


in questo nuovo indirizzo è memorizzato il quarto intero del nostro array (ricordo che gli array partono da 0, non da 1).

In pratica, quindi, scrivere:
Codice sorgente - presumibilmente Plain Text

  1. mioVettore[3] = 100;


e
Codice sorgente - presumibilmente C/C++

  1. int *nuovoIndirizzo = mioVettore + 3;
  2. *nuovoIndirizzo = 100;


è esattamente la stessa cosa.
Se vogliamo essere più sintetici, potremmo scrivere anche
Codice sorgente - presumibilmente Plain Text

  1. *(mioVettore + 3) = 100;



da qui segue la proprietà commutativa della somma:
Codice sorgente - presumibilmente Plain Text

  1. *(3 + mioVettore) = 100;



e da questa nuova forma, segue l'equivalenza:
Codice sorgente - presumibilmente Plain Text

  1. mioVettore[3] = *(mioVettore + 3) = *(3 + mioVettore) = 3[mioVettore]



Morale della favola? Gli array, in C, non esistono! Sono solo una comodità sintattica per mascherare la vera essenza della manipolazione della memoria in C, l'aritmetica dei puntatori!
Un discorso analogo vale anche per le struct, ma è più complicato per la presenza di identificatori al posto degli indici numerici.
Unica differenza tra array è puntatori è che un array locale viene allocato interamente nello stack, mentre un array dinamico (allocato con malloc) viene allocato in memoria heap, o globale, quindi valgono divere considerazioni riguardo il ciclo di vita del suo contenuto e la validità dei suoi indirizzi tra funzioni diverse. In generale da vettore a puntatore il passaggio è sempre possibile (anche implicito), viceversa non vale per il passaggio inverso da puntatore, ad array: non sempre è possibile prendere un puntatore e sommargli un intero (ad esempio con i void*).

Ciao, spero di averti incuriosito a sufficienza! ;)

PM Quote
Avatar
NewAge (Normal User)
Pro


Messaggi: 153
Iscritto: 23/08/2009

Segnala al moderatore
Postato alle 15:18
Sabato, 07/11/2009
asd, sei un libro stampato!

Adesso si che ho capito! :)

PM Quote
Pagine: [ 1 2 ] Precedente | Prossimo