IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Erreurs de compilation avec strcat


Sujet :

C

  1. #1
    Invité
    Invité(e)
    Par défaut Erreurs de compilation avec strcat
    Bonjour,

    Je m'en remet à vous car je n'arrive pas à atteindre le fond du problème.
    A la suite de ce bout de code, des erreurs me ressortent, les voici.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
     
    //-----------------------------------------------------------------------------
    int ascii_hexa ()
    //-----------------------------------------------------------------------------
    {
    	char 	StrTexte[MAX_LONG_MSG_SIZE] = "0123456789BCDEFGHIJKLMNOPQRSTUVWXYZ";
    	//char 	StrTexte[MAX_LONG_MSG_SIZE] = "0x3031323334353637383941424344454647484944B4C4D4E4F505152535455565758595";
    	char 	StrTexte1[MAX_LONG_MSG_SIZE];
    	char value[MAX_LONG_MSG_SIZE] = "0x";
    	int j = 0;
     
    	/*TODO TRAITEMENT de la donnée ASCII/HEXA
    	//lecture du fichier AHUYTOIUYOUY_2019 ou 0x11AE56FF0ABCDEF0
    	vérifier les deux premiers caractères de la data sont 0x ou != 0x
    	si 0x il 2 par 2 les caractères et faire un printf pour le passer en Ascii
    	ex : 0x53414C5554 -> SALUT*/
     
    	if ('0' == StrTexte[0] && 'x' == StrTexte[1]) { // hexadécimal
    		for (int i = 2; i <= * o_iNbDatas; i = i) {
    			//value = "0x" + StrTexte[i] + StrTexte[i + 1];
    			strcat(value, StrTexte[1]);
    			strcat(value, StrTexte[2]);
    			StrTexte1[j] = printf("%x", value);
    			i += 2;
    			j++;
                    }
    	} else { //ASCII
    		StrTexte1 = StrTexte;
    		break;
    	}
     
     
    	return(0);
    }
    Erreur :
    - l.20 Type error in argument 2 to 'strcat':found 'char' expected 'pointer to const char'
    - l.21 Type error in argument 2 to 'strcat':found 'char' expected 'pointer to const char'
    - l.27 Lvalue required
    - l.27 Illegal statement

    Pourrez vous m'aider à démêler le vrai du faux ?

    Cordialement
    Bastien M
    Dernière modification par LittleWhite ; 17/04/2019 à 11h02. Motif: Titre précis

  2. #2
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    Hello,

    Comme le dit si bien la fonction strcat, string concatenate : concatène des chaines de caractères et non des caractères.
    StrTexte[1] est un caractère et non une chaîne.
    Si tu veux concaténer deux caractères, tu dois d'abord la transformer en chaine.
    Ton caractère 'x' doit devenir "x" i.e

    ou
    Seulement là tu pourras utiliser strcat.

    De plus selon le man de strcat http://manpagesfr.free.fr/man/man3/strcat.3.html, strcat renvoie une chaine de caractères or tu ne stockes nul part le résultat de la concaténation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    strcat(value, StrTexte[1]);
    strcat(value, StrTexte[2]);
    Si tu retourne 0 autant déclarer ta fonction en void.

    Ca, ça ne marche pas, il faut copier le contenu de StrTexte dans StrTexte1 caractère par caractère. Tu ne peux pas juste écrire StrA = StrB pour que StrA vaille Strb.
    Il faut déjà s'assurer que StrTexte1 est suffisament grand pour accueillir StrTexte puis faire une boucle for par exemple si les conditions sont réunies pour effectuer la copie.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    StrTexte1 = StrTexte;

    Je ne sais pas comment on vous apprend à indenter à l'école mais franchement c'est infecte. C'est illisible au possible.

    T'as le code en entier sinon ?
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  3. #3
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    De plus selon le man de strcat http://manpagesfr.free.fr/man/man3/strcat.3.html, strcat renvoie une chaine de caractères or tu ne stockes nul part le résultat de la concaténation.
    strcat modifie le buffer en place et retourne son premier argument, il est très courant de ne pas s'en soucier.

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par darkwall_37 Voir le message
    Je ne sais pas comment on vous apprend à indenter à l'école mais franchement c'est infect. C'est illisible au possible.
    Absolument pas !!!
    Pour une fois qu'un PO nous pose un code indenté correctement (tu devrais te promener dans ce forum pour voir ce que j'y ai déjà vu => exemple, exemple, exemple).
    Autant quand un code est mal indenté je suis le premier à gueuler, autant ici il n'y a rien à dire. Toutes les lignes sont indentées de la même façon. Les lignes de la fonction sont indentées à un niveau, et toutes les lignes des blocs internes sont toutes indentées à l'identique et selon la profondeur du bloc. Et je suis presque sûr que c'est comme ça que sortirait un code passé par le programme "indent". Sincèrement je ne vois pas ce que tu reproches à cette indentation...

    Il y a juste ce break dans le else que je ne m'explique pas (on n'est pas dans une boucle quoi et normalement le compilo aurait du gueuler à ce niveau donc on peut éventuellement reprocher au PO de nous fournir un code qui ne compile pas), ces parenthèses inutiles au return (ce n'est pas une fonction) et cette décoration un peu étonnante "//-----------------------------------------------------------------------------" autour du nom de fonction qui n'est pas du plus bel effet et qui tombe plutôt comme un cheveu dans la soupe (en fait celle du haut seule suffirait) mais ça n'a rien à voir avec l'indentation...

    En ce qui concerne les erreurs, en plus de ce qui a été dit, il y a ce StrTexte1 = StrTexte qui n'est pas bon (on ne copie pas un tableau dans un autre de cette façon).
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  5. #5
    Membre confirmé
    Homme Profil pro
    amateur
    Inscrit en
    Octobre 2007
    Messages
    731
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : amateur

    Informations forums :
    Inscription : Octobre 2007
    Messages : 731
    Points : 460
    Points
    460
    Par défaut
    C'est un avis personnel donc n'engage que moi mais je trouve ça parfaitement illisible d'indenter de la sorte.
    UNE REPONSE UTILE : &|| UN PROBLEME RESOLU :

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 685
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 685
    Points : 30 974
    Points
    30 974
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par darkwall_37 Voir le message
    mais je trouve ça parfaitement illisible d'indenter de la sorte.
    Et tu ne voudrais pas nous montrer de quelle sorte toi tu aurais indenté ?
    Accessoirement j'avais raison. Le programme "indent", avec l'option "-linux", indente quasiment de la même façon (ci-dessous)
    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    //-----------------------------------------------------------------------------
    int ascii_hexa()
    //-----------------------------------------------------------------------------
    {
    	char StrTexte[MAX_LONG_MSG_SIZE] =
    	    "0123456789BCDEFGHIJKLMNOPQRSTUVWXYZ";
    	//char  StrTexte[MAX_LONG_MSG_SIZE] = "0x3031323334353637383941424344454647484944B4C4D4E4F505152535455565758595";
    	char StrTexte1[MAX_LONG_MSG_SIZE];
    	char value[MAX_LONG_MSG_SIZE] = "0x";
    	int j = 0;
     
    	/*TODO TRAITEMENT de la donnée ASCII/HEXA
    	   //lecture du fichier AHUYTOIUYOUY_2019 ou 0x11AE56FF0ABCDEF0
    	   vérifier les deux premiers caractères de la data sont 0x ou != 0x
    	   si 0x il 2 par 2 les caractères et faire un printf pour le passer en Ascii
    	   ex : 0x53414C5554 -> SALUT */
     
    	if ('0' == StrTexte[0] && 'x' == StrTexte[1]) {	// hexadécimal
    		for (int i = 2; i <= *o_iNbDatas; i = i) {
    			//value = "0x" + StrTexte[i] + StrTexte[i + 1];
    			strcat(value, StrTexte[1]);
    			strcat(value, StrTexte[2]);
    			StrTexte1[j] = printf("%x", value);
    			i += 2;
    			j++;
    		}
    	} else {		//ASCII
    		StrTexte1 = StrTexte;
    		break;
    	}
     
    	return (0);
    }
    Les différences sont minimes (des tabulations devant les commentaires, un espace après le "return", pas d'espace entre le nom de la fonction et les parenthèses) et rien qui concerne l'indentation...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec strcat
    Par talapoga dans le forum Débuter
    Réponses: 2
    Dernier message: 10/04/2015, 13h46
  2. Problème concaténation strcat
    Par jems87 dans le forum Débuter
    Réponses: 9
    Dernier message: 23/10/2009, 11h42
  3. Problème avec strcat
    Par choupinette116 dans le forum Débuter
    Réponses: 5
    Dernier message: 21/04/2008, 17h42
  4. Problème avec la fonction strcat
    Par saddamtohmto dans le forum MATLAB
    Réponses: 10
    Dernier message: 18/07/2007, 07h57
  5. Problème avec la fonction Strcat
    Par totoc1001 dans le forum MATLAB
    Réponses: 6
    Dernier message: 29/01/2007, 21h34

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo