|
Trouver une ressource
Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !
Sujet : probleme de language c [ Système / Autre ] (PADYVEN)
Informations & options pour cette discussion
|
vendredi 28 décembre 2007 à 14:01:43 |
probleme de language c

PADYVEN
|
Bonjour quelqu'un pourrais jetter un oeil et me dire la les boulettes
du code suivant
PS je debute en c ne soyer pas tueur
char *CentreTexte(char *Texte,int nbCaractereMax)
{
char *tampon=NULL;
int calcul=(nbCaractereMax-strlen(Texte))/2;
tampon=malloc(sizeof(char)*nbCaractereMax+1);
ZeroMemory (tampon,nbCaractereMax) ;
if (calcul>=0)
{
while(calcul!=0)
{
strcat(tampon," ");
calcul--;
}
strcat(tampon,Texte);
}
else
{
strcpy(tampon,Texte);
}
return tampon;
free (tampon);
}
merci beaucoup
|
|
|
|
vendredi 28 décembre 2007 à 15:48:40 |
Re : probleme de language c

matonzo
|
Salut
Pour commencer, mettre des instructions après un return ça ne sert à rien car elle ne seront pas exécutées.
Ensuite, en admettant que tu veuilles faire ton free(tampon) avant le return, il ne faut pas faire de free sur le pointeur retourné par ta fonction sinon quand tu essaieras d'accéder à la valeur retournée tu auras une belle erreur de segmentation.
Sinon, tu peut être un peu plus spécifique sur ton problème? ça ne fait pas ce que tu veux, ça ne compile pas, ça plante?...
|
|
|
|
vendredi 28 décembre 2007 à 15:51:27 |
Re : probleme de language c

darunia
|
Salut,
Boulette au niveau du free ! En effet tu fais ton return juste avant, et comme les instructions qui suivent le return ne sont pas executées (vu que le return rend la main a l'appelant), ton free ne sera jamais executé !
Autre truc, toujours verifier le retour d'un malloc (ça peut arriver qu'il renvoi null).
Et le ZeroMemory n'est pas bon, tu dois passer sizeof(char) * nbCaractereMax + 1 pour la longueur (imagine un systeme ou un char ferait plus d'1 octets)
Voila, a part pour le free qui est quand meme assez embetant, le code est correct pour un debutant !!!
D@runia
|
|
|
|
vendredi 28 décembre 2007 à 16:07:47 |
Re : probleme de language c

SAKingdom
|
Réponse acceptée !
Ce n'est pas le système qui détermine la taille d'un char mais le compilateur. Une fois compilé, ton char fera un octet définitivement. (et de toute façon, les caractères ascii font tous 1 octets alors...). Le ZeroMemory est, ici, complètement inutile. En toute logique, il est complètement inutile de remplir un tableau de 0 quand on insère un texte immédiatement après. while(calcul!=0)
{
strcat(tampon," ");
calcul--;
}
strcat coute déjà assez cher comme ça, du fait qu'il parcours toute la chaine avant de copier le texte. Si c'est pour copier un seul caractère... Un pointeur positionné une fois en fin de chaine fait l'affaire. C++ (@++)
|
|
|
|
vendredi 28 décembre 2007 à 16:32:17 |
Re : probleme de language c

darunia
|
Oui je sais bien, mais on peut toujours imaginer !
D@runia
|
|
|
|
vendredi 28 décembre 2007 à 16:32:41 |
Re : probleme de language c

SAKingdom
|
Réponse acceptée !
Tien, j'ai refais rapidement ton code: char *CentreTexte(char *Texte, char *tampon, int nbCaractereMax) { char *c = tampon; int len = strlen(Texte); if (nbCaractereMax > len) { int calcul = ((nbCaractereMax-len)/2)+(int)c; while(c < (char*)calcul) *c++ = ' '; } strcpy(c,Texte); return tampon; } C++ (@++)
|
|
|
|
vendredi 28 décembre 2007 à 16:48:22 |
Re : probleme de language c

