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

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    mai 2017
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : mai 2017
    Messages : 20
    Points : 22
    Points
    22

    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

  2. #2
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    octobre 2007
    Messages
    704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : octobre 2007
    Messages : 704
    Points : 456
    Points
    456

    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 420
    Détails du profil
    Informations forums :
    Inscription : mars 2005
    Messages : 1 420
    Points : 4 151
    Points
    4 151

    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
    6 973
    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 : 6 973
    Points : 19 801
    Points
    19 801
    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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

  5. #5
    Membre confirmé
    Homme Profil pro
    Etudiant administrateur systèmes et réseaux
    Inscrit en
    octobre 2007
    Messages
    704
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Etudiant administrateur systèmes et réseaux

    Informations forums :
    Inscription : octobre 2007
    Messages : 704
    Points : 456
    Points
    456

    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
    6 973
    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 : 6 973
    Points : 19 801
    Points
    19 801
    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 «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site

+ 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