[c++]pointeurs

pointeurs [c++] - C++ - Programmation

Marsh Posté le 27-01-2003 à 21:02:06    

salut  
j'aimerai savoir ce que vous pensez d'un prog que j'ai fais oùje dois incrémenter un tableau puis trouver la + petite valeur.
le code fonctionne cependant j'aimerai avoir vos conseils pr l'améliorer ca permettra de mieux comprendre la notion de pointeur
merci

Code :
  1. #include <stdio.h>
  2. #include <iostream.h>
  3. #include <string>
  4. int saisie(int* tab, int n);
  5. int mini(int* tab,int n);
  6. int main(void)
  7. {
  8. int n;
  9. int* t;
  10. t=new int[n];
  11. cout<<"entrez le nombre d'élément dans le tableau.\n";
  12. cin>>n;
  13. saisie(t,n);
  14. cout<<"la plus petite valeur est\n"<<mini(t,n)<<"\n";
  15. delete t;
  16. system("pause" );
  17. return 0;
  18. }
  19. // sasie du tableau
  20. int saisie(int* tab, int n)
  21. {
  22. for(int i=0;i<n;i++){
  23. cout<<"entre le nombre numéro:"<<i<<"\n";
  24. cin>>tab[i];}
  25. }
  26. // mini
  27. int mini(int* tab,int n)
  28. {
  29. int v=50;
  30. for(int i=0;i<n;i++){
  31.    if(tab[i]<v)
  32.    {v=tab[i];}
  33. }
  34. return v;
  35. }


---------------
http://www.independza.com
Reply

Marsh Posté le 27-01-2003 à 21:02:06   

Reply

Marsh Posté le 27-01-2003 à 21:27:37    

Là, de temps en temps, tu vas te taper une jolie runtime error.


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 27-01-2003 à 21:28:43    

Et puis ton delete qui correspond pas au new...enfin bref, la cata...Sinon c'est coherent pour un mix C/C++


---------------
Horizon pas Net, reste à la buvette!!
Reply

Marsh Posté le 27-01-2003 à 21:36:41    

avec un cout, on n'utilise pas "\n" mais endl
 
pourquoi utiliser stdio.h et string.h  avec iostream.h ?
 
soit dit en passant, un t = new int[n] alors que tu n'as pas encore donné de valeur à n, c'est impardonnable
 
De plus, il faudrait blinder ton programme contre un n trops grand !
 
Puis j'appele pas ça incrémenter


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 27-01-2003 à 22:26:35    

puis c'est delete [] t;

Reply

Marsh Posté le 28-01-2003 à 06:45:18    

Code :
  1. #include <iostream.h>

J'abandonne...
 

Code :
  1. int v=50;

D'où il sort ce 50 ?

Code :
  1. int mini(int* tab,int n)
  2. {
  3. int min= tab[0];
  4. for(int i=1 ; i<n ; ++i)
  5.  if(tab[i]<min)
  6.   min=tab[i];
  7. return v;
  8. }


Ce serait bien avec les contenurs et algorithmes standard, des patrons, des objet fonctions...
Mais bon, si t'en est au pointeur ça peut se faire en C.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 28-01-2003 à 09:20:46    

kjus : suis pas sur que le [] soit obligatoire dans le cas présent


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 28-01-2003 à 18:27:19    

je ne connais pas très bien l'histoire des new et delete. (j'utilise plutot malloc...), mais il me semble bien que après avoir alloué avec new [], il faut désallouer avec delete[];

Reply

Marsh Posté le 28-01-2003 à 18:32:26    

faut surtout pas que Taz voie ce topic, sinon il va falloir le ranimer [:ddr555]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 28-01-2003 à 19:09:02    

suis pas sur, mais je crois que [] sert à appeler les destructeurs des membres qui sont des classes... inutile dans le cas d'un int


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 28-01-2003 à 19:09:02   

Reply

Marsh Posté le 28-01-2003 à 21:57:36    

mais ce n'est pas un int, mais un tableau !

Reply

Marsh Posté le 29-01-2003 à 00:42:23    

Si il voit ça c'est le coma direct !
 

Code :
  1. malloc <-> free
  2. new    <-> delete
  3. new[]  <-> delte[]

Celui qui se croit malin en faisant des mélanges "pasque ça marche chez moi" s'expose à de graves désillusions.
Même si le tableau est de dimension 1.


---------------
Bricocheap: Montage de ventilo sur paté de mastic silicone
Reply