BruNews
|
Réponse acceptée !
Comme dit plus haut, acceptable venant d'un débutant mais totalement à refaire pour passer en prod. Réfléchir à ce que fait strcat, tu verras que ce n'est pas productif dans une boucle. ZeroMemory() est inutile si codé comme il se doit. TOUJOURS vérifier les paramètres.
Autre version:
char *CentreTexte(char *Texte,int nmax) { int len; char *d, *tampon = 0; len = strlen(Texte); if(!len) goto centrEXIT; len++; if(nmax < len) namx = len; tampon = (char*) malloc(nmax); if(!tampon) goto centrEXIT; d = tampon; nmax -= len; nmax /= 2; while(nmax) { *d++ = ' '; nmax--; } while(*d = *Texte) {d++; Texte++;} centrEXIT: return tampon; }
ciao... BruNews, MVP VC++
|
|
|
|
vendredi 28 décembre 2007 à 17:34:32 |
Re : probleme de language c

SAKingdom
|
Bizarre. Quand je regarde le listing de nos code optimisé, le compilo transforme mon while(c < calcul) *c++ = ' '; et ton while(nmax) { *d++ = ' '; nmax--; } en un appel à memset... C++ (@++)
|
|
|
|
vendredi 28 décembre 2007 à 17:51:17 |
Re : probleme de language c

BruNews
|
Rien de bizarre, que de l'habituel. Quand il reconnait la signature ou plutot l'implem de memset, il fait cela à tout coup.
On s'en aperçoit de suite quand on bosse sans CRT, on a un message d'alerte dans la fenetre de compilation. En ce cas, je vire le memset en codant inversé: 'if' avant et 'do while' ainsi il me lache la grappe (le code voulais-je dire).
ciao... BruNews, MVP VC++
|
|
|
|
vendredi 28 décembre 2007 à 18:06:20 |
Re : probleme de language c

SAKingdom
|
Bien vue. Je trouve ça quand même stupide de remplacer une opération sur des pointeurs par un couteux appel à une fonction que l'on ne veut pas simplement parce que "ça y ressemble". Est-il possible de désactiver complètement cette "fonctionnalité" ? C++ (@++)
|
|
|
Cette discussion est classé dans : texte, char, calcul, tampon, nbcaracteremax
Répondre à ce message
Sujets en rapport avec ce message
char tab[]=a; [ par zelze ]
Voila mon probleme:je connais char tab[]="ton texte"; mais se que je veux faire c'est a la place de "ton texte" mettre une variable.j'ai essaié plusie
Switch texte [ par lastpixl ]
Est-il possible de faire un switch sur du texte ? Mon compilateur me fait une erreur à chaque fois que j'essaie avec une chaine.ca marche avec un char
pb compilation (dev-C++) [ par levetot ]
Tout mon problème est dans le titre...J'utilise la dernière version de dev-C++,(4.9...) et mon programme compilait nickel jusqu'à que j'utilise un tab
Programme en C [ par tweeti08 ]
Voila mon problème, je débute dans le C et j'ai commencer un programme permettant de crypter par les carctère alphabétique mais le hic c ke je sui pa
Problème avec taille chaine de caractères variable [ par graphtyrael ]
Bonjour à tous !Je cherche à créer une chaine de caractère de taille variable qui s'agrandit au fur et à mesure que je rentre des caractères. J'ai don
Fstream [ par tobratus ]
Bonjour tout le monde, Voici en substance le problème. Je lis un fichier texte avec certaines données binaires en mode texte. La lecture se fait à l
mettre un texte dans une textBox [ par typhoun ]
Ca ne doit pas être très compliqué mais je ne vois pas comment faire pour mettre un texte dans une textBox et pour qu'il s'affiche correctement:char*
conversion char to TBint32 [ par gab55 ]
Bonjour a tous je suis débutant en c++ et j'utilise une fonction qui lit des données dans un fichier texte mon probleme est que les données contenues
fichie texte [ par cedric3456 ]
bonjour je suis tres nul en c++ je debute pouvez vous m'aidez je cherche a faire 3 fonction sur Dev-C++ 4.9.9.2fonction :ecrire (nom_fichier,chaine_ch
LPCVOID - Modifier le contenu [ par noobs ]
Salut! C'est mon premier post Bon ma question est la suivante : J'ai une fonction write_to_file(LPCVOID texte) qui se charge d'ecrire une chain
Livres en rapport
|
Téléchargements
Logiciels à télécharger sur le même thème :
|