 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
giovanni Guest
|
Posted: Tue Apr 05, 2005 1:28 pm Post subject: probleme tableaux |
|
|
j ai ces ligne la
int * num=new * int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
t valeur variable de 1 a 999
nb[t][0][0][0][0]=nb_1;
le probleme et que dans nb[t][0][0][0][0] il y a pas la valeur nb_1 ?
pourquoi?j ai mis 999 ne sachant pas taille des donnee j ai mis le max...
|
|
| Back to top |
|
 |
giovanni Guest
|
Posted: Tue Apr 05, 2005 1:30 pm Post subject: Re: probleme tableaux |
|
|
me dit erreur a la ligne
nb[t][0][0][0][0]=nb_1;
41 E:sauveDev-Cppok7.cpp invalid types `int[int]' for array subscript
petite erreur corriger:
int * num=new int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
et non comme avant
"giovanni" <giovannisch (AT) hotmail (DOT) com> a écrit dans le message de news:
4252928a (AT) ews20 (DOT) ..
| Quote: | j ai ces ligne la
int * num=new * int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
t valeur variable de 1 a 999
nb[t][0][0][0][0]=nb_1;
le probleme et que dans nb[t][0][0][0][0] il y a pas la valeur nb_1 ?
pourquoi?j ai mis 999 ne sachant pas taille des donnee j ai mis le max...
|
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Tue Apr 05, 2005 1:52 pm Post subject: Re: probleme tableaux |
|
|
| Quote: | int * num=new * int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
|
Ca n'est pas comme ca qu'on reserve de la mémoire.
En C++, on utiliserait plutot std::vector, ou peut être std::map en fonction
des besoins.
Est ce que tu te rends compte que tu es en train d'allouer plus de 1800 tera
octets de mémoire vive. Je veux bien que tu aies de l'avance sur ton temps,
mais aujourd'hui, il ne faut pas trop compter sur le fait qu'un ordinateur
ait autant de mémoire disponible (bien que ce soit théoriquement possible
sur des machines 64 bits )
Qu'est ce que tu essaies de faire ?
--
Vincent
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Apr 05, 2005 1:54 pm Post subject: Re: probleme tableaux |
|
|
"Vincent Lascaux" <nospam (AT) nospam (DOT) org> writes:
| Quote: | int * num=new * int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
Ca n'est pas comme ca qu'on reserve de la mémoire.
En C++, on utiliserait plutot std::vector, ou peut être std::map en fonction
des besoins.
Est ce que tu te rends compte que tu es en train d'allouer plus de 1800 tera
octets de mémoire vive.
|
Ou tu as vu ca?
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Apr 05, 2005 2:06 pm Post subject: Re: probleme tableaux |
|
|
"giovanni" <giovannisch (AT) hotmail (DOT) com> writes:
| Quote: | j ai ces ligne la
int * num=new * int[100,100,100,100,100];
|
Ca compile? Ca m'etonne: *int n'est pas un type.
| Quote: | int* nb=new int[999,999,999,999,999];
Alloue un tableau de 999 entiers: , est l'operateur , qui evalue les |
expressions en sequence donc les 4 premiers 999 sont en pratique ignores.
C'est la meme chose que
int* nb = new int[999];
(Ce ne le serait pas si les expressions avaient des effets de bord,
mais ce serait de tres mauvais style).
| Quote: | int* ok=new int[999,999,999,999,999];
t valeur variable de 1 a 999
nb[t][0][0][0][0]=nb_1;
|
Ca compile? Ca m'etonne: nb[t] est un int qui ne peut pas etre
indexe.
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Cyrille Guest
|
Posted: Tue Apr 05, 2005 2:11 pm Post subject: Re: probleme tableaux |
|
|
giovanni a écrit :
| Quote: | me dit erreur a la ligne
nb[t][0][0][0][0]=nb_1;
|
Bon, je vois que vous désirez accéder à un tableau de tableau de
tableau, etc.
| Quote: | 41 E:sauveDev-Cppok7.cpp invalid types `int[int]' for array subscript
|
Oui, nb étant un simple pointeur sur un int, le déréférencer 5 fois n'a
aucun sens et ça ne compile heureusement pas.
| Quote: | petite erreur corriger:
int* nb=new int[999,999,999,999,999];
|
Ici, vous créez un tableau de 999 ints, rien de plus. Si votre but est
de créer un tableau de tableau de ... etc, ce n'est certainement pas la
bonne syntaxe qui serait plutôt:
int nb[999][999][999][999][999];
La raison pour laquelle vous créez un simple tableau est que la virgule
est en C++ un opérateur qui évalue chaque opérande puis renvoye celle de
droite. Ici, "999,999,999,999,999" est donc évalué à 999.
Mais en fait il y a de fortes chances que vous n'arriviez pas à allouer
votre tableau même avec la syntaxe correcte: en effet reserver de
l'espace pour 999^5, c'est un peu moins de 100 millions de milliards,
d'entiers, si les entiers font quatre octets, il vous faudrait une RAM
de 400 millions de giga-octets, et un système 64-bits pour l'adresser
correctement (et du coup, les entiers feraient 8 octets, et on
approcherait pour vos besoin de 0,8 milliard de giga-octets, ou 0,8
exa-octet).
| Quote: | j ai mis 999 ne sachant pas taille des donnee j ai mis le max...
|
Si vous ne connaissez pas la taille de vos données, utilisez
std::vector, n'allouez pas des tableaux de taille faramineuse! :)
--
win the yes need the no to win against the no!
|
|
| Back to top |
|
 |
