C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Tout est question de... mémoire
Goto page 1, 2  Next
 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
bruckner.olivier@tiscali.
Guest





PostPosted: Tue May 18, 2004 12:35 pm    Post subject: Tout est question de... mémoire Reply with quote



Bonjour !

je voudrais juste un petit éclaircissement concernant mon code.

#include <iostream>
using namespace std;

#define VALUE 7

int main ()
{
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];

for (int i=0; i<=6; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;
}

return 0;
}

Je de demande si toutes les valeurs de mon tableau ont la meme adresse,
ou bien si c'est une erreur de ma part.

merci de vos réponses.
Back to top
Rémy
Guest





PostPosted: Tue May 18, 2004 1:00 pm    Post subject: Re: Tout est question de... mémoire Reply with quote




<bruckner.olivier (AT) tiscali (DOT) fr> a écrit dans le message de
news:40aa0311$0$9937$626a14ce (AT) news (DOT) free.fr...
Quote:
Bonjour !


Bonjour,

Quote:
je voudrais juste un petit éclaircissement concernant mon code.

#include using namespace std;

#define VALUE 7

int main ()
{
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];

adr est in pointeur sur int que tu initialises à l'adresse du 7ème élément
du tableau (qui n'en a d'ailleurs que 6 !)
Quote:

for (int i=0; i<=6; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;

la valeur du pointeur adr ne bouge jamais !

Quote:
}

return 0;
}

Je de demande si toutes les valeurs de mon tableau ont la meme adresse,
ou bien si c'est une erreur de ma part.

merci de vos réponses.

de rien.

essaye

int * adr;
for (int i=0; i<=6; i++)
{
adr = &stack[i]
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;
}


Rémy

P.S. c'est du C, pas du C++ ;-)



Back to top
bruckner.olivier@tiscali.
Guest





PostPosted: Tue May 18, 2004 1:33 pm    Post subject: Re: Tout est question de... mémoire Reply with quote



Rémy wrote:
Quote:
bruckner.olivier (AT) tiscali (DOT) fr> a écrit dans le message de
news:40aa0311$0$9937$626a14ce (AT) news (DOT) free.fr...

Bonjour !



Bonjour,


je voudrais juste un petit éclaircissement concernant mon code.

#include using namespace std;

#define VALUE 7

int main ()
{
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];


adr est in pointeur sur int que tu initialises à l'adresse du 7ème élément
du tableau (qui n'en a d'ailleurs que 6 !)

for (int i=0; i<=6; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;


la valeur du pointeur adr ne bouge jamais !


}

return 0;
}

Je de demande si toutes les valeurs de mon tableau ont la meme adresse,
ou bien si c'est une erreur de ma part.

merci de vos réponses.


de rien.

essaye

int * adr;
for (int i=0; i<=6; i++)
{
adr = &stack[i]
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;
}


Rémy

P.S. c'est du C, pas du C++ ;-)



Merci Rémy

en C++ celà donnerais quoi ?

Back to top
Vincent Guichard
Guest





PostPosted: Tue May 18, 2004 1:49 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

Olivier a écrit:

Quote:
#define VALUE 7
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];

Ce a quoi Rémy a répondu:

Quote:
adr est in pointeur sur int que tu initialises à l'adresse du 7ème élément
du tableau (qui n'en a d'ailleurs que 6 !)

Ttt...
adr est un pointeur sur int qu'il initialise à la valeur de l'adresse du
_8ième_ élément du tableau (qui n'en a d'ailleurs que _7_!)

Les tableaux sont indexés à partir de 0 en C (et aussi en C++)

Vincent Guichard

Back to top
Gabriel Dos Reis
Guest





PostPosted: Tue May 18, 2004 3:41 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

"Rémy" <remy.bertrand (AT) cgeyt (DOT) com> writes:

Quote:
Tu as raison, j'ai tendance à compter le zero-ième élément, puis le premier,
le second, etc... jusqu'au sixième.

Je crois qu'il y a une différence entre « ordinal » et « cardinal » ;
en particulier, il n'y a pas de « zero-ième » élément.

-- Gaby

Back to top
Alexandre
Guest





PostPosted: Tue May 18, 2004 4:37 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

