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

Langage Delphi Discussion :

Créer un array of AnsiChar d'un String


Sujet :

Langage Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 72
    Par défaut Créer un array of AnsiChar d'un String
    Bonjour,

    me voilà encore avec ma DLL pas bien documentée.

    Alors, je dois envoyer à une fonction un string nul terminated, du moins un pointeur.

    J'arrive vie un for à remplir mon array of AnsiChar, puis après cela j'essaie de mettre un pointeur vers cet array, mais là, je trouve que le résultat est un peu spécial.

    La valaur du pointeur est égale au string...

    j'explique, si mon array vaut '0807012012AE', et bien, la valeur de mon pointeur sera lui aussi de '0807012012AE'. mais je m'attendrais à trouver une adresse mémoire ? non ??


    voici ma fonction

    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
    35
    36
    37
    procedure TForm1.b_set_timeClick(Sender: TObject);
    var
      res3, i: integer;
      temp_time: String;
      t_now: TDateTime;
      pSetTime: PAnsiChar;
      SetTime: array[1..15] of AnsiChar;
      t_year, t_month, t_day, t_dayw, t_hour, t_min, t_sec: String;
      myYear, myMonth, myDay, myHour, myMin, mySec, myMilli: word;
    begin
     
      device_open();
     
      t_now := now;
      DecodeDateTime(t_now, myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
     
      t_year := IntToHex(myYear-2000, 2);
      t_month := IntToHex(myMonth, 2);
      t_day := IntToHex(myDay, 2);
      t_dayw := IntToHex(DayOfTheWeek(t_now), 2);
      t_hour := IntToHex(myHour, 2);
      t_min := IntToHex(myMin, 2);
      t_sec := IntToHex(mySec, 2);
     
      temp_time := PAnsiChar(concat(t_year, t_month, t_day, t_dayw, t_hour, t_min, t_sec));
      for i := 1 to 14 do
      begin
        SetTime[i] := temp_time[i];
      end;
      SetTime[15] := #0;
      pSetTime := addr(SetTime[1]);
     
      res3 := WriteTime(dev_address, pSetTime);
     
      CloseCommPort(hCom);
     
    end;
    Alors, est-ce que tout est correcte ?
    Sinon, à la place de la déclaration du pointeur en tant que PAnsiChar, j'ai pensé à mettre une déclaration en Pointer ???

    Est-ce mieux ?

  2. #2
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    ou plus simplement
    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
     
    procedure TForm1.b_set_timeClick(Sender: TObject);
    var
      res3, i: integer;
      temp_time: String;
      t_now: TDateTime;
      SetTime: string;
      t_year, t_month, t_day, t_dayw, t_hour, t_min, t_sec: String;
      myYear, myMonth, myDay, myHour, myMin, mySec, myMilli: word;
    begin
     
      device_open();
     
      t_now := now;
      DecodeDateTime(t_now, myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
     
      t_year := IntToHex(myYear-2000, 2);
      t_month := IntToHex(myMonth, 2);
      t_day := IntToHex(myDay, 2);
      t_dayw := IntToHex(DayOfTheWeek(t_now), 2);
      t_hour := IntToHex(myHour, 2);
      t_min := IntToHex(myMin, 2);
      t_sec := IntToHex(mySec, 2);
     
      SetTime := concat(t_year, t_month, t_day, t_dayw, t_hour, t_min, t_sec));
     
      res3 := WriteTime(dev_address, @SetTime[1]);
    //  res3 := WriteTime(dev_address, PAnsiChar(SetTime));
      CloseCommPort(hCom);
     
    end;
    la chaine Delphi est conçu de sorte qu'on puisse passer le pointeur sur le premier caractère et la gérer comme une pchar car le zéro terminal est aussi inclu ! le transtypage en PChar fonctionne aussi très bien ...

    sinon variante avec StrPLCopy (avec GetMem ou NewStr)
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 72
    Par défaut
    Ok, merci pour cette précisin.

    Cela ne fonctionne pas pour ma fonction, mais cela doit être autre chose


    pour ma question j'ai ma réponse, merci

  4. #4
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Comment est déclaré WriteTime, est aussi lié à l'autre sujet, un pointeur c'est un pointeur, la seule particularité c'est qu'il voudrait modifier la valeur ... as-tu testé mon code pour dire qu'il ne fonctionne pas ?

    '0807012012AE', ben c'est la valeur binaire, et Delphi, lorsqu'il voir un PChar ou un Array of Char, au déboggage, il affiche la chaine, c'est souvent ce que veux voir le développeur, la valeur du pointeur étant plus abstraite, même si parfois c'est utile de le savoir, ...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ShowMessage(pSetTime); // Delphi est malin, il va afficher la chaine
    ShowMessage(IntToStr(Integer(pSetTime))); // là c'est le pointeur
    sinon autre variante, si tu pouvais aussi la tester ...

    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
    procedure TForm1.b_set_timeClick(Sender: TObject);
    var
      res3: integer;
      temp_time: String;
      SetTime: array[1..15] of AnsiChar;
      myYear, myMonth, myDay, myHour, myMin, mySec, myMilli: word;
    begin 
      device_open();
     
      DecodeDateTime(Now(), myYear, myMonth, myDay, myHour, myMin, mySec, myMilli);
     
      temp_time := IntToHex(myYear-2000, 2);
        + IntToHex(myMonth, 2);
        + IntToHex(myDay, 2);
        + IntToHex(DayOfTheWeek(t_now), 2);
        + IntToHex(myHour, 2);
        + IntToHex(myMin, 2);
        + IntToHex(mySec, 2);
     
      temp_time := concat(t_year, t_month, t_day, t_dayw, t_hour, t_min, t_sec);
      CopyMemory(@SetTime[1], @temp_time[1], 14);
      SetTime[15] := #0;
      res3 := WriteTime(dev_address, @SetTime[1]);
     
      CloseCommPort(hCom); 
    end;
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 72
    Par défaut
    Oui, j'ai essayé ta solution avant de dire que cela ne va pas (je n'oserais jamais fâcher un troll...!!!!)

    voici la déclaration de la fonction:

    LONG PASCAL WriteTime(LPCSTR DevNo,LPCSTR pTime)

    je vais essayer les autres solutions

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2007
    Messages
    72
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Février 2007
    Messages : 72
    Par défaut
    Voilà,

    j'ai essayé le code.

    1) l'utilisation des + pour créer temp_time ne fonctionne pas

    2) la fonction ne fonctionne toujours pas, mais je ne sais pas si le problème vient de ce que je passe, ou bien si la fonction à un autre problème.

    le grand problème est que je n'ai pas d'aide sur la DLL, et la doc ne correspond pas toujours à la réalité

  7. #7
    Expert éminent
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 982
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 982
    Par défaut
    Citation Envoyé par Nulenprogra Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LONG PASCAL WriteTime(LPCSTR DevNo,LPCSTR pTime)
    et tu l'as déclaré comment en StdCall et string, comme dans l'autre sujet ? hum tu dois avoir des soucis

    Et oui, un Troll en colère, ça casse tout sur son passage

    ta doc n'a aucun problème, les prototypes sont simples, c'est juste que tu ne sais pas les traduire, ... peut-être reprendre par là !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

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

Discussions similaires

  1. Peut-on créer un array avec des index de type String ?
    Par totoAussi dans le forum Collection et Stream
    Réponses: 5
    Dernier message: 13/03/2012, 14h06
  2. JTable, créer un comparateur de Dates au format String
    Par Nyphel dans le forum Composants
    Réponses: 7
    Dernier message: 13/02/2007, 16h15
  3. Réponses: 1
    Dernier message: 07/09/2006, 01h52
  4. [Reflect] Créer un array d'objets avec le nom de leur classe
    Par Onarap dans le forum API standards et tierces
    Réponses: 18
    Dernier message: 12/06/2006, 12h24
  5. Comment transformer "array of ansiChar" en "ansiString" ?
    Par SchpatziBreizh dans le forum Langage
    Réponses: 2
    Dernier message: 24/07/2005, 02h12

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