Cyrille Guest
|
Posted: Tue Apr 05, 2005 2:16 pm Post subject: Re: probleme tableaux |
|
|
Cyrille a écrit :
| Quote: |
Mais en fait il y a de fortes chances que vous n'arriviez pas à allouer
votre tableau même avec la syntaxe correcte: en effet reserver de
l'espace pour 999^5, c'est un peu moins de 100 millions de milliards,
d'entiers, si les entiers font quatre octets, il vous faudrait une RAM
de 400 millions de giga-octets, et un système 64-bits pour l'adresser
correctement (et du coup, les entiers feraient 8 octets, et on
approcherait pour vos besoin de 0,8 milliard de giga-octets, ou 0,8
exa-octet).
|
Bon, en fait mon calcul est inexact (je me suis planté d'un facteur
100), mais l'idée est là quand même: votre tableau est trop énorme pour
n'importe quel machine.
--
win the yes need the no to win against the no!
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Tue Apr 05, 2005 2:38 pm Post subject: Re: probleme tableaux |
|
|
"Jean-Marc Bourguet" <jm (AT) bourguet (DOT) org> a écrit dans le message de news:
[email]pxbk6nhba6m.fsf (AT) news (DOT) bourguet.org[/email]...
| Quote: | "Vincent Lascaux" <nospam (AT) nospam (DOT) org> writes:
int * num=new * int[100,100,100,100,100];
int* nb=new int[999,999,999,999,999];
int* ok=new int[999,999,999,999,999];
Ca n'est pas comme ca qu'on reserve de la mémoire.
En C++, on utiliserait plutot std::vector, ou peut être std::map en
fonction
des besoins.
Est ce que tu te rends compte que tu es en train d'allouer plus de 1800
tera
octets de mémoire vive.
Ou tu as vu ca?
|
Même si le compilateur comprend pas ce qu'il veut faire, moi je comprends
qu'il essaie d'allouer un tableau à 5 dimensions... Mais tu as raison : je
me suis trompé, ce qu'il veut c'est un truc 4 fois plus grand (parceque ce
sont des ints souvent sur 4 octets). Ca ferait donc plutot 7200 tera octets.
Au passage, ca m'ennerve un peu la "mode" qu'il y a sur fclc++ à répondre à
une question sans apporter aucune information. Je suis convaincu que tu
savais de quoi je parlais (franchement, s'il l'auteur savait qu'il y avait
un opérateur ',', est ce qu'il allouerait un tableau de 100 ou de 999
entiers avec le code qu'il a présenté ?)
--
Vincent
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Apr 05, 2005 3:12 pm Post subject: Re: probleme tableaux |
|
|
"Vincent Lascaux" <nospam (AT) nospam (DOT) org> writes:
| Quote: | Au passage, ca m'ennerve un peu la "mode" qu'il y a sur fclc++ à
répondre à une question sans apporter aucune information.
|
Generalement, quand je reponds aussi laconiquement c'est que soit j'ai
donne ou compte donner l'info par ailleurs (ce qui a mon avis etait le
cas ici, j'ai donne l'info dans un autre message qui a ete poste juste
apres). Parfois il y a un delai long -- et si l'info a ete donneepar
quelqu'un d'autre au moment ou je reviens sur le pb je ne la redonne
pas. Ce n'est pas toujours l'ideal mais je prefere ca a laisser des
erreurs trainer sans etre contredites. J'essaye aussi de ne pas le
faire avec des messages en tete de fil.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Tue Apr 05, 2005 3:23 pm Post subject: Re: probleme tableaux |
|
|
| Quote: | Au passage, ca m'ennerve un peu la "mode" qu'il y a sur fclc++ à
répondre à une question sans apporter aucune information.
Generalement, quand je reponds aussi laconiquement c'est que soit j'ai
donne ou compte donner l'info par ailleurs (ce qui a mon avis etait le
cas ici, j'ai donne l'info dans un autre message qui a ete poste juste
apres). Parfois il y a un delai long -- et si l'info a ete donneepar
quelqu'un d'autre au moment ou je reviens sur le pb je ne la redonne
pas. Ce n'est pas toujours l'ideal mais je prefere ca a laisser des
erreurs trainer sans etre contredites. J'essaye aussi de ne pas le
faire avec des messages en tete de fil.
|
OK, même si c'est à ton message que je répondais, tu n'étais pas directement
destiné. C'est une impression générale que j'ai : souvent les contributeurs
qui savent ont tendance à répondre de façon exacte, mais sans apporter
l'information qui va permettre de débloquer la personne qui a posé la
question.
Mets toi à la place de l'auteur du message qui ne connait pas l'opérateur
,. Je pense qu'il aurait été plus efficace (et pas moins laconique) de dire
"Non : 100,100,100,100,100 vaut 100", où "Non : cf mon autre message" plutot
que "Où tu as vu ca ?" qui ne contredit pas totalement. Enfin... en même
temps, c'est vrai qu'il y a tellement d'erreurs dans le code initial que
c'est difficile d'apporter un commentaire très constructif en moins de ligne
que ne le fait un bon bouquin de C++ :)
--
Vincent
|
|
| Back to top |
|
 |
