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 :

erreur de compilation


Sujet :

Delphi

  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 51
    Points : 10
    Points
    10
    Par défaut erreur de compilation
    quelqu'un peut m'aider à résoudre l'erreur (l'erreur c'est là CRC16(frame);

    [dcc32 Erreur] modbus1.pas(102): E2010 Types incompatibles : 'string' et 'array[0..7] of Byte'

    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
     function CRC16(Data: string):byte;
    var
      crc : word;
      i,j : Integer;
     
    begin
      crc := $FFFF;
      for i := 1 to Length(Data) do begin
        crc := Ord(Data[i]) xor crc;
        for j := 1 to 8 do begin
          if (CRC and $01) = 1
            then CRC := (CRC shr 1) xor $A001
            else CRC := CRC shr 1;
        end;
      end;
      Result := crc;
     
    end ;
    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
    function Readcoils(address : byte; fct: byte; startadress: word; registers : longword  ) : byte;
     var
      CRC : array[0..1] of byte;
      frame : array[0..7] of byte;
     
      begin
                frame[0] := address;
                frame[1] := fct;
                frame[2] := (startadress shr 8);   
                frame[3] := startadress;
                frame[4] := (registers shr 8);   
                frame[5] := registers;
     
                CRC16(frame); 
                frame[length.frame - 2] := CRC[0];
                frame[length.frame - 1] := CRC[1];
                result := frame;
      end ;

  2. #2
    Membre expert
    Avatar de pprem
    Homme Profil pro
    MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Inscrit en
    Juin 2013
    Messages
    1 876
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : MVP Embarcadero - formateur&développeur Delphi, PHP et JS
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2013
    Messages : 1 876
    Points : 3 611
    Points
    3 611
    Par défaut
    C'est normal : une string n'est pas un tableau d'octets. Ca pourrait passer avec un "array of ansichar", mais tu peux aussi jouer avec un RECORD mappant les deux tableaux ("case" dans le record) sur la même zone mémoire.

    Méfie toi aussi de ton
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    frame[2] := (startadress shr 8);
    frame[3] := startadress;
    frame[4] := (registers shr 8);
    frame[5] := registers;
    Pour récupérer la partie haute et la partie basse d'un Word je recommande de jouer avec les DIV et MOD plutôt que les décalages comme tu le fais (surtout pour la seconde ligne de chaque).

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 51
    Points : 10
    Points
    10
    Par défaut
    désolé j'ai pas bien compris la première partie que ta expliquer

  4. #4
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 857
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Biologiste ; Progr(amateur)

    Informations forums :
    Inscription : Mars 2005
    Messages : 3 857
    Points : 11 291
    Points
    11 291
    Billets dans le blog
    6
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    function Readcoils(address : byte; fct: byte; startadress: word; registers : longword  ) : byte;
     var
      frame : array[0..7] of byte;
    begin
     
      result := frame;
    end;
    Le message est très clair. Du coup, dans ton code, il n'y a vraiment rien qui te pique les yeux ?
    Delphi 5 Pro - Delphi 11.3 Alexandria Community Edition - CodeTyphon 6.90 sous Windows 10 ; CT 6.40 sous Ubuntu 18.04 (VM)
    . Ignorer la FAQ Delphi et les Cours et Tutoriels Delphi nuit gravement à notre code !

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 31
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 51
    Points : 10
    Points
    10
    Par défaut
    ce que je sais c'est que "data" est en string par contre "frame" c'est array[0..7] of byte

  6. #6
    Rédacteur/Modérateur

    Avatar de SergioMaster
    Homme Profil pro
    Développeur informatique retraité
    Inscrit en
    Janvier 2007
    Messages
    15 031
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 67
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Janvier 2007
    Messages : 15 031
    Points : 40 930
    Points
    40 930
    Billets dans le blog
    62
    Par défaut
    Puisqu'il faut être clair
    Nom : Capture_2.PNG
Affichages : 179
Taille : 33,4 Ko
    MVP Embarcadero
    Delphi installés : D3,D7,D2010,XE4,XE7,D10 (Rio, Sidney), D11 (Alexandria), D12 (Athènes)
    SGBD : Firebird 2.5, 3, SQLite
    générateurs États : FastReport, Rave, QuickReport
    OS : Window Vista, Windows 10, Windows 11, Ubuntu, Androïd

  7. #7
    Expert confirmé Avatar de sergio_is_back
    Homme Profil pro
    Responsable informatique, développeur tout-terrain
    Inscrit en
    Juin 2004
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Responsable informatique, développeur tout-terrain
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 084
    Points : 5 605
    Points
    5 605
    Par défaut
    Citation Envoyé par afriad Voir le message
    ce que je sais c'est que "data" est en string par contre "frame" c'est array[0..7] of byte
    Il faut apprendre la déclaration de types :

    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
     
    interface
     
    type TModbusFrame = array[0..7] of Byte;
     
    implementation
     
    function Readcoils(address : byte; fct: byte; startadress: word; registers : longword  ) : TModbusFrame;
    var
        frame : TModbusFrame;
    begin
        // ...
        // ton code
        // ...
        result := frame;
    end;

  8. #8
    Rédacteur/Modérateur
    Avatar de Andnotor
    Inscrit en
    Septembre 2008
    Messages
    5 685
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Septembre 2008
    Messages : 5 685
    Points : 13 102
    Points
    13 102
    Par défaut
    @Tourlourou et @Sergio

    Le compilateur n'a pas encore atteint cette ligne, c'est plus haut que ça se passe (pour l'instant )

    @afriad

    Déclare simplement le paramètre de CRC16 en array of byte et modifie la boucle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    function CRC16(Data: array of byte):byte;
    begin
      for i := 0 to High(Data) do
    Après, il y a pas mal d'erreurs. En vrac :

    CRC16
    • crc est un word mais Result un byte.



    Readcoils
    • Pour récupérer les deux octets d'un mot, Lo(startadress) et Hi(startadress).
    • Register, un LongWord dans un byte. A revoir !
    • frame[length.frame - 2] impossible ! frame[Length(frame) -2] ou frame[High(frame) -1].
    • CRC16 ne retourne rien. Le contenu de CRC[] est indéterminé.
    • Et enfin bien sûr ce Result := Frame. A l'arrivée, tu devras déclarer un nouveau type :

    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
    type
      TCRCFrame :array[0..7] of byte;
     
    function CRC16(Data: TCRCFrame):word;
    begin
    end;
     
    function Readcoils(address :byte; fct :byte; startadress :word; registers :longword) :TCRCFrame;
    var
      CRC :word;
      Frame :TCRCFrame;
    begin
      ...
      CRC := CRC16(frame);
      frame[6] := Lo(CRC);
      frame[7] := Hi(CRC);
     
      Result := Frame;
    end;

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

Discussions similaires

  1. Erreur de compilation après modification du Uses
    Par DevelOpeR13 dans le forum Langage
    Réponses: 5
    Dernier message: 30/10/2007, 14h23
  2. Réponses: 2
    Dernier message: 23/09/2003, 14h32
  3. Réponses: 10
    Dernier message: 22/09/2003, 21h58
  4. Réponses: 4
    Dernier message: 27/08/2003, 21h34
  5. Réponses: 2
    Dernier message: 04/03/2003, 23h24

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