Newsgroup: it.comp.lang.c++
Titolo: Definizione di più array in C++

Ciao a tutti,
sono da pochi mesi entrato nel mondo dei linguaggi di programmazione ad alto
livello o meglio č poco tempo che sviluppo in C++, cmq il problema che
vorrei  sottoporvi č il seguente:
analizzate il seguente pezzo di codice :
main ()
{
    int vett1[10];
    int vett2[10];
.........
.........                   // un certo algoritmo
.........
}
poichč la memoria č gestita a stack dovrebbe aversi che il primo vettore č
memorizzato prima del secondo cioč l'indirizo dell'ultimo elemnento del
primo array (vett1[10]) deve essere immediatamente precedente a quello del
secondo (vett2[0]).
E' giusto o no?
ESEMPIO:
        elemento     vett1[10]        vett2[0]
        valore               '\0'                    16
        indirizzzo           x                      x+1
Ma allora perche' il il mio compilatore (borland c++ 3.0) fa coincidere
l'ultimo elemento del secondo con il primo del primo cioč accade la seguente
cosa:
         elemento                     vett2[10]        vett1[0]
          valore                             1                     1
          indirizzo                          x                    x
Innanzitutto non dovrebbe esserci prima il vettore 1 e poi l'altro visto che
l'area di memoria per le variabili locali statiche č gestita a pila
inoltre perché il secondo vettore non viene terminato e assume valore
vett1[0] nella posizione del terminatore NULL.
Ho riscontrato questo problema metre cercavo di fondere ed  ordinare due
vettori attraverso due puntatori ma per le motivazioni precedenti
l'algoritmo (corretto) non funzionava perciň ho dovuto terminare manualmente
i vettori, solo allora i risultati erano giusti.
Vi assicuro che l'algoritmo era giusto e non presentava errori concettuali.
Ora chiedo delucidazioni sui miei dubbi a tutti coloro che abbiano anche una
minima idea del perchč.
Grazie a tutti.

 E' giusto o no?
Il problema credo sia che vett1[10] NON fa parte di vett1 i cui 10
elementi sono indicizzati da 0 a 9.
Il modo con cui i vengono messe le variabili nello stack credo sia
normale prima la vett1 poi vett2 che pero' ha indirizzo inferiore. Credo
che comunque questo sia un'altro problema, il primo pero' e un errore
concettuale.
Ciao.
-- 
     (ZZZ)       Filippo Salotti, Bagni di Lucca, Lucca, Italy.
    //   \\  _                 E-mail : 
fil...@humnet.unipi.it
   /Y\    ZD<_o===============================================o
 .oZZZZZo.     | Studente Ingegneria Informatica Automatica  |
<OXXXXXXXO>    | Dip. Sistemi Elettrici Universita' di Pisa. |

 
In C++ i vettori non hanno mai un elemento terminatore, a meno cche non lo
inserisca tu stesso come ultimo elemento. Ti faccio inoltre notare che
il primo elemento ha sempre indice 0 e l'ultimo n-1, per cui sscrivendo
vett2[10] in pratica vai oltre l'ultimo elemento di vett2 che in questo
caso ti coincide con vett1[0] (perche` lo stack cresce da basso verso
l'alto).
Solo i vettori che in realta` puntano ad una stringa asciiz sono termiati
da '\0', ma solo perche` il terminatore fa parte della stringa.
Paolo

        elemento     vett1[10]        vett2[0]
Qui casca l'asino: NON ESISTE nessun "vett1[10]"!!!.  Hai
dichiarato "int vett1[10];", questo significa che gli elementi
dell'array vanno da vett1[0], a vett1[9], inclusi; NON arrivano
sino a vett1[10]!
Puoi calcolare l'indirizzo "vett1+10" ("uno dopo" quello
dell'ultimo elemento dell'array), al solo scopo di fare dei
confronti di questo indirizzo con quelli degli elementi
dell'array stesso, ma NON puoi lecitamente dereferenziare
l'indirizzo in questione.
I tuoi problemi pare che derivino tutti da questo errore,
cioe` dall'uso di "un elemento in piu`" di quelli che hai
effettivamente dichiarato come esistenti negli array.
Alex

Prima di tutto grazie.
La mia reply vale per tutti coloro che mi hanno gentilmente risposto.
Ho scoperto da dove derivava il mio errore.
Credevo di aver letto sul testo di Shildt "Linguaggio C++" che ogni vettore
venisse automaticamente terminato nella sua i+1-sima posizione dove i è
appunto la dimensione del vettore, ciò,come asserite tuti voi, non è vero in
quanto è una caratteristica solo delle stringhe a quanto leggo. Spero che
quello che ho detto sia corretto visto che sembra che il testo non abbia
riscosso molto successo tra i programmatori di medo-alto livello e quindi è
di dubbia attendibilità.
Grazie Fixxxer

...
<<...
Mi associo senza ombra di dubbio . Il fatto che il C/C++ non esegua
in fase di compilazione il controllo sul limite degli array , non implica
che se ne possa fare un utilizzo indiscriminato.
Un array di questo tipo( int vett1[10] ) indica soltanto che lo stesso
è costituito da 10 elementi, dei quali vett1[0] è il primo, mentre vett1[9]
è l'ultimo. L'utilizzo di vett1[10] è errato perchè si indica al compilatore
la volontà di accedere ad una cella di memoria, che in realtà NON fa parte
di vett1 ma che potrebbe essere inutilizzata (quindi con un contenuto
sconosciuto) oppure facente parte di un'altra variabile.
Per quanto riguarda l'ordine "d'impilamento" delle variabili sullo STACK
(con indirizzo assoluto crescente o non) , questo dipende dall'architettura
del processore sul quale gira il programma.
  Lorenzo Girardin