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 :

Déclarer le contenu d'un tableau comme char


Sujet :

C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 77
    Par défaut Déclarer le contenu d'un tableau comme char
    Bonjour à tous,

    J'ai un petit problème concernant les tableaux et les caractères. Je m'explique.
    Je souhaite déclarer un tableau, dans lequel sont stockés des caractères.

    J'ai donc déclarer mon tableau comme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {1, 4, A};
    Mais cela genère une erreur --> error C2065: 'A' : undeclared identifier
    Le A n'es pas considéré comme un caractère.

    Il faut que je remanipule mon code de la sorte pour qu'il marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {'1', '4', 'A'};
    Hors le problème, c'est que les données contenue dans le tableau vont être lue d'un fichier, et écrite dans le tableau de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {1, 4, A, 7, D, ...}
    Et il possible d'indiquer que le tableau stock bien des caractère, auquel cas en y écrivant un A il comprendrais que c'est bien un caractère et ne me genererait plus l'erreur, ou faut-il que je trouve un quelconque moyen de recopier le tableau en ajoutant les ' ' à chaque caractère pour indiquer que se sont bien des caractères ??

    Merci d'avance pour votre aide.

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 77
    Par défaut
    J'ai aussi pensé à déclarer le tableau en long et faire un static_cast derrière mais cela ne change rien du tout.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    long ReadData[256] = {1, 4, A};
    static_cast<char>(ReadData[i]);

  3. #3
    Membre expérimenté

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    171
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Juin 2005
    Messages : 171
    Par défaut
    Salut,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    char ReadData[256] = {1, 4, A};
    Quand tu écris ça tu déclares un tableau qui va contenir les caractères suivant :
    - Le caractère qui a pour code ASCII : 1
    - Le caractère qui a pour code ASCII : 4
    - Le caractère qui est dans la variable A (qui n'existe pas a priori)

    Je ne pense pas que c'est ce que tu recherche.

    Pour affecter un caractère à une variable avec un litteral il faut que ce dernier soit entouré de ' ' :
    Le caractère qui représente 1 s'écrit '1'
    Le caractère qui représente 4 s'écrit '4'
    Le caractère qui représente A s'écrit 'A'

  4. #4
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    avant toute chose, si tu peux utiliser la classe string de la bibliothèque standard à la place de cet horrible tableau de char, ce serait infiniment mieux.

  5. #5
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Ton problème à plus l'air de se situer à la lecture du fichier. Fais voir les lignes qui s'occupent de cette lecture stp.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 77
    Par défaut
    Concernant les lignes de lecture du fichier, je ne m'en suis pas encore occupé.

    Mais je sais que je vais lire un 1, et que je dois me débrouiller pour que le tableau comprenne que c'est un '1' que je veux,

    D'ailleur si quelqu'un peut m'expliquer comment on fais pour lire un fichier, je sais ne sais pas trop comment on s'y prend.

    Je veux lire un fichier Reference.bin (qui contient par exemple 137B4DF962), je recupere ce contenu, je le range dans un tableau en indiquant que je veux que le 1 soit un caractère, le 3 aussi, le 7 aussi etc .. Et à partir de la j'affiche le code héxa de se caractère avec

    Pour l'instant, mon code complet donne cela :

    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
    #include <iostream>
    using namespace std;
     
    int main(void){
     
    	int i = 0;
    	int var = 0;
    	long size = 3;
     
    	char ReadData[256] = {1, 4, A};
     
    	for (i = 0; i < size; i++){
    		var = ReadData[i];
    		printf("%x", var);
    	}
     
    	return 0;
    }
    Sans compter que la ca ne marche pas à cause du A dans le tableau ^^

    Le size aura après pour valeur la longeur de la donnée que je récupère (par exemple 10 si je lis 137B4DF962).
    Et dans le tableau seront rangés 137B4DF962. Et j'aurais en affichage :
    31333742344446393632 (le code Hexa de chaque caractère).

  7. #7
    r0d
    r0d est déconnecté
    Membre expérimenté

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 290
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 290
    Billets dans le blog
    2
    Par défaut
    les tableaux de char c'est du C.
    printf c'est du C.
    On est sur un forum c++.

    Pour la lecture de fichier, tout est dans la FAQ C++ (dans le chapitre sur les flux). Tu devrais d'ailleurs commencer par ça (lire ton fichier dans une string, et les questions que tu te poses maintenant se résolueront comme par magie).

  8. #8
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Outre la remarque pleine de bon sens de rOd, quelque chose m'échappe :
    Si tu lis des char dans ton fichier et que tu les mes dans un tableau de char, celui ci contiendra bien :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    printf(ReadData[0],%c); //dans la console : 1
    printf(ReadData[1],%c); //dans la console : 4
    printf(ReadData[2],%c); //dans la console : A
    si ton fichier est de la sorte:

  9. #9
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 77
    Par défaut
    C'est peut être du C, mais je code en C++, et bien que se soit du C ca marche en C++ aussi. Je vais aller lire la FAQ, merci.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 77
    Par défaut
    Mon fichier d'entrée est bien de la sorte : 1687B2CD4A

    Je n'affiche pas le contenu du tableau, je veux afficher le code Hexa du contenu du tableau, c'est à dire afficher 31 si 1 est stocké dans le tableau, affiché 41 si A est stocké, etc ..

    J'ai donc besoin pour cela que mon tableau comprenne qu'il stock des caractères, mais sans devoir écrire 'A'.
    J'ai besoin que le tableau comprenne que le A qu'il stock veut en fait dire 'A', car lors de la lecture de mon fichier, il viendra lire un A et non un 'A', et il va donc écrire A dans le tableau, pas 'A'.

    Hors si il ne comprend pas que le A est en fait un 'A', il me genère une erreur, et mon programme ne marche pas.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 99
    Par défaut
    Avec tout mon respect, tu as un problème de compréhension (ou c'est moi qui n'est rien compris à ton post ce que je n'exclus pas ).

    'A' est une représentation, ce que tu lis du fichier ce n'est pas 'A' mais une valeur décimale, 65 dans le cas présent. Après, libre à toi de réprésenter 65 comme 'A' ou 41h ou 101...

    Si ton fichier contient "1687B2CD4A", tu lis ton fichier comme une suite d'octet => 49, 54, 56, 55,...

    Après tu représentes ces valeurs comme tu veux
    en ascii => 1 6 ...
    en hexa => 31 36 ...
    en octal => 061 066 ...
    en binaire => 00110001 00110110 ...
    ou autre => # / ...

    Désolé si j'ai mal compris.

    Pascal

  12. #12
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par Versace31 Voir le message
    C'est peut être du C, mais je code en C++, et bien que se soit du C ca marche en C++ aussi. Je vais aller lire la FAQ, merci.
    Cela marche en C++, mais, comme tu le dis si bien "tu code en C++"...

    Dés lors, autant prendre directement (ou en tout cas, le plus vite possible) les bonnes habitudes du C++.

    Parmi celles-ci, la principale est sans doute:
    Evite les possibilités issues du C si une alternative - qui sera souvent bien plus sécurisante à tous points de vue - existe en C++
    Pour le problème que tu pose, nous pouvons citer les alternatives suivantes:
    • la classe string en lieu et place d'un tableau de caractères "C style"
    • la classe vector de manière générale en lieu et place des tableaux dynamiques "C style"
    • les classes *fstream (ifstream si tu veux lire, ofstream si tu veux écrire) pour l'accès aux fichiers
    • les classes *stringstream (istringstream, ostringstream et stringstream) pour tout ce qui est conversion d'objet de ou vers les chaines de caractères
    • les classes cin et cout pour la saisie sur l'entrée standard (typiquement le clavier) ou l'affichage sur la sortie standard (typiquement la console) en lieu et place de scanf (surtout cette fonction honnie en C) ou printf.

    Toutes ces classes se trouvent dans l'espace de noms std (comme tout ce qui est fourni par le standard), et nécessitent respectivement l'inclusion des fichiers d'en-tête <string>, <vector>, <fstream>, <sstream> ou <iostream>

    Comme Rûd l'a si bien fait remarquer, tes problèmes se résoudront d'eux-même.

    Mieux encore: le temps que tu aura "perdu" (et on peut vraiment y mettre de très gros guillemets) à t'habituer à ces différentes classes t'en fera gagner énormément tout au long de ta carrière ... C'est un investissement qui vaut la peine
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  13. #13
    Membre éclairé Avatar de befalimpertinent
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    561
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Gironde (Aquitaine)

    Informations forums :
    Inscription : Avril 2007
    Messages : 561
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Dés lors, autant prendre directement (ou en tout cas, le plus vite possible) les bonnes habitudes du C++.
    D'accord avec ça. Même si dans la pratique il arrive fréquemment de se retrouver confronter à du code C-style et à devoir mettre les mains dans le camboui (char *, cast à la C, printf, ...) et de ne pas avoir le choix de tout réécrire.
    Et donc il peut quand même être pédagogique de parvenir à une solution fiable en C tout en ayant connaissance de l'équivalent c++

  14. #14
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Citation Envoyé par befalimpertinent Voir le message
    D'accord avec ça. Même si dans la pratique il arrive fréquemment de se retrouver confronter à du code C-style et à devoir mettre les mains dans le camboui (char *, cast à la C, printf, ...) et de ne pas avoir le choix de tout réécrire.
    Et donc il peut quand même être pédagogique de parvenir à une solution fiable en C tout en ayant connaissance de l'équivalent c++
    En toute confidence, quitte à mettre les mains dans le cambouis, je préfère souvent modifier le code pour qu'il soit écrit en C++ "pur"

    En outre, il y a une différence entre apprendre à quelqu'un qu'il est possible qu'il rencontre du code "C like" et lui laisser utiliser cette manière honteuse de coder impunément

    [TRES HS]A l'époque, mon père avait écrit un script qui vérifiait, sur un système ou il était possible de garder de nombreuses versions concurrentes d'un même fichier, un script qui testait la lisibilité des codes, et qui supprimait sans ménagement ceux qui n'obtenaient pas la "moyenne"...

    Il m'a assuré que, quand un de ses collaborateurs se faisait avoir à devoir réécrire ce qu'il avait passé deux heures à écrire comme un cochon une fois, on ne l'y reprenait plus par la suite

    Il faut aussi dire que, quand j'ai osé dire à mon père que mon langage de prédilection est le C++ il s'est écriré
    Citation Envoyé par mon père
    Pouahhh... qu'elle horreur, c'est write once, read never
    C'est sans doute pour cela que mon point de vue sur la question est quelque peu "tranché": j'aime bien quand un code s'arrange respecter au mieux les possibilités du C++ en restant lisible et portable
    [EDIT]mon père ne m'a jamais précisé de combien de dépressions il avait été la cause
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  15. #15
    Membre éclairé Avatar de cynique
    Profil pro
    Inscrit en
    Septembre 2007
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2007
    Messages : 60
    Par défaut
    Citation Envoyé par Versace31 Voir le message
    Bonjour à tous,

    J'ai un petit problème concernant les tableaux et les caractères. Je m'explique.
    Je souhaite déclarer un tableau, dans lequel sont stockés des caractères.

    J'ai donc déclarer mon tableau comme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {1, 4, A};
    Mais cela genère une erreur --> error C2065: 'A' : undeclared identifier
    Le A n'es pas considéré comme un caractère.

    Il faut que je remanipule mon code de la sorte pour qu'il marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {'1', '4', 'A'};
    Hors le problème, c'est que les données contenue dans le tableau vont être lue d'un fichier, et écrite dans le tableau de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char ReadData[256] = {1, 4, A, 7, D, ...}
    Et il possible d'indiquer que le tableau stock bien des caractère, auquel cas en y écrivant un A il comprendrais que c'est bien un caractère et ne me genererait plus l'erreur, ou faut-il que je trouve un quelconque moyen de recopier le tableau en ajoutant les ' ' à chaque caractère pour indiquer que se sont bien des caractères ??

    Merci d'avance pour votre aide.

    Dis-moi: tu utilise un logiciel pour écrire ton code avec let tableau "ReadData[]"?

    Si oui, je ne comprends pas le problème. Ce logiciel peut ajouter les ' autour des caractères.

    Tu peut aussi écrire:

    char ReadData[256] = "14A6B...";

    En ce cas, le compilateur traitera tous les caractères du fichier comme caractères. Si tu écris:

    char ReadData[256] = { 1, 4, 'A' ... };

    ReadData[0] sera le petit entier 1. Ce n'est pas '1' du tout. '1' != 1.

Discussions similaires

  1. Réponses: 19
    Dernier message: 01/12/2012, 18h56
  2. Réponses: 7
    Dernier message: 03/08/2011, 22h49
  3. Ansistring et tableau de char
    Par rabbi_jaccob dans le forum C++Builder
    Réponses: 2
    Dernier message: 24/12/2004, 11h51
  4. Adresse d'un tableau de char
    Par Trap D dans le forum C
    Réponses: 8
    Dernier message: 23/12/2003, 12h02
  5. Réponses: 4
    Dernier message: 10/10/2003, 18h04

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