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 :

Problème de type ou de compilateur ?


Sujet :

Delphi

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut Problème de type ou de compilateur ?
    Bonjour,

    J’essaie d'écrire un petit programme avec accès WiFi. Pour cela j'ai copié un programme dont voici un élément :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    procedure TForm1.WSocket1DataAvailable(Sender: TObject; ErrCode: Word);
    var
        Buffer : array [0..1023] of Ansichar;
        Len    : Integer;
        Src    : sockaddr_in;
        SrcLen : Integer;
        Lbuffer : Integer;
        temp   : string;
     
    begin
        SrcLen := SizeOf(TSockAddrIn);
     
    Len := WSocket1.ReceiveFrom(@Buffer,SizeOf(Buffer) , Src , SrcLen);
        if Len >= 0 then begin ...
    Et j'obtiens les erreurs suivantes :

    [Erreur] FOCUSS.pas(96): Les types des paramètres VAR originaux et formels doivent être identiques
    [Erreur fatale] FOCUSSP.dpr(5): Impossible de compiler l'unité utilisée 'FOCUSS.pas'

    Si je met des parenthèses à Src : Len := WSocket1.ReceiveFrom(@Buffer,SizeOf(Buffer) , (Src) , SrcLen);
    J'ai en plus le message suivant :
    [Avertissement] FOCUSS.pas(96): Transtypage non protégé de 'sockaddr_in' en 'sockaddr_in'
    qui me parait assez surprenant !
    Avez-vous des explications ?
    Merci d'avance.
    Adelant

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    "mettre des parenthèse" c'est juste pour faire joli ou il y a un but derrière ?

    il est probable que la déclaration de la fonction a évolué entre l'exemple que tu as trouvé et ta version de Delphi (ou l'inverse)

    donc première chose à faire, regarder les paramètres attendus par ReceiveFrom(), soit en control-cliquant dessus, soit avec le Hint de Ctrl+Espace après la parenthèse ouvrante

    ensuite il faut lui donner ce qu'il attends.

    je pari sur SrcLen qui est possiblement un Cardinal
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    "mettre des parenthèse" c'est juste pour faire joli ou il y a un but derrière ?

    il est probable que la déclaration de la fonction a évolué entre l'exemple que tu as trouvé et ta version de Delphi (ou l'inverse)

    donc première chose à faire, regarder les paramètres attendus par ReceiveFrom(), soit en control-cliquant dessus, soit avec le Hint de Ctrl+Espace après la parenthèse ouvrante

    ensuite il faut lui donner ce qu'il attends.

    je pari sur SrcLen qui est possiblement un Cardinal
    Merci pour ta réponse.
    Les parenthèses ont l’intérêt (découvert par hasard) de faire apparaitre un message surprenant puisqu'il semble que le compilateur veut transtyper 'sockaddr_in' en 'sockaddr_in' !
    Je ne pense pas que ce bout de programme soit en cause car j'ai vu de nombreux utilisateurs l'emprunter.
    J'ai peut-être résolu le PB en ajoutant dans les "uses" : OverbyteIcsWinSock qui n'est pourtant pas dans les exemples que j'ai pillé et qui aurait, de toutes les façons, dû se rajouter tout seul comme les autres. (Il y avait déjà OverbyteIcsWndControl et OverbyteIcsWSocket).
    J'ai passé l'étape de la compilation, je vais maintenant tester l'exécution avec un ESP8266 qui est déjà prêt.

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

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

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Points : 28 445
    Points
    28 445
    Par défaut
    ah je pense tout simplement que sockaddr_in est déclaré dans OverbyteIcsWinSock alors qu'il existe déjà dans Winapi.Winsock...du coup il est déclaré deux fois, tu devais avoir Winsock dans les uses, et le composant attendait la version de OverbytIcsWinsock
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    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 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Src ne devrait-il pas être un SOCKADDR et non SOCKADDR_IN
    Heursement compatible puisque l'idée est de gérer via PSockAddr aussi bien SOCKADDR_IN et SOCKADDR_IN6_LH/SOCKADDR_IN6_W2KSP1

    Suffit de lire la documentation TWSocket.ReceiveFrom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ReceiveFrom(Buffer:Pointer; BufferSize:integer; var from:TSockAddr; var fromSize:integer):integer;
    TSockAddr n'est pas TSockAddr_in (ou ce type sans T nommé sockaddr_in) mais on peut le lui faire croire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Len    := WSocket.ReceiveFrom(@Buffer, SizeOf(Buffer), PSockAddr(@Src)^, SrcLen);
    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

  6. #6
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par ShaiLeTroll Voir le message
    Src ne devrait-il pas être un SOCKADDR et non SOCKADDR_IN
    Heursement compatible puisque l'idée est de gérer via PSockAddr aussi bien SOCKADDR_IN et SOCKADDR_IN6_LH/SOCKADDR_IN6_W2KSP1

    Suffit de lire la documentation TWSocket.ReceiveFrom
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function ReceiveFrom(Buffer:Pointer; BufferSize:integer; var from:TSockAddr; var fromSize:integer):integer;
    TSockAddr n'est pas TSockAddr_in (ou ce type sans T nommé sockaddr_in) mais on peut le lui faire croire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Len    := WSocket.ReceiveFrom(@Buffer, SizeOf(Buffer), PSockAddr(@Src)^, SrcLen);
    J'avais tout essayé : SOCKADDR_IN, PSockAddr(@Src)^, TSockAddr, ... Ce qui a débloqué la situation c'est l'ajout du uses.

    Ça a l'air de fonctionner. Il me reste à en faire un programme .exe que je puisse appeler du bureau Windows (?)

    Tout cela va me servir à faire la mise au point, depuis mon salon, d'un télescope qui sera bien au froid dans le jardin ...

    Merci pour vos soutiens.
    Adelant

  7. #7
    Nouveau Candidat au Club
    Homme Profil pro
    Retraité
    Inscrit en
    Octobre 2018
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2018
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    ah je pense tout simplement que sockaddr_in est déclaré dans OverbyteIcsWinSock alors qu'il existe déjà dans Winapi.Winsock...du coup il est déclaré deux fois, tu devais avoir Winsock dans les uses, et le composant attendait la version de OverbytIcsWinsock

    Ça a l'air de fonctionner. Il me reste à en faire un programme .exe que je puisse appeler du bureau Windows (?)

    Tout cela va me servir à faire la mise au point, depuis mon salon, d'un télescope qui sera bien au froid dans le jardin ...

    Merci pour les explications
    Adelant

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

Discussions similaires

  1. [ tinyint et char ] problème de type
    Par shirya dans le forum Installation
    Réponses: 3
    Dernier message: 05/11/2005, 07h08
  2. [debutant] problème avec type à utiliser
    Par mlequim dans le forum Autres SGBD
    Réponses: 2
    Dernier message: 15/07/2005, 16h08
  3. Problème de type chaîne
    Par champijulie dans le forum PostgreSQL
    Réponses: 4
    Dernier message: 12/05/2005, 20h23
  4. Réponses: 4
    Dernier message: 30/01/2005, 14h23
  5. [Sybase] Problème de type sous ASE
    Par Hotchotte dans le forum Sybase
    Réponses: 1
    Dernier message: 18/12/2004, 11h04

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