|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
|
Invité de passage
Inscription : avril 2011 Messages : 56 ![]() |
Bonjour à tous,
J'ai pour les cours à expliquer le fonctionnement d'un bout de code, j'en comprend bien le sens mais j'ai une erreur alors que je ne devrais pas en avoir. La ligne qui fait planter le programme est la ligne, je ne comprends pas pourquoi :/ Code :
memmove (dest+ l_dest, ajout, nb_carac_max - l_dest); Code :
Pour le prof écrit "return dest;" et non pas "return (dest);" ? |
||
|
|
00
|
|
|
#2 |
|
Membre habitué
![]() Inscription : mars 2010 Messages : 114 ![]() |
Ton tableau tab1 n'a pas une taille suffisante pour la concaténation, utiliser memmove dans un tel cas ne peut que conduire à des Undefined Behavior.
|
|
|
10
|
|
|
#3 |
|
Membre expérimenté
![]() Florent Ingénieur Inscription : mai 2005 Messages : 791 ![]() |
Salut,
Le probleme du plantage est que ton tableau de destination n'est alloué que pour 10 caractères. Ensuite, le est exactement pareil que : Juste que ca enleve toute ambigüité. |
|
|
10
|
|
|
#4 |
|
Invité de passage
Inscription : avril 2011 Messages : 56 ![]() |
Super
Merci beaucoup, je me disais que cela provenait de la taille du tableau, mais je pensais naïvement que celui-ci s'agrandissait automatiquement ^^ Résolu |
|
|
00
|
|
|
#5 |
|
Invité de passage
Inscription : avril 2011 Messages : 56 ![]() |
Dernière question ^^
Quel est l'intérêt du return dans cette fonction ? |
|
|
00
|
|
|
#6 |
|
Membre expérimenté
![]() Florent Ingénieur Inscription : mai 2005 Messages : 791 ![]() |
Cela permet de retourner le pointeur de la chaine de caractères résultant de la concaténation
|
|
|
00
|
|
|
#7 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
Juste par curiosité: c'est un cours de C ou un cours de C++?
|
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Pierre Ingénieur développement logiciels Inscription : juin 2007 Messages : 1 175 ![]() |
Comme d'habitude, du "C avec iostream"…
Ce que je déteste les profs qui agissent ainsi.
__________________
Mes principes de bases du codeur qui veut pouvoir dormir:
|
|
10
|
|
|
#9 |
|
Expert Confirmé Sénior
![]() ![]() Inscription : août 2004 Messages : 3 665 ![]() |
J'ose espérer que le but de ce cours avec des char[] et des char* est de, par la suite, montrer les avantages des std::string
|
|
|
00
|
|
|
#10 | |||||||
|
Invité de passage
Inscription : avril 2011 Messages : 56 ![]() |
Citation:
Autres questions donc, en comparer le code initial en C Code :
Code :
1) Quelles sont les différences ? 2) Pourquoi la version en C++ est-elle plus facilement maintenable ? 3) Est-ce que l'utilisation de nb_carac_max est toujours justifié ? 4) Est ce que le code fonctionne et que fait-il ? Code :
concat_string(tab1,tab2)= concat_string(tab1,tab2)+ tab1; Code :
|
|||||||
|
|
00
|
|
|
#11 |
![]() ![]() |
Salut,
En fait, dans le code C++, il y a les trois quart des lignes (en fait, 18/19 des lignes ![]() Franchement, je me demande quelle sera la prochaine étape du prof
__________________
en bas de page
|
|
|
20
|
|
|
#12 |
![]() ![]() Loïc JolyDéveloppeur informatique Inscription : août 2004 Messages : 4 669 ![]() |
Le jour où je vois du vrai code C++ écrit ainsi, je demande à son responsable de le réécrire
Du coup, j'ai du mal pour les réponses à tes questions, j'ai l'impression qu'elles sont à apprécier dans une certain contexte que l'on n'a pas. Je vais donner mon avis, mais qui est 100% subjectif. 1/ Il y a plein de différences de syntaxe, bien entendu. On évite de devoir parcourir les chaînes pour en calculer la longueur. Il y a une partie de l'algorithme qui ne marche pas : dest.substr(0,nb_carac_max - l_dest); : Si l_dest vaut 1, et nb_carac_max vaut 10, on va récupérer les 9 premiers caractères d'une chaîne qui en contient 1... Ca ne va pas planter, car le C++ est bien fait, mais je ne vois vraiment pas le but.. 2/ Telle qu'écrite, j'ai du mal à dire si elle est plus aisément maintenable, puisque je n'ai aucune idée de ce qu'elle est sensée faire 3/ Non, absolument pas ! Une fonction de concaténation doit concaténer, et rien d'autre. Si l'utilisateur veut réduire la taille finale après concaténation, qu'il le fasse explicitement. Mais cette réduction ne fait pas partie de la notion de concaténation, et n'a rien à y faire. Le fait qu'elle apparaisse dans la version C est une limite du langage, qui ne permet pas de gérer les chaînes de caractères et oblige son utilisateur à se focaliser sur des détails bas niveau qui viennent perturber la clarté du code. Si on a vraiment besoin d'une fonction qui concatène en tronquant, sans utiliser plus de mémoire que nécessaire, alors, pourquoi pas, mais il ne faut pas l'appeler concat. 4/ Ce code ne fonctionne pas : On modifie plusieurs fois la même variable à l'intérieur d'une même expression (sans qu'il y ait de point de séquence, pour être plus précis), ce qui n'est pas autorisé. C'est comme si on écrivait int a = i++ + i++;
__________________
Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11. |
|
|
00
|
Copyright © 2000-2013 - www.developpez.com