Quote:

P.S. c'est du C, pas du C++ ;-)

Ah ?




Back to top
Rémy
Guest





PostPosted: Tue May 18, 2004 4:46 pm    Post subject: Re: Tout est question de... mémoire Reply with quote


"Alexandre" <alex.g (AT) netcourrier (DOT) com> a écrit dans le message de
news:40aa3bbf$0$7910$626a14ce (AT) news (DOT) free.fr...
Quote:

P.S. c'est du C, pas du C++ ;-)

Ah ?



Ben oui, a part cout, le reste c'est des tableaux et des pointeurs.

Si je remplace cout par printf, j'ai un beau programme C...



Back to top
Rémy
Guest





PostPosted: Tue May 18, 2004 4:47 pm    Post subject: Re: Tout est question de... mémoire Reply with quote


"Vincent Guichard" <vg.bleuciel.sa (AT) wanadoo (DOT) fr> a écrit dans le message de
news:c8d499$sua$1 (AT) news-reader3 (DOT) wanadoo.fr...
Quote:
Olivier a écrit:

#define VALUE 7
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];

Ce a quoi Rémy a répondu:

adr est in pointeur sur int que tu initialises à l'adresse du 7ème
élément
du tableau (qui n'en a d'ailleurs que 6 !)

Ttt...
adr est un pointeur sur int qu'il initialise à la valeur de l'adresse du
_8ième_ élément du tableau (qui n'en a d'ailleurs que _7_!)

Les tableaux sont indexés à partir de 0 en C (et aussi en C++)

Vincent Guichard

Tu as raison, j'ai tendance à compter le zero-ième élément, puis le premier,
le second, etc... jusqu'au sixième.

Rémy



Back to top
Alexandre
Guest





PostPosted: Tue May 18, 2004 6:28 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

Quote:
Ben oui, a part cout, le reste c'est des tableaux et des pointeurs.

Si je remplace cout par printf, j'ai un beau programme C...

donc un programme C++, non ?




Back to top
Fabien LE LEZ
Guest





PostPosted: Tue May 18, 2004 10:24 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

On Tue, 18 May 2004 18:37:19 +0200, "Alexandre"
<alex.g (AT) netcourrier (DOT) com> wrote:

Quote:
P.S. c'est du C, pas du C++ ;-)

Ah ?

Plus précisément, un programmeur C++ programmerait ça assez
différemment.
Si tu prends du code C, pondu par un programmeur bien compétent et
tout et tout, et que tu remplaces "printf" par "cout" et "malloc" par
"new[]", ça ne donne pas un bon programme C++ -- la structure du
programme reste très typé "C".




Enfin, de toutes façons, si le "#define" fait franchement tache sur
fclc++, même sur fclc il ne me paraîtrait pas génial :
- d'une part, une constante entière conviendrait (je crois) dans
les deux langages, même si j'ai un doute sur la présence de "const" en
C ;
- d'autre part, le nom "VALUE" ne convient vraiment pas ;
- enfin, il ne sert pas à grand-chose, surtout qu'il n'est pas
utilisé au seul endroit utile, i.e. dans la boucle for.

Ça pourrait donner un machin du style :

int main ()
{
int stack[] = { 0, 1, 2, 3, 4, 5, 6 };

unsigned int taille_stack= sizeof stack / sizeof *stack;
/* Ou, si on veut faire dans l'illisible Wink :
unsigned int const taille_stack= sizeof
stack / (sizeof * stack);
*/

//int *adr = &stack[VALUE];
int *adr= stack + taille_stack; /* Je n'aime pas l'idée d'écrire
le nom d'une variable qui n'existe pas -- ici, stack[taille_stack] */

for (int i=0; i<taille_stack; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: "
<< (void*)(stack + i) << endl;
}

return 0;
}

Du coup, la variable "adr" n'est plus utilisée, mais je ne sais pas à
quoi elle sert de toutes façons, vu que c'est un pointeur qui pointe
sur rien. D'ailleurs je ne sais même pas si l'écriture "stack +
taille_stack" est valide...

