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)

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

Membre Club
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

Membre Club
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

Administrateur CodeS-SourceS
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

Membre Club
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

Administrateur CodeS-SourceS
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

Membre Club
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++ (@++)



1 2

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


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,499 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.