erreur dans un programm void après la dernière ligne - C++ - Programmation
Marsh Posté le 24-06-2011 à 17:21:10
Quand tu dis que le programme plante... Il se crashe, ou il semble bloqué dans une boucle infinie ?
Bon, sinon, quelques remarques sur la forme :
- utilise les balise de code quand tu postes du code, ca facilite la vie par la suite
- la préincrémentation (++i) est plus performante que la postincrémentation (i++). C'est une bonne pratique de prendre l'habitude d'utiliser ++i
Marsh Posté le 24-06-2011 à 21:07:07
shaoyin a écrit : |
ouais c'etait vrai en 1345, ca ne l'ai plus.
Le vrai probleme viens que ta fonction creation, ca serait de meilleur gout si il s'agissait du constrcteur de A, et que A (dont on a pas le code) implemente une semantique de valeur en respectant la forme canonique de coplien : constructeur par defaut, par copi, affectation destruction.
Idem pour reseau, ca ca la classe avec un destructeur foireux.
Marsh Posté le 29-06-2011 à 17:08:11
Merci beaucoup à tous les deux,
pour le i++ par rapport au ++i, je le changerai, vu que je risque d'avoir énormément de données à traiter, ça sera peut-être un plus pour que ça aille plus vite.
Pour le reste, mon programme se crashe, un petit message apparaît et m'annonce que windows a planté. Il n'est pas bloqué, il s'arrête carrément.
Je n'ai pas mis le code de A parce qu'il est long et qu'il marche. C'est juste un arbre couvrant de poids minimum, et ce code a déjà été validé pour plusieurs projets, donc si le problème venait de là, je l'aurai rencontré avant.
La fonction création ne peut pas être le constructeur de A pour de multiples raisons, dont la principale est que ce qui sort de création, ou plutôt ce que je modifie dans création, c'est un vecteur de tournées (en gros une matrice avec des clients et des demandes), et plus du tout un arbre. Je me sers juste de cet arbre pour créer le vecteur de tournées.
Sinon, la classe tournée a un constructeur par défaut et un constructeur par recopie, tout comme la classe réseau.
Il se trouve qu'en fait... je n'ai pas fait de destructeurs ^^. Mon problème viendrait-il de là? ^^ Je pensais que les destructeurs étaient utiles lorsque l'on a des pointeurs, or je n'ai pas de pointeurs.
J'espère que c'est assez clair...
Marsh Posté le 29-06-2011 à 21:38:56
Joel F a écrit : ouais c'etait vrai en 1345, ca ne l'ai plus. |
Ok, donc maintenant le compilo est capable de détecter si la copie est utile ou non... Pour info, tu as un site a recommander pour avoir ce genre d'info sur l’évolution des compilo et tout? Ou c'est ton exp. professionnelle?
Car je me suis un peu arreté au bouquins de scott meyers et il pronait ce genre de pratique...
Marsh Posté le 29-06-2011 à 22:24:54
Je bosse dans le HPC et les compilos c'est mon gagne pain quelque part donc je commence un peu a le savoir. Le seul endroit ou ca joue c'est si ton iterateur custom est si mal ecrit que tu fais 345897 allocs memoires dans ++. Sur des index entiers, 0 impact.
En outre, si le truc est bien fait, la copie inutile est elidé dans le dead-code elimination pass.
Sinon en vrac :
http://cpp-next.com/ et plus particulierement les articles sur la copy-elision et le pass-by-value.
Y aussi un ppt qui traine et que je ne retrouve pas sur une analyse fine sur gcc/icc/msvc de toutes ces grandes blague ( ++i vs i++, for a la place de while, << a la place de * etc) ou il montre que bah c'est des FUD 99% du temps. Je poste le lien qd je le retrouve
Marsh Posté le 29-06-2011 à 23:15:50
Ok, merci.
C'est vrai que tu avais déjà parlé des pass-by-value pour le choix passage par ref / par valeur. Mais je n'ai que survolé l'article jusqu’à présent...
Je vais regarder cela.
Marsh Posté le 24-06-2011 à 17:12:20
Bonjour,
Je suis débutante en C++, et j'ai fait un petit programme qui marchait très bien jusqu'à ce matin.
j'ai un main avec un appel à une fonction, le programme effectue la fonction en entier, mais n'en sort jamais!!! C'est une fonction void et je ne fais rien après cette fonction...
int main() {
reseau R ("monfichier.tsp" );
arbre A =prim(R);
creation(A);
return 0;
}
et ça plante dans creation(A):
void creation(arbre &A)
{
vector<soustournee> itineraire(A.dim_D+A.dim_S);
soustournee temp;
for(int i=A.dim_D;i<A.dim_D+A.dim_S;i++)
{
temp=tournee(A,i);;
itineraire[i]=temp;
}
cout<<"les satellites ont été traités avec succès"<<endl;
for(int i=0;i<A.dim_D;i++)
{
temp=tournee(A,i);
itineraire[i]=temp;
}
cout<<"les dépôts ont été traités avec succès"<<endl;
}
mon programme affiche "les dépôts ont été traités avec succès" mais plante après.
Quelqu'un aurait une idée sur les raisons de ce plantage?
merci