Note : c'est difficile de dire si c'est vraiment du C++ ou juste du C
habillé en C++, car c'set juste un petit bout de code pour essayer de
comprendre les rouages internes, plus que du code qui fait réellement
quelque chose. Note tout de même que parcourir un tableau avec un
for(int indice...), et donc faire afficher "stack[i]" est assez rare
-- d'ailleurs, si le tableau en question est un std::list<>, ce n'est
même pas possible.

En oubliant les indices, et en n'affichant que la valeur, on peut
s'amuser à remplacer la boucle for() par un :

for_each (stack, stack+taille_stack, AfficheValeurEtAdresse);

avec AfficheValeurEtAdresse défini comme suit :


template <class T> void AfficheValeurEtAdresse (T const& t)
{
cout << t << " a l'adresse " << (void*)(&t) << endl;
}

Note : le "template", loin de compliquer les choses, ou même de tendre
vers la généricité, permet juste de ne pas se préoccuper du type passé
-- et c'est souvent bien agréable, surtout quand le type est un
"std::map ;-)

--
Wink
FLL, Epagneul Breton

Back to top
Fabien LE LEZ
Guest





PostPosted: Tue May 18, 2004 10:28 pm    Post subject: Re: Tout est question de... mémoire Reply with quote

On 18 May 2004 17:41:45 +0200, Gabriel Dos Reis
<gdr (AT) integrable-solutions (DOT) net> wrote:

Quote:
| Tu as raison, j'ai tendance à compter le zero-ième élément, puis le premier,
| le second, etc... jusqu'au sixième.

Je crois qu'il y a une différence entre « ordinal » et « cardinal » ;
en particulier, il n'y a pas de « zero-ième » élément.

La différence, c'est qu'on peut avoir une liste vide (zéro élément),
mais dans ce cas on ne peut pas désigner les éléments, puisqu'il n'y
en a pas.
Dans une liste de 7 éléments, on compte du premier (indice 0) au
septième (indice 6). C'est pour ça que le C++ est bien plus simple :
on ne s'occupe pas de l'indice, un ou deux itérateurs et l'affaire est
jouée :-)

--
Wink
FLL, Epagneul Breton

Back to top
drkm
Guest





PostPosted: Wed May 19, 2004 12:10 am    Post subject: Re: Tout est question de... mémoire Reply with quote

Fabien LE LEZ <gramster (AT) gramster (DOT) com> writes:

