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 :

Passer une classe c++ en c


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut Passer une classe c++ en c
    Bonjour a toutes et tous

    J'ai un problème donc je viens solliciter votre aide. Je bosse actuellement sur un programme rédigé en c++ que je dois passer en c. Dans l'ensemble je n'ai pas trop de problème sauf sur un point: je ne trouve pas l'équivalence d'une classe c++ en c (si cela existe). Donc avez-vous des idées à me suggérer ???

    La classe que je souhaite convertir en c est super simple, c'est pas une classe très étoffé (je vous mets le code en dessous). Tellement simple que beaucoup d'entre vous vont certainement me dire que j'en ai pas besoin, mais à priori cette classe est très importante dans le programme en c++ et j'aimerai garder la même "forme" entre mon programme c++ et sa conversion en c.

    tableau.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    class Tableau
    {
    public:
        Tableau(int const& taille);//: longueur(taille), elements(new char [taille]){}
     
        int longueur;
        char *elements;
    };
    tableau.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    #include "tableau.h"
    /*=========================================
     * Description : Création d'un tableau de char
     *=========================================*/
    Tableau::Tableau(int const& taille): longueur(taille), elements(new char [taille])
    {
     
    }

    Je vous mets aussi un exemple de son utilisation dans une fonction pour comprendre en quoi la classe est importante pour le programme
    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
    void sendTrameWriteModBus(char adrSlave, char CodeCommande, int adresseData, int nbrData, Tableau *tableau)
    {
        int variableLocale;
        qint64 nombreOctetsEcris;                                                   // variable de vérification pour l'écriture sur le port
        Tableau *bufferEmissionModBus = new Tableau((tableau->longueur * 2) + 9);   // + 9 car : 7 octets d'entêtes MODBUS, 2 octets de CRC
     
        bufferEmissionModBus->elements[0] = adrSlave;
        bufferEmissionModBus->elements[1] = CodeCommande;
        bufferEmissionModBus->elements[2] = adresseData / 256;
        bufferEmissionModBus->elements[3] = adresseData & 255;
        bufferEmissionModBus->elements[4] = nbrData / 256;
        bufferEmissionModBus->elements[5] = nbrData & 255;
        bufferEmissionModBus->elements[6] = nbrData * 2;
     
        variableLocale = 7;
        for(int i = 0; i < tableau->longueur; i++)
        {
            bufferEmissionModBus->elements[variableLocale] = tableau->elements[i] / 256;
            variableLocale++;
            bufferEmissionModBus->elements[variableLocale] = tableau->elements[i] & 255;
            variableLocale++;
        }
     
        addCRC16(bufferEmissionModBus,bufferEmissionModBus->longueur - 2);          // ajout du CRC sur les deux derniers octets du tableau 'bufferEmissionModBUS'
     
        nombreOctetsEcris = serialPort->write(bufferEmissionModBus->elements, bufferEmissionModBus->longueur);  // écriture sur le port série
    }

  2. #2
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Bonjour,

    Tu as réussi à passer le reste de ton projet mais pas cette classe ? Perso, je pense qu'une structure avec un tableau et une taille fera l'affaire. La fonction de création demande une petite boucle si tu veux dupliquer les éléments.

  3. #3
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    Question: est-ce que cette classe, dans l'utilisation qui en est faite peut être remplacer par un tableau classique en C du style char toto[8] par exemple parce que c'est ce que j'ai commencé à faire, j'obtiens ce résultat:
    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
    void sendTrameWriteModBus(char adrSlave, char CodeCommande, int adresseData, int nbrData, char tableau)
    {
    /*=========================================
     * Description : Formate la trame ModBus et envoi la trame creee
     *=========================================*/
        int variableLocale;
        long nombreOctetsEcris;                                                   // variable de vérification pour l'écriture sur le port
        char bufferEmissionModBus[(sizeof(tableau) * 2) + 9];   					// + 9 car : 7 octets d'entêtes MODBUS, 2 octets de CRC
     
        bufferEmissionModBus[0] = adrSlave;
        bufferEmissionModBus[1] = CodeCommande;
        bufferEmissionModBus[2] = adresseData / 256;
        bufferEmissionModBus[3] = adresseData & 255;
        bufferEmissionModBus[4] = nbrData / 256;
        bufferEmissionModBus[5] = nbrData & 255;
        bufferEmissionModBus[6] = nbrData * 2;
     
        variableLocale = 7;
        for(int i = 0; i < sizeof(tableau); i++)
        {
            bufferEmissionModBus[variableLocale] = tableau[i] / 256;
            variableLocale++;
            bufferEmissionModBus[variableLocale] = tableau[i] & 255;
            variableLocale++;
        }
     
        addCRC16(bufferEmissionModBus,sizeof(bufferEmissionModBus) - 2);          // ajout du CRC sur les deux derniers octets du tableau 'bufferEmissionModBUS'
     
        nombreOctetsEcris = write(bufferEmissionModBus, sizeof(bufferEmissionModBus));  // écriture sur le port série
    }
    Mais je ne sais pas si cela peut être viable

  4. #4
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Par défaut
    Bonjour,

    Comme le dit Bktero, c'est une structure qu'il faut que tu utilises, pas un "simple tableau". Et c'est ta structure qui contiendra un entier pour longueur et un pointeur pour elements (attention a bien penser a allouer la zone memoire).
    "La route est longue, mais le chemin est libre" -- https://framasoft.org/
    Les règles du forum

  5. #5
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    donc un truc du style:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct tableau
    {
         int longueur
         char *elements
    }

  6. #6
    Membre expérimenté Avatar de ManusDei
    Homme Profil pro
    vilain troll de l'UE
    Inscrit en
    Février 2010
    Messages
    1 624
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : vilain troll de l'UE

    Informations forums :
    Inscription : Février 2010
    Messages : 1 624
    Par défaut
    Oui.

  7. #7
    Membre chevronné
    Inscrit en
    Décembre 2010
    Messages
    290
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 290
    Par défaut
    Il est pas beau ce code C++ ....

    Je crois même que j'ai repéré une fuite mémoire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Tableau *bufferEmissionModBus = new Tableau((tableau->longueur * 2) + 9);   // + 9 car : 7 octets d'entêtes MODBUS, 2 octets de CRC
    Je vois pas où pourrait se trouver le delete qui correspond à ce new.

    Comme dit Bktero, tu peux utiliser un tableau et une longueur, ça suffira.

    Toutefois, un conseil, en ModBus on manipule des mots de 16 bits, donc perso plutôt que de manipuler un bête tableau de chars, je manipulerais un tableau de shorts.
    Cela devrait simplifier l'écriture de l'adresse et de la taille (avec un byte-swap si nécessaire).
    Mais bon je connais pas les autres contraintes.

  8. #8
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    Citation Envoyé par Bktero Voir le message
    Bonjour,

    Tu as réussi à passer le reste de ton projet mais pas cette classe ? Perso, je pense qu'une structure avec un tableau et une taille fera l'affaire. La fonction de création demande une petite boucle si tu veux dupliquer les éléments.
    Par contre j'ai pas trop compris l'histoire de la boucle pour la duplication, est-ce que l'on peut m'expliquer svp

  9. #9
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    En C, tu ne peux pas copier des tableaux avec l'opérateur =. Tu dois donc faire une boucle (ou utiliser memcpy d'ailleurs ). En fait, j'ai lu un peu vite et j'ai cru que tu avais un constructeur par copie mais ce ne semble pas être le cas.

    Si on manipule des données de 16 bits, autant utiliser (u)int16_t que short, histoire d'être totalement certain de la portabilité et parce que ça indique clairement qu'on souhaite exactement 16 bits.

  10. #10
    Membre éclairé

    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2011
    Messages
    532
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2011
    Messages : 532
    Par défaut
    autre question: dans ma fonction sendTrameWriteModBus, je passe en paramètre un tableau. Du coup quand je défini ma fonction est-ce cela marche ainsi avec les structure:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sendTrameWriteModBus(char adrSlave, char CodeCommande, int adresseData, int nbrData, struct tableau)
    ?

  11. #11
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sendTrameWriteModBus(char adrSlave, char CodeCommande, int adresseData, int nbrData, struct tableau unTableau)
    Ton écriture est valable lors d'une déclaration (prototype sans corps de fonction) mais lors de la définition (avec le corps de la fonction), il te faut donner un nom au paramètre de type struct tableau.

Discussions similaires

  1. Réponses: 7
    Dernier message: 03/03/2008, 11h17
  2. [POO] php5 : passer une classe en objet session
    Par dridri dans le forum Langage
    Réponses: 1
    Dernier message: 18/02/2008, 16h19
  3. Passer une classe en parametre
    Par kitiara999 dans le forum Langage
    Réponses: 2
    Dernier message: 24/03/2006, 14h06
  4. [Débutant]Passer une classe abstraite en paramètre
    Par Invité dans le forum Débuter
    Réponses: 2
    Dernier message: 06/01/2006, 17h56
  5. Passer une classe en paramètre
    Par Tex-Twil dans le forum C++
    Réponses: 17
    Dernier message: 30/11/2005, 20h00

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