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 :

Types incompatibles : 'Array' et 'dynamic array'


Sujet :

Langage Delphi

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 974
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 974
    Points : 15 442
    Points
    15 442
    Par défaut Types incompatibles : 'Array' et 'dynamic array'
    Bonsoir.

    Soit le code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    type
      TTRUC = packed record
        // autres trucs inutiles pour la démo
        Name : array of WideChar; // dans msdn : WCHAR  Name[1]; // Variable-length string
      end;
      TRUC = TTRUC;
     
    procedure InitTruc(var t: TRUC; u: ULong; n: array of WideChar);
    begin
      SetLength(t.Name, u);
      t.Name := n; // Erreur ici !
    end;
    Je voudrais bien savoir pourquoi la compilation (D7) échoue avec le curseur clignotant au bout de la ligne
    t.Name := n;
    et avec l'erreur
    Types incompatibles : 'Array' et 'dynamic array'
    Merci à tous de vos lumières,

  2. #2
    Membre éprouvé Avatar de BuzzLeclaire
    Homme Profil pro
    Dev/For/Vte/Ass
    Inscrit en
    Août 2008
    Messages
    1 606
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Dev/For/Vte/Ass

    Informations forums :
    Inscription : Août 2008
    Messages : 1 606
    Points : 1 113
    Points
    1 113
    Par défaut
    Bonjour,

    J'ai trouvé cela :

    http://www.developpez.net/forums/d14...-dynamique-2d/

    en esperant que cela peut t'aider.

  3. #3
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    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
    type 
      TWideCharArray = packed array of WideChar;
     
    type
      TTruc = packed record
        WCA : TWideCharArray;
      end;
     
     
    procedure Init(const aTruc : TTruc; const aWCA: TWideCharArray);
    begin
      aTruc.WCA := aWCA;
    end;
    pas besoin de SetLength...

  4. #4
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 974
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 974
    Points : 15 442
    Points
    15 442
    Par défaut
    @Buzz : merci, c'est un peu l'idée du Dr.Who.

    @Dr.Who : pas mal, mais comment je vais faire afficher ton TWideCharArray ?
    Car bien sûr,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ShowMessage(aTruc.WCA);
    ne fonctionne pas,
    erreur Types incompatibles : 'String' et 'TWideCharArray '
    Me faudrait-il faire une conversion caractère par caractère, ou existe-t'il une fonction pour cela ?

  5. #5
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    haha :

    et bien utilise le type PWideChar ...

    le mieux etant d'utiliser le type PChar (PWideChar en mode unicode et PAnsiChar en mode Ansi).


    ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TTruc = packed record
        name : PChar;
      end;

  6. #6
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Salut,
    un complément d'infos.

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    10 974
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 10 974
    Points : 15 442
    Points
    15 442
    Par défaut
    Salut !

    Citation Envoyé par Dr.Who Voir le message
    et bien utilise le type PWideChar ...
    le mieux étant d'utiliser le type PChar (PWideChar en mode unicode et PAnsiChar en mode Ansi).
    ce qui donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TTruc = packed record
        name : PChar;
      end;
    Euh,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type
      TTruc = packed record
        name : PWideChar ;
      end;
    plutôt, nan ?
    Car n'utiliser que des PChar tels quels ne fonctionne pas...

    En tout cas, un avec PWideChar fonctionne tip top (avec PChar je n'ai que le premier caractère) !

    Cette phrase n'est pas claire pour moi :
    le mieux étant d'utiliser le type PChar
    Bon, OK, je pinaille, mais j'aime bien comprendre,


    Allez, un grand merci !
    PS : et y a toujours pas besoin de SetLength ?

    @Laurent : merci pour ton lien, mais il est vraiment beaucoup orienté .NET (un animal que je ne pratique absolument pas), je m'y suis perdu,

  8. #8
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par Jipété
    @Laurent : merci pour ton lien, mais il est vraiment beaucoup orienté .NET (un animal que je ne pratique absolument pas), je m'y suis perdu,
    C'est vrai que le lien est lié à dotnet, et je t'accorde le fait que tu puisses y être perdu. Cette citation n'était pas fait pour y perdre qui que ce soi, au contraire.
    Si tu fais abstraction de dotnet, tu verras que les explications de Dr.Who prennent corps.
    Il ne faut pas se faire un monde de dotnet ou de java. Tout le monde fait la même chose, mais pas de la même maniére.
    Le truc est de dire, certes mais moi je le fais mieux.
    Mieux faire n'est pas penser mieux.

    Et sans Delphi, C# et Visual studio n'auraient pas été comme ils le sont.
    Tes réticences liées à dotnet, n'ont, à mon avis pas lieu d'être.
    Si tu fais abstraction de dotnet, tu verras que les explications de Dr.Who prennent corps.

  9. #9
    Membre éprouvé
    Avatar de Dr.Who
    Inscrit en
    Septembre 2009
    Messages
    980
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    en fait que l'on soit sous Delphi 7, 2006 ou 2009 ou autre :

    AnsiString -> AnsiChar -> PAnsiChar -> PAnsiString

    WideString -> WideChar -> PWideChar -> PWideString

    et

    String -> Char -> PChar -> PString qui valent :
    String = AnsiString si en mode Ansi, sinon = WideString/UnicodeString
    Char = Ansichar si en mode Ansi, sinon = WideChar/UnicodeChar
    PChar = PAnsiChar si en mode Ansi, sinon = PWideChar/PUnicodeChar
    PString = PAnsiString si en mode Ansi, sinon = PWideString/PUnicodeString

    en gros sous D2009/D2010 :
    String = WideString et PChar = PWideChar

    et sous D6/D7 :
    String = AnsiString et PChar = PAnsiChar

    donc un code utilisant des fonctions overoadées pour PWideChar/PAnsiChar (methodes ...A et ...W) pourront compilée et être affichée correctement.
    si l'on travail en mode pur Ansi ou pur Wide il pourra y'avoir des problèmes de compilation/affichage.

    par exemple, les methodes utilisant des pointeur type Byte sur PChar en Delphi 7, pourront provoquer des erreurs sous D2009 puisque PChar = PWideChar et donc n'est plus byte mais word.
    on devra donc forcer l'utilisation de PAnsiChar plutot que PChar.

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

Discussions similaires

  1. Array dans un Array.. Dans un Array
    Par blinkman04 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2014, 15h36
  2. Jsdoc, type des éléments d'un Array
    Par dukej dans le forum Général JavaScript
    Réponses: 0
    Dernier message: 28/01/2011, 01h05
  3. Réponses: 4
    Dernier message: 30/11/2010, 18h42
  4. Types incompatibles : 'Array' et 'dynamic array'
    Par Hicks90 dans le forum Langage
    Réponses: 4
    Dernier message: 08/11/2009, 17h50
  5. [LG]Problême "types incompatibles"
    Par pierrOPSG dans le forum Langage
    Réponses: 7
    Dernier message: 23/04/2004, 22h34

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