Michael Guest
|
Posted: Tue Apr 05, 2005 3:46 pm Post subject: Re: probleme tableaux |
|
|
Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> wrote in
news:pxbekdpb9nq.fsf (AT) news (DOT) bourguet.org:
| Quote: | int* nb=new int[999,999,999,999,999];
Alloue un tableau de 999 entiers: , est l'operateur , qui evalue les
expressions en sequence donc les 4 premiers 999 sont en pratique ignores.
C'est la meme chose que
int* nb = new int[999];
|
Quelle utilisation "pratique" peut-on avoir de l'operateur , ???
|
|
| Back to top |
|
 |
Vincent Lascaux Guest
|
Posted: Tue Apr 05, 2005 3:59 pm Post subject: Re: probleme tableaux |
|
|
| Quote: | Quelle utilisation "pratique" peut-on avoir de l'operateur , ???
|
Ca peut être utilisé dans les boucles for, par exemple pour incrémenter
plusieurs variables
for(int i = 0, j = 0; i<100; i++, j+=2)
std::cout << "Le double de " << i << " est " << j << std::endl;
Il doit bien avoir un ou deux cas où il est utile de surcharger un tel
opérateur pour faire un sucre syntaxique approprié, mais ca doit être assez
rare à mon avis...
--
Vincent
|
|
| Back to top |
|
 |
