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 :

TYPEDEF d'un tableau sur un octet


Sujet :

C

  1. #1
    Membre à l'essai
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    octobre 2017
    Messages
    21
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 20
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : octobre 2017
    Messages : 21
    Points : 11
    Points
    11
    Par défaut TYPEDEF d'un tableau sur un octet
    bonjour, tout d'abord merci de porter attention à ma question.
    Je sais qu'en langage C :

    #define sert à spécifier les macro/lettres i.e nom = valeurs
    typedef s'exprime de la manière suivante; typedef déclaration de variable.

    • j'ai importé la bibliothèque string avec #include<string.h>
    • j'ai défini lassets+1 et chaussures


    Or, je voudrais définir le type string comme un tableau de lassets+1 entiers sur 1 octet. sachant que j'ai auparavant défini lassets+1 avec le define. Donc j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char string[lassets+1]
    … mais je pense que ce n'est pas correct. Que devrais je écrire svp et pourquoi ?

    Par ailleurs, je voudrais définir le type tableau comme un tableau de chaussures de string, sachant que chaussures a été défini auparavant avec le defineIci, je n'ai aucune idée. Pouvez vous m'aider svp ?

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    septembre 2007
    Messages
    7 180
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : septembre 2007
    Messages : 7 180
    Points : 22 911
    Points
    22 911
    Par défaut
    Bonjour,

    Citation Envoyé par o2pubcy9 Voir le message
    #define sert à spécifier les macro/lettres i.e nom = valeurs
    En effet, mais c'est même un peu plus subtil : il s'agit d'une directive à l'intention du préprocesseur. C'est-à-dire que tes macros seront développées puis substituées à la volée par leur résultat pour former un nouveau code source (temporaire) qui, LUI, sera traité par le compilateur. À ce stade, ce dernier n'aura plus aucune notion de tout ce qui commence par « # ». Il ne pourra pas savoir si la valeur qu'il traite est le fruit d'une macro ou si elle a directement été écrite comme ça par le programmeur.

    typedef s'exprime de la manière suivante; typedef déclaration de variable.
    Oui, là aussi, ça demande précision : « typedef » (pour Type Definition) crée un alias sur un nom de type lorsqu'il est un peu trop long et/ou compliqué pour être utilisé directement. Et la syntaxe de typedef est exactement celle de la déclaration d'une variable (même grammaire). Ainsi, lorsque l'on écrit typedef int entier, c'est « entier » qui est l'alias et « int » le type initial. C'est le contraire de ce que l'on ferait avec une macro #define, en particulier. Cela prend même tout son sens lorsque c'est un pointeur de fonction ou de tableau que l'on déclare, car il faut alors le décorer des deux côtés. Par exemple : typedef int (mon_pointeur) (void);Par contre, ça ne veut pas dire que l'on déclare une variable à ce moment-là.

    [LIST]j'ai importé la bibliothèque string avec #include<string.h>
    Pas tout-à-fait. Contrairement à d'autres langages qui utilisent des mots-clés similaires, #include n'importe pas de bibliothèque ou de module. #include sert simplement à insérer à l'endroit où il est appelé le contenu d'un fichier — quel qu'il soit — avant de reprendre le cours du code source principal.

    On s'en sert alors majoritairement pour inclure un fichier qui ne contient que les prototypes et entêtes (headers, d'où *.h) d'une bibliothèque tierce. Comme ton compilateur sait alors comment les appeler, il n'a pas besoin de disposer de la bibliothèque proprement dite pour générer du code qui l'utilise. Il lui suffit de construire les bons appels. La liaison entre ton programme et la bibliothèque qu'il est censé utiliser se fait alors a poseriori, après la compilation, par l'éditeur de liens (linker).

    j'ai défini lassets+1 et chaussures
    J'ai mis un peu de temps à comprendre, mais en réalité, le mot « lacet » s'écrit avec un « c ». C'est important parce que « assets » (sans « l ») a une signification différente en anglais.

    Or, je voudrais définir le type string comme un tableau de lassets+1 entiers sur 1 octet. sachant que j'ai auparavant défini lassets+1 avec le define.
    Ce n'est peut-être pas une très bonne idée d'avoir choisi « string » comme nom de type car il est probable qu'il soit déjà réservé par la bibliothèque que tu utilises. Mais ça reste syntaxiquement correct.

    Donc j'ai écrit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char string[lassets+1]
    … mais je pense que ce n'est pas correct. Que devrais je écrire svp et pourquoi ?
    La bonne nouvelle est que la syntaxe est correcte, surtout au regard de ce que l'on a exposé ci-dessus, et ce n'était pas facile.

    La mauvaise est que tu ne peux pas spécifier une taille explicite dans un type, car un tableau n'est pas un objet instancié et managé (avec méta-données sous-jacentes et nettoyage automatique). En C, le type proprement dit est un char et les crochets qui le suivent sont une manière de l'indexer par rapport à son adresse de base.

    Tu peux (et tu dois) tout-à-fait indiquer une taille à un tableau quand tu l'instancies en tant de variable mais cela ne vaut pas définition de type. Rien ne t'empêche, d'ailleurs de dépasser avec ton index la taille initiale indiquée, ce qui conduit à faire l'expérience des buffer overflows.

    Il y a une seule exception (partielle) à ce principe : le cas où tu déclare un tableau dans une structure. Mais je ne développerai pas ce cas aujourd'hui.

    Par ailleurs, je voudrais définir le type tableau comme un tableau de chaussures de string, sachant que chaussures a été défini auparavant avec le defineIci, je n'ai aucune idée. Pouvez vous m'aider svp ?
    Si chaussures est un type valide (quelle que soit la manière dont il a été déclaré), alors il faut écrire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef chaussures tableau[];
    … mais il y a peu de chances que ce soit vraiment ce que tu comptes faire.

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    février 2006
    Messages
    7 683
    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 : 7 683
    Points : 21 851
    Points
    21 851
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par o2pubcy9 Voir le message
    #define sert à spécifier les macro/lettres i.e nom = valeurs
    Exact. Toutefois la syntaxe n'est pas nom=valeur mais #define nom valeur. De plus l'usage est de les écrire en majuscules pour ne pas confondre une macro et une variable => #define NOM valeur. Et enfin un autre usage est d'y mettre des parenthèses. Ce n'est pas obligatoire dans ce cas précis mais ça peut l'être dans d'autres cas donc à la fois pour des soucis d'homogénéïté d'écriture et à la fois pour éviter d'avoir à réfléchir, on les met tout le temps => #define NOM (valeur).

    Citation Envoyé par o2pubcy9 Voir le message
    typedef s'exprime de la manière suivante; typedef déclaration de variable.
    Non. Déjà on ne décrit pas le but d'un élément par sa syntaxe mais par son utilité. typedef sert à définit un nouveau type basé sur un type déjà existant. Le type déjà existant peut être assez complexe (une structure, un nom long comme "unsigned long int") donc définir un alias sur ce type (i.e. "ulong") permet une utilisation plus aisée. Ou bien permet un code évolutif (on définit "truc" comme "short int" puis on utilise "truc" et si demain la plage de valeurs change pour devenir "long" on ne modifie qu'une seule ligne du code).
    Et il s'exprime de la manière suivante: typedef type_existant nouveau_type. De plus souvent on y met un petit "t_" pour là aussi ne pas confondre "type" et "variable".

    Citation Envoyé par o2pubcy9 Voir le message
    j'ai importé la bibliothèque string avec #include<string.h>
    En fait tu n'as fait que déclarer les fonctions de cette bibliothèque (le compilateur exige qu'une fonction soit déclarée avant d'être utilisée). Les fonctions elles-mêmes (leur code) sont importées lors de l'édition des liens (le compilateur raccorde l'appel des fonction avec leur code situé dans un fichier ".so" ou ".a" qui contient justement le code compilé des fonctions)

    Citation Envoyé par o2pubcy9 Voir le message
    j'ai défini lassets+1 et chaussures
    Tu ne peux pas définir une opération. "lassets + 1" c'est un calcul, ça ne se définit pas. Je pense plutôt que tu as défini "lassets" à un "quelque chose + 1" => #define LASSETS (100 + 1) (et là les parenthèses sont vraiment obligatoires).

    Citation Envoyé par o2pubcy9 Voir le message
    Or, je voudrais définir le type string comme un tableau de lassets+1 entiers sur 1 octet. sachant que j'ai auparavant défini lassets+1 avec le define. Donc j'ai écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef char string[lassets+1]
    typedef char[LASSETS + 1] t_string en te souvenant que "LASSETS" contient déjà un "+1" ce qui fait que ta string contient maintenant 2 octets de plus. Donc là petit souci de conception (je comprends le "+1" pour le '\0' mais pas le "+1 +1"... ?).
    Donc généralement l'usage est de définir la "taille utile". Si un nom a besoin de 20 caractères, on définira "SIZE_NOM" à 20 et pas à 21. En revanche, ce qu'on écrira, ce sera char nom[SIZE_NOM + 1] car le "+1" est pour le C qui a besoin d'un octet en plus pour le '\0' et non pas pour le programmeur qui a besoin de caler son algorithme sur 20 caractères pour le nom (s'il veut par exemple gérer son affichage écran, il a besoin de travailler avec "20" et pas avec "21").

    Citation Envoyé par o2pubcy9 Voir le message
    et pourquoi ?
    Ben voilà.
    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

Discussions similaires

  1. envoyer un tableau sur le serveur
    Par car dans le forum ASP
    Réponses: 5
    Dernier message: 16/08/2005, 17h23
  2. [CR]Ne pas "couper" un tableau sur 2 pages
    Par neo.51 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 01/03/2005, 15h12
  3. [VB.NET] Conversion int-> bytes sur 4 octets
    Par SteelBox dans le forum Windows Forms
    Réponses: 11
    Dernier message: 09/01/2005, 23h08
  4. [CR8] Problème tableau sur plusieurs pages???
    Par christophe28 dans le forum SAP Crystal Reports
    Réponses: 5
    Dernier message: 02/11/2004, 16h46
  5. Existe-t'il un type tenant sur 2 octets ?
    Par benj63 dans le forum C++Builder
    Réponses: 13
    Dernier message: 20/06/2002, 18h03

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