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

Delphi Discussion :

C vers Delphi et type CHAR


Sujet :

Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Par défaut C vers Delphi et type CHAR
    Bonjour à tous,

    Je suis un peu perdu dans la mise en place d'une fonction dans Delphi qui est basé sur du C à l'origine. La fonction à l'origine est celle ci-dessous :

    Code c : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Cnt_manage (
    unsigned short	session
    char	civilite[3]
    char	nom[35]
    short*	status
    unsigned short*	error_num
    )

    Les informations sur les variables sont les suivantes :

    ENTREE :
    session

    SORTIE :
    civilite : tableau de 2 caractères
    nom : tableau de 35 caractères
    status : entier court (16 bits)
    error_num : entier court (16 bits) non signé
    en Delphi, en me basant sur ce que j'ai pu lire, j'ai appliqué les valeurs suivantes :

    Variables en sortie : (pas de souci en entrée)
    appli_civilite: PAnsiChar;
    appli_nom: PAnsiString;
    appli_status: word;
    appli_error: word;
    mais je n'arrive pas du tout à lire les valeurs civilité et nom donc je soupçonne que ma définition n'est pas bonne mais je vois pas laquelle utiliser ?
    => si je la lis en tant que text, le retour est toujours vide

    Merci à vous

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    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
     
    (*
    Cnt_manage (
    unsigned short	session
    char	civilite[3]
    char	nom[35]
    short*	status
    unsigned short*	error_num
    )
    *)
    type
      TCivilite = array[0..2] of Char; // ou AnsiChar selon l'API
      TNom = array[0..34] of Char; // ou AnsiChar selon l'API
     
    procedure Cnt_manage(session: Word; var civilite: TCivilite; var nom: TNom; var status: Word; var error_nim: Word);
    il est aussi possible d'utiliser des PWord au lieu de "var ... Word" afin de pouvoir passer "nil" au besoin
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    type
      TCivilite = array[0..2] of Char; // ou AnsiChar selon l'API
      TNom = array[0..34] of Char; // ou AnsiChar selon l'API
    .
    C'est parfait, je voyais pas cela aussi simple alors que j'avais travaillé sur cette idée aussi du array of char ;-)
    Et en effet, il est nécessaire de mettre Ansichar pour avoir le bon encodage.

    Grand merci à toi

  4. #4
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    /HS

    Pourquoi dans ta structure tu as 2 pointeurs, mais
    • des pointeurs sur 1 statut et 1 code erreur ce sont censé être des codes (en gros des valeurs énumérées) et non pas des données dynamiques
    • des pointeurs sur des valeurs de types inférieurs à 32/ 64 bits et d'autant + des types entier (ici short) génère 1 perte de place (pointeur 32 ou 64 bits + la valeur pointée qui peut être alignée)

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 72
    Par défaut
    Citation Envoyé par foetus Voir le message
    /HS

    Pourquoi dans ta structure tu as 2 pointeurs, mais
    • des pointeurs sur 1 statut et 1 code erreur ce sont censé être des codes (en gros des valeurs énumérées) et non pas des données dynamiques
    • des pointeurs sur des valeurs de types inférieurs à 32/ 64 bits et d'autant + des types entier (ici short) génère 1 perte de place (pointeur 32 ou 64 bits + la valeur pointée qui peut être alignée)
    Je suis preneur de toute amélioration !
    Tu remplacerais par quoi ?

  6. #6
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    Citation Envoyé par foetus Voir le message
    /HS

    Pourquoi dans ta structure tu as 2 pointeurs, mais
    • des pointeurs sur 1 statut et 1 code erreur ce sont censé être des codes (en gros des valeurs énumérées) et non pas des données dynamiques
    • des pointeurs sur des valeurs de types inférieurs à 32/ 64 bits et d'autant + des types entier (ici short) génère 1 perte de place (pointeur 32 ou 64 bits + la valeur pointée qui peut être alignée)
    car ce sont des valeurs reçues et non envoyées...en Pascal on peut utiliser le mot clé VAR (ou OUT) mais il n'existe pas en C
    et comme je le disais, si la fonction accepte que le paramètre ne soit pas transmis (et donc à nil) on peut passer par un PWord
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  7. #7
    Expert confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 772
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 772
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    car ce sont des valeurs reçues et non envoyées...en Pascal on peut utiliser le mot clé VAR (ou OUT) mais il n'existe pas en C
    Effectivement tu as raison mais il y a confusion entre passage de paramètres (entrée, sortie, entrée et sortie) et stockage dans 1 structure.

    Parce que si tu appelles 1 fonction et que tu veux modifier 1 paramètre, en C, il faut avoir 1 pointeur (et transmettre l'adresse d'1 variable) ... + éventuellement 1 booléen pour dire si cette fonction s'est déroulée correctement ou pas (et donc savoir si les paramètres retour erreur ont des valeurs valides)

    Mais des pointeurs dans 1 structure pour 1 statut et 1 code erreur
    Il faudrait voir le code, mais je pense que ces 2 champs n'ont rien à faire dans cette structure. Tu as des données de connexion avec 1 id, 1 nom et 1 civilité seulement.
    Et que tu transmets par pointeur pour être rempli (pour initialiser, en cas de connexion, en cas de déconnexion, ...) et qu'à chaque fois, tu as des données qui accompagnent pour le déroulement de la fonction (c'est du classique en C)

    Et que si tu veux quand même avoir ces 2 valeurs dans ta structure, tu rajoutes 1 ou 2 valeurs pour "pas d'erreur" et/ ou "non initialisé" en + des autres valeurs ... au lieu de NULL ou d'1 pointeur valide.
    Parce que ta structure est déjà transmise par pointeur pour être modifiée, donc ce n'est pas la peine d'avoir des champs pointeur pour des données non dynamiques.

    Dans la signature de ton constructeur Cnt_manage, tu peux donc modifier ta civilité et ton nom (parce que ce sont des tableaux et donc, je pense comme en C, des pointeurs) et ton statut et ton code erreur (parce que ce sont des paramètres sortie avec le mot clef var) ... mais pas ton identifiant de session.
    C'est bizarre ... après c'est sûrement 1 exemple pour montrer le "concept"

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

Discussions similaires

  1. Conversion type C vers Delphi
    Par castorcharly dans le forum Langage
    Réponses: 9
    Dernier message: 14/11/2016, 15h26
  2. Réponses: 2
    Dernier message: 29/09/2014, 17h57
  3. Réponses: 7
    Dernier message: 19/05/2012, 19h38
  4. Convertir une donnée en type Char vers un type Décimal
    Par requetor dans le forum Langage SQL
    Réponses: 2
    Dernier message: 27/10/2011, 09h49
  5. Adaptation de type C++ et delphi (Pchar et char*)
    Par bouzaidi dans le forum Delphi
    Réponses: 16
    Dernier message: 26/04/2007, 20h13

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