Newsgroup: it.comp.lang.c++
Titolo: Perche?

Perchè pur avendo riservato 10 locazione nel vettore gliene posso caricare
anche 20?
#include <iostream.h>
#include <stdlib.h>
int main()
{  int   vettore[10], i;
      for (i = 0; i<20; i++)
        vettore[i] = i;
      for (i = 0; i<20; i++)
        cout << "N."<<i<< " e' " << vettore[i] << endl;
      system("PAUSE");
      return 0;
}
Perchè pur avendo riservato 10 locazione nel vettore gliene posso caricare
anche 20?

 anche 20?
Perche' ancora non sei andato a toccare locazioni di memoria non tue.
Ciao
Gaetano.
-- 
Posted from 
nts-03.mm.eutelsat.org
 [194.214.173.15] 
via Mailgate.ORG Server - 
http://www.Mailgate.ORG

 anche 20?
Se tenti di accedere a una locazione oltre quelle allocate per l'array,
gli effetti sono indefiniti, ovvero potrebbe capitare qualsiasi cosa,
compresa l'assenza di qualsiasi effetto visibile a occhio nudo.
Max

 anche 20?
Non puoi. Il fatto che il programma funzioni è un caso.
Per lo standard quel programma potrebbe anche mandare una cartolina di
auguri a tua mamma, e sarebbe tutto legale. In un caso come questo lo
standard dice semplicemente: comportamento non definito.
--
Andrea Ferro
---------
Brainbench C++ Master. Scored higher than 97% of previous takers
Scores: Overall 4.46, Conceptual 5.0, Problem-Solving 5.0
More info 
http://www.brainbench.com/transcript.jsp?pid=2522556

standard dice semplicemente: comportamento non definito.
Mi sembra che sia un pò indefinita come definizione di un
comportamento non definito. Non so se mi sono spiegato, i redattori
dello standard non potevano "sbattersi" un pò di + ?
--
Lawrence "Rhymes" Oluyede
rhy...@myself.com
http://www.foxhound-games.it

dello standard non potevano "sbattersi" un pò di + ?
No avrebbero posto dei limiti troppo grandi a chi programma un
compilatore, ad esempio in questo casocosa avrebbero dovuto dire?
Se dicevano che bisogna per forza che il programma vada a scrivere
nella memoria subito dopo l'array avrebbero posto delle liomitazioni
sulle possibili ottimizzazioni o sulla possibilità di avere un
compilatore c++ praticamente su qualsiasi macchina.
-- 
                    Marco Barisione (ICQ 84277092)
Se sei interessato alla creazione di it.comp.lang (per i linguaggi di
programmazione senza un gruppo apposito e per i confronti fra i
linguaggi) partecipa alla discussione sul manifesto su it.news.gruppi.

anche 20?
Il fatto che l'applicazione possa non crashare nel caso di uno
sconfinamento cosi' evidente non vuol dire che la cosa ti sia
permessa.
Gli effetti a volte possono essere anche peggiori di un "amichevole"
crash immediato.
Il Ghenio
-----
These are my parting words to you:
those who give up are doomed!
-----

 dello standard non potevano "sbattersi" un pò di + ?
Un comportamento indefinito significa che il compilatore si è comportato
conformemente allo standard qualunque cosa succeda quando il codice
viene eseguito. Nota che il codice in questione non è valido, pertanto è
sensato che il compilatore faccia quello che vuole se non è richiesto un
diagnostico.
Nel caso specifico se il codice dichiara un array di 10 elementi e cerca
di accedere a elementi ulteriori, il codice (il programma) non è valido
e al compilatore non è richiesto di segnalare il problema. Pertanto
qualunque cosa succeda è conforme allo standard. Se non altro perchè
quello che succede di fatto dipende dal sistema operativo, dal tipo di
CPU, dal tipo di memoria, dal numero di altri programmi che girano sulla
stessa macchina e altre cose del genere ma NON dal compilatore. Sarebbe
difficile quindi specificare cosa succede nello standard che descrive
come deve essere fatto il compilatore.


 compilatore c++ praticamente su qualsiasi macchina.
Più semplicemente se l'array è di 10 elementi, non ha nessun senso dire
cosa succede accedendo all'elemento 15 e non cosa succede accedendo
all'elemento 1500. E quale potrebbe essere la locazione di memoria di un
elemento che si trova ... oltre la fine della memoria?


 elemento che si trova ... oltre la fine della memoria?
Ovvero non e' possibile *specificare* un comportamento senza imporre che
venga controllata la validita' degli indici con cui si accede agli
array.
Ciao,
Nicola

 array.
Esatto. L'unica specifica possibile a livello di standard è imporre un
controllo runtime degli indici. E questo implica un overhead in termini
di spazio (il sizeof dei puntatori sarebbe maggiore), un overhead in
termini di esecuzione, l'impossibilità di convertire fra puntatori e
interi e quindi una incompatibilità di fondo con il C (e per quanto
strano possa sembrare la cosa più grave è quest'ultima).


dello standard non potevano "sbattersi" un pò di + ?
No, se la definizione di "comportamento indefinito" ti
appare indefinita, i redattori dello standard sono
perfettamente riusciti nel loro intento.
-- 
The Follet

Potresti spiegarti meglio?

 ha scritto nel messaggio
news:9srqol$9g1$1...@nreadb.inwind.it...


Potresti spiegarti meglio?
In C++ gli array non sono altro che una serie di byte uno dietro
l'altro se tu hai:
mio_tipo a[10];
e poi tenti di leggere a[5] sarà come se tu tenti di leggere la
variabile che si trova all'indirizzo a + sizeof(mio_tipo) * 5, che in
questo caso è la sesta posizione dell'array, ma se tu provi a[20]
tenti di leggere dalla posizione di memoria a + sizeof(mio_tipo) * 20,
cioè nella memoria in cui sarebbe inserito il 21esimo elemento
dell'array. Il compilatore però non controlla se effettivamente
l'array può contenere così tanti elementi o no quindi vai a leggere (o
peggio a scrivere) in una posizione della memoria in cui non sai cosa
c'è.
Le conseguenze di ciò non sono specificate, cioè potresti andare a
leggere in una posizione valida della memoria e magari anche
modificare un'altra variabile che non c'entra niente con il tuo array
e non acocrgertene o far bloccare il rpgramma.


Si Michele, forse un giorno diventerai come me.......
                               ;o)


 giusto?
Certo. E teoricamente (anche se ne dubito) persino comportarsi
diversamente sulla stessa macchina (magari crascha solo se lo esegui
quando il timer interno ha un valore che termina con le cifre 666 e non
negli altri casi. Dubito che sia così, ma se lo fosse non potresti
lamentarti).


crash immediato.
A tale proposito posso raccontare l'esperienza che abbiamo avuto pochi
giorni fa con un programma che, grazie ad un operazione errata
eseguita all'inizio andava addirittura a scrivere nella memoria
dedicata alla gestione dei thread, che avveniva all'interno di un'
apposita libreria, che cosi' crashava sempre in un punto diverso.
Eravamo arrivati quasi al punto di telefonare all'autore della
libreria per segnalargli un bug nel suo codice prima di capire che
l'errore avveniva nel nostro programma.
Certe cose fatele in Basic, se lo permette, ma non se programmate in C
o in C++.


 Potresti spiegarti meglio?
In parole molto semplici:
In alcuni sistemi operativi (non tutti) il sistema operativo
assegna al tuo eseguibile un'area di memoria su cui
puo lavorare (ad esempio quando fai una new ).
Se cerchi di usare un'area di memoria che non ti
e' stata assegnata si infastidisce.


                                ;o)
Gia lo e' visto come quota.
PS. Rispondete sotto i mess non sopra.
