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 :

Problème à l'exécution


Sujet :

Langage Delphi

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut Problème à l'exécution
    J'ai un problème dans la fonction ChaineVersOctets à la ligne 44.
    Quand je l'exécute, il me déclenche à cette ligne, une classe d'exception EAccessViolation avec le message "Violation d'accès à l'adresse ......".
    Systématiquement, j'ai une erreur quand j'essaye d'affecter un octet à Resultat [I]
    Savez-vous d'où ça provient ? Merci

    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
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    unit TestUDP;
     
    interface
     
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, IdGlobal, IdUDPBase, IdUDPServer, IdUDPClient, StdCtrls, ComCtrls ;
     
    type
      TEcran = class(TForm)
        Bouton_envoyer_message: TButton;
        Bouton_arreter: TButton;
        RichEdit1: TRichEdit;
        procedure FormCreate(Sender: TObject);
        procedure Bouton_envoyer_messageClick(Sender: TObject);
        procedure Bouton_arreterClick(Sender: TObject);
      private
        { Déclarations privées }
      public
        { Déclarations publiques }
      end;
      TArrayByte = Array [1..32] of Byte ;
    var
      Ecran: TEcran;
      udp: TIdUDPClient;
      send_data: TIdBytes ; {TArrayByte ;}
      packet: {UTF8}String ; // chaine de caractères - je ne connais pas le type en Delphi
     
    implementation
     
    {$R *.dfm}
     
             FUNCTION ChaineVersOctets (Chaine : String) : TIdBytes  {TArrayByte} ;
             { CETTE FONCTION transforme une chaine de caractères en suite d'octets. }
    VAR
             I : Integer ;
             Octet : Byte ;
             Resultat : TIdBytes{TArrayByte} ;
    BEGIN
            { Resultat := TIdBytes.Create () ;}
             FOR I := 0 TO Length (Chaine)-1 DO
             BEGIN
                Octet := Ord (Chaine [I+1]) - 48 ;
                Resultat[I] := Octet;
             END;
             ChaineVersOctets := Resultat 
    END ;  { ChaineVersOctets }
        {-------------------------------------------------------------------}
    procedure TEcran.FormCreate(Sender: TObject);
    CONST
             Vide = '' ;
    begin
             RichEdit1.Color := clYellow ;
    {         RichEdit1.Lines.SetText (Vide) ;}
             RichEdit1.Lines.Text := Vide
    end;
     
     
    procedure TEcran.Bouton_arreterClick(Sender: TObject);
    begin
             Application.Terminate
    end;
     
    procedure TEcran.Bouton_envoyer_messageClick(Sender: TObject);
    begin
           {  packet := AnsiToUTF8(Memo1.Text) ; }
             packet := RichEdit1.Lines.Text ;
             SetLength(send_data, sizeof(packet)); // créé un flux de bytes équivalent à la longueur de la chaîne
             send_data := ChaineVersOctets (packet);
             udp := TIdUDPClient.Create(nil);
             try
                udp.Host := 'localhost'; // même machine
                udp.Port := 3300; // c'est le port que j'utilise ...
                udp.SendBuffer(send_data);
             finally
                FreeAndNil(udp)
             end
    end;
     
    end.

  2. #2
    Membre expérimenté
    Avatar de retwas
    Homme Profil pro
    Développeur Java/Delphi
    Inscrit en
    Mars 2010
    Messages
    698
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Java/Delphi
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 698
    Points : 1 608
    Points
    1 608
    Billets dans le blog
    4
    Par défaut
    Il ne faut pas indiquer la taille du tableau "Resultat" avec un Setlengt avant de l'utiliser ?
    Ou peut etre en utilisant un Add() ?

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour la suggestion, mais ni un SetLength, ni un Add () ne conviennent. Resultat n'est pas un record et ne peut pas accepter ces deux fonctions (dixit le compilateur) !

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    396
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 396
    Points : 640
    Points
    640
    Par défaut
    tu dois bien sur faire un setLength

    Tu peux surement te passer de ta variable temporaire Resultat et utiliser directement Result


    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 ChaineVersOctets (Chaine : String) : TIdBytes  {TArrayByte} ;
             { CETTE FONCTION transforme une chaine de caractères en suite d'octets. }
    VAR
             I : Integer ;
             Octet : Byte ;
            // Resultat : TIdBytes{TArrayByte} ;
    BEGIN
            { Resultat := TIdBytes.Create () ;}
    
            setLength(Result,  Length (Chaine));
            
             FOR I := 0 TO Length (Chaine)-1 DO
             BEGIN
                Octet := Ord (Chaine [I+1]) - 48 ;
                Result[I] := Octet;
             END;
            // ChaineVersOctets := Resultat 
    END ;  { ChaineVersOctets }

    je n'ai pas testé à toi de voir

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juin 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2009
    Messages : 11
    Points : 7
    Points
    7
    Par défaut
    Merci pour la solution.
    VITIPI

  6. #6
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 586
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 586
    Points : 25 262
    Points
    25 262
    Par défaut
    Sinon voir la réponse à la même question dans l'autre sujet "Message d'erreur systématique"

    Citation Envoyé par ShaiLeTroll Voir le message
    Il existe ReadTIdBytesFromStream qui pourrait lire un TStringStream
    ou même ToBytes avec un paramètre String et TIdEncoding

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

Discussions similaires

  1. Problème d'exécution avec Dec C++
    Par PNL dans le forum C
    Réponses: 20
    Dernier message: 02/10/2005, 03h59
  2. Problème pour exécuter une chaîne de caractères
    Par Pongo dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 02/09/2005, 10h34
  3. Problème d'exécution : 'rtl60.bpl introuvable'
    Par zeddy23 dans le forum EDI
    Réponses: 3
    Dernier message: 27/07/2005, 20h44
  4. Réponses: 5
    Dernier message: 19/04/2005, 08h50
  5. Problème à l'exécution avec wxWindows (compilé avec BCC55)
    Par ShootDX dans le forum Autres éditeurs
    Réponses: 5
    Dernier message: 14/11/2003, 18h04

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