Pierre Maurette Guest
|
Posted: Tue Apr 05, 2005 5:26 pm Post subject: Re: probleme tableaux |
|
|
Michael a écrit :
| Quote: | Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> wrote in
news:pxbekdpb9nq.fsf (AT) news (DOT) bourguet.org:
int* nb=new int[999,999,999,999,999];
Alloue un tableau de 999 entiers: , est l'operateur , qui evalue les
expressions en sequence donc les 4 premiers 999 sont en pratique ignores.
C'est la meme chose que
int* nb = new int[999];
Quelle utilisation "pratique" peut-on avoir de l'operateur , ???
La lisibilité des C++-ismes (ou C-ismes) comme i++, i >>= 2, opérateur |
virgule et quelques autres est souvent affaire personnelle. Ça tombe
bien, ils sont en général d'utilisation facultative.
Comme Vincent, je trouve l'opérateur virgule pratique dans les boucles
for(; , si on est raisonnable. C'est à dire si on ne joue pas à mettre
tout ce qu'on peut dans la définition de la boucle.
Je crois que l'opérateur virgule a la particularité de garantir un ordre
d'exécution des "instructions", ce qui n'est pas le cas si elles sont
séparées par des ;. Je n'ai jamais utilisé cette particularité.
--
Pierre
|
|
| Back to top |
|
 |
Falk Tannhäuser Guest
|
Posted: Tue Apr 05, 2005 6:13 pm Post subject: Re: probleme tableaux |
|
|
Pierre Maurette wrote:
| Quote: | Michael a écrit :
Quelle utilisation "pratique" peut-on avoir de l'operateur , ???
La lisibilité des C++-ismes (ou C-ismes) comme i++, i >>= 2, opérateur
virgule et quelques autres est souvent affaire personnelle. Ça tombe
bien, ils sont en général d'utilisation facultative.
Comme Vincent, je trouve l'opérateur virgule pratique dans les boucles
for(; , si on est raisonnable. C'est à dire si on ne joue pas à mettre
tout ce qu'on peut dans la définition de la boucle.
|
Un autre exemple relativement réaliste :
int a, b;
while(a = readA(), b = readB(), a > X || b < Y)
supercalifraguiextraallegoriquefrobenicate(a, b);
On note que la tentative suivante de se passer de l'opérateur virgule :
int a, b;
while((a = readA()) > X || (b = readB()) < Y)
supercalifraguiextraallegoriquefrobenicate(a, b);
ne marche pas. Au fait il faudrait dupliquer du code (ce qui est Mal !) :
int a = readA();
int b = readB();
while(a > X || b < Y)
{
supercalifraguiextraallegoriquefrobenicate(a, b);
a = readA();
b = readB();
}
en priant pour que personne ne rajoutera derrière un "continue" quelque
part dans la boucle sans s'apercevoir qu'il faut réinitialiser "a" et "b".
| Quote: | Je crois que l'opérateur virgule a la particularité de garantir un ordre
d'exécution des "instructions", ce qui n'est pas le cas si elles sont
séparées par des ;. Je n'ai jamais utilisé cette particularité.
|
Voir ci-dessus. Cet ordre n'est cependant plus garanti lorsqu'on surcharge
l'opérateur ",", par exemple :
template
{
Container& c;
public:
container_init_helper(Container& c) : c(c) {}
container_init_helper& operator=(typename Container::value_type const& v)
{ c.clear(); c.push_back(v); return *this; }
container_init_helper& operator,(typename Container::value_type const& v)
{ c.push_back(v); return *this; }
}; // class container_init_helper
template<typename Container> inline
container_init_helper<Container> container_init(Container& c)
{ return container_init_helper<Container>(c); }
Cela pourrait servir à initialiser des containers, par exemple :
std::list<double> lst;
container_init(lst) = 6.55957, 1.95583, 3.141592653589793238462643383279502884197169399375105820974944;
container_init(lst), 2.7182818284590452353602874713527, 40.3399, 166.386, 13.7603, 299792458.0;
Par contre, il ne faut pas faire :
int i = 42;
std::vector<int> vec;
container_init(vec) = 1664, i++, 4711, i;
sous peine d'avoir un comportement non défini.
Pour cette raison (comportement inconsistant entre l'opérateur prédéfini et
l'opérateur défini par l'utilisateur), les puristes banniront la surcharge
de l'opérateur ",", mais aussi et surtout de "&&" et "||".
Par ailleurs, les puristes détestent souvent aussi "continue".
Falk
|
|
| Back to top |
|
 |
James Kanze Guest
|
Posted: Tue Apr 05, 2005 6:51 pm Post subject: Re: probleme tableaux |
|
|
Michael wrote:
| Quote: | Jean-Marc Bourguet <jm (AT) bourguet (DOT) org> wrote in
news:pxbekdpb9nq.fsf (AT) news (DOT) bourguet.org:
int* nb=new int[999,999,999,999,999];
Alloue un tableau de 999 entiers: , est l'operateur , qui
evalue les expressions en sequence donc les 4 premiers 999
sont en pratique ignores. C'est la meme chose que
int* nb = new int[999];
Quelle utilisation "pratique" peut-on avoir de l'operateur , ???
|
L'obfuscation.
--
James Kanze mailto: [email]james.kanze (AT) free (DOT) fr[/email]
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 pl. Pierre Sémard, 78210 St.-Cyr-l'École, France +33 (0)1 30 23 00 34
|
|
| Back to top |
|
 |
|
|
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
|
|