Quote:
int main ()
{
int stack[] = { 0, 1, 2, 3, 4, 5, 6 };

unsigned int taille_stack= sizeof stack / sizeof *stack;
/* Ou, si on veut faire dans l'illisible Wink :
unsigned int const taille_stack= sizeof
stack / (sizeof * stack);
*/

//int *adr = &stack[VALUE];
int *adr= stack + taille_stack; /* Je n'aime pas l'idée d'écrire
le nom d'une variable qui n'existe pas -- ici, stack[taille_stack] */

for (int i=0; i {
cout << "stack[" << stack[i] << "] at memory adress: "
(void*)(stack + i) << endl;
}

return 0;
}

Du coup, la variable "adr" n'est plus utilisée, mais je ne sais pas à
quoi elle sert de toutes façons, vu que c'est un pointeur qui pointe
sur rien. D'ailleurs je ne sais même pas si l'écriture "stack +
taille_stack" est valide...

Si je ne m'abuse, on peut faire pointer un pointeur sur l'adresse
juste en dehors d'un tableau, celle du premier élément en dehors du
tableau (one past the end). Si je ne m'abuse, toujours, cela est un
comportement indéfini de déréférencer un tel pointer.

`adr' pourrait servir pour une boucle itérant directement sur un
pointeur plutôt que sur un indice :

int const * end = adr ;
for ( int const * it = & stack[ 0 ] ; it < end ; ++ it ) {
std::cout << * it << " at " << ( void * ) it << std::endl ;
}

Ce qui est très proche du principe d'itérateur de la STL : on
calcule un début, une fin en dehors du conteneur, et on itère depuis
le début (y compris) jusqu'à la fin (non comprise). La fin est alors
inutilisable si ce n'est qu'en tant que marqueur de fin.

--drkm

Back to top
Gabriel Dos Reis
Guest





PostPosted: Wed May 19, 2004 2:40 am    Post subject: Re: Tout est question de... mémoire Reply with quote

drkm <usenet.fclcxx (AT) fgeorges (DOT) org> writes:

[...]

Quote:
Ce qui est très proche du principe d'itérateur de la STL : on

Ce qui est aussi une manière destructurante. Et une fois qu'on a
réduit tout le monde à des amas linéaire d'atomes et qu'il n'y
a plus d'individualité, on peut faire passer le buldozer, pardon, les
algorithmes de la STL.

Quote:
calcule un début, une fin en dehors du conteneur, et on itère depuis
le début (y compris) jusqu'à la fin (non comprise). La fin est alors
inutilisable si ce n'est qu'en tant que marqueur de fin.

-- Gaby

Back to top
Pierre Maurette
Guest





PostPosted: Wed May 19, 2004 2:44 am    Post subject: Re: Tout est question de... mémoire Reply with quote

"bruckner.olivier (AT) tiscali (DOT) fr" <bruckner.olivier (AT) tiscali (DOT) fr> typa:

Quote:
Bonjour !

je voudrais juste un petit éclaircissement concernant mon code.

#include using namespace std;

#define VALUE 7

int main ()
{
int stack[VALUE] = { 0, 1, 2, 3, 4, 5, 6 };
int *adr = &stack[VALUE];

for (int i=0; i<=6; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: " << adr << endl;
}

return 0;
}

Je de demande si toutes les valeurs de mon tableau ont la meme adresse,
ou bien si c'est une erreur de ma part.
Considérons la question comme portant plus sur C que C++.

Voir autres réponses : il est clair que adr = &stack[7] ne changera
pas pendant la boucle.

Attention: stack[7] n'est pas un élément du tableau. Il me semble que
la norme garanti que l'on peut prendre l'adresse du premier "élément"
qui suit un tableau. En revanche, on ne doit pas le déréférencer.

Je ne vois pas l'intérêt de la macro VALUE si vous codez 6 en dur dans
le for(,,). Si je vois une macro suivie de :
int tab[MACRO];
j'imagine que la définition de la taille du tableau est "centralisée"
dans la macro. Donc, au moins faire :
for(int i = 0; i < VALUE; i++){}

Mais pourquoi ne pas faire tout simplement :

int main()
{
int stack[] = { 0, 1, 2, 3, 4, 5, 6 };
const int VALUE = sizeof(stack) / sizeof(int);
int *adr = NULL;

for(int i = 0; i < VALUE; i++)
{
adr = &stack[i];
cout << "stack[" << stack[i] << "] at memory adress: " << adr <<
endl;
}
return 0;
}


ou

int main()
{
int stack[] = { 0, 1, 2, 3, 4, 5, 6 };
const int VALUE = sizeof(stack) / sizeof(int);

for(int i = 0; i < VALUE; i++)
{
cout << "stack[" << stack[i] << "] at memory adress: " <<
&stack[i] << endl;
}
return 0;
}

--
Pierre

Back to top
kanze@gabi-soft.fr
Guest





PostPosted: Wed May 19, 2004 8:00 am    Post subject: Re: Tout est question de... mémoire Reply with quote

"Alexandre" <alex.g (AT) netcourrier (DOT) com> wrote

Quote:
Ben oui, a part cout, le reste c'est des tableaux et des pointeurs.

Si je remplace cout par printf, j'ai un beau programme C...

donc un programme C++, non ?

Même avec le printf, ce serait un programme C++. Ce serait un programme
qui se situe dans l'intersection entre C et C++.

Ce n'est pas un programme idiomatique C++. Mais c'est une autre
question. Je suppose qu'en fait, il a extrait ce qu'il a posté d'un
programme plus grand. Où peut-être il y avait des motivations à ne pas
utiliser les classes de C.

En fait, même dans l'extrait, il y en a une : l'initialisation comme une
aggrégation. Vue qu'il s'agit d'une variable locale, je ne vois pas trop
ce que ça gagne, mais je me sers souvent des tableaux statiques ou
globaux de type C, simplement pour avoir l'initialisation statique, et
être à l'abri des aléas de l'ordre de l'initialisation.

--
James Kanze GABI Software
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Goto page 1, 2  Next
Page 1 of 2

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.