Marsh Posté le 29-01-2003 à 08:04:19    

Musaran a écrit :

Si il voit ça c'est le coma direct !
 

Code :
  1. malloc <-> free
  2. new    <-> delete
  3. new[]  <-> delte[]

Celui qui se croit malin en faisant des mélanges "pasque ça marche chez moi" s'expose à de graves désillusions.
Même si le tableau est de dimension 1.


 
 [:plusun]


---------------
Le Tyran
Reply

Marsh Posté le 29-01-2003 à 08:20:53    

Harkonnen a écrit :

faut surtout pas que Taz voie ce topic, sinon il va falloir le ranimer [:ddr555]


 [:xp1700]  :lol:


---------------
Le site de ma maman
Reply

Marsh Posté le 29-01-2003 à 09:42:32    

kjus : c'est un tableau d'int, le [] de delete se rapporte aux tableaux de classes.
 
http://www.glenmccl.com/bett_003.htm (en bas de page :) )
 
...
What makes this a bit tricky is that all of this work of calling constructors and destructors doesn't matter for fundamental data types like int:  
        int* ip;
        ip = new int[100];
        delete ip;
This code will work in many cases, because there are no destructors to call, and deleting a block of storage works pretty much the same whether it's treated as an array of ints or a single large chunk of bytes
...


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 29-01-2003 à 09:47:47    

En fait, le [] appelle les destructeurs de chacun des éléments du tableau, puis delete libère la mémoire.
Dans le cas d'un type int, short, ..., il n'y a pas vraiment de destructeur, donc pas besoin du [], mais je n'ai pas dit qu'on ne pouvait pas le mettre :)


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 29-01-2003 à 09:49:47    

Angel_Eyes a écrit :

En fait, le [] appelle les destructeurs de chacun des éléments du tableau, puis delete libère la mémoire.
Dans le cas d'un type int, short, ..., il n'y a pas vraiment de destructeur, donc pas besoin du [], mais je n'ai pas dit qu'on ne pouvait pas le mettre :)


le [] doit être mis. Sinon il va pas détruire chaque case du tableau mais juste libérer le pointeur. En + si tu le mets pas ca va fonctionner parfois et planter 90% du temps

Reply

Marsh Posté le 29-01-2003 à 14:32:56    

gloop : si il y avait une classe, ok, mais là, je parle du type int, explique moi ce qui doit être détruit :sweat: et pourquoi ça planterait ... ????


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 29-01-2003 à 14:36:09    

j'admet quand même que c'est assez particulier, mais le destructeur d'un type int, short, ... ne doit rien faire, le delete se résume en une libération du pointeur...


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 29-01-2003 à 19:04:55    

Angel_Eyes a écrit :

gloop : si il y avait une classe, ok, mais là, je parle du type int, explique moi ce qui doit être détruit :sweat: et pourquoi ça planterait ... ????


le compilo doit qd meme libérer toute la mémoire prise par le tableau et pour ca il faut le []. delete supprime un objet _individuel_ et delete [] un tableau.

Reply

Marsh Posté le 29-01-2003 à 20:21:01    

gloop : en fait, je crois qu'on a tous les deux raison
 
En cherchant sur le net, j'ai trouvé ceci sur delete
 
1. nettoie tout sans jamais avoir besoin de []
2. appele le destructeur du premier objet et libère le tableau, nécessite [] pour appeler les destructeurs de tous les objets du tableau
3. utilisation de [] obligatoire pour un tableau
 
je crois pas qu'on va se battre pour du compiler specific et ton écriture est valide dans tous les cas.
Je vais rechercher mes sources (ai viré mes notes :( ) pour retrouver qqch de plus précis sur la question.
 
Mais j'ai peur qu'il y ait eu une évolution à ce niveau depuis mes cours en 98 :pfff:


Message édité par Angel_Eyes le 29-01-2003 à 20:30:13

---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le 29-01-2003 à 20:41:27    

effectivement, jusque il y a peu, j'avais raison :D
 
http://www.usenix.org/publications [...] 2/c++.html
 
delete connaissait la mémoire allouée au pointeur et le [] ne servait qu'à appeler les destructeurs supplémentaires.
 
mais il y a eu une révision qui divise new et new[] et qui oblige l'utilisation respective de delete et delete[]
 
Damned, je me fais vieux  :pfff:


---------------
Angel Eyes, j'en raffole tous les matins... :pt1cable:  
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed