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

Lazarus Pascal Discussion :

QuickSort(A: array of array of String) génère une erreur "Type identifier expected"


Sujet :

Lazarus Pascal

  1. #1
    Invité
    Invité(e)
    Par défaut QuickSort(A: array of array of String) génère une erreur "Type identifier expected"
    Bonjour,

    Pourquoi la syntaxe procedure QuickSort(A: array of array of String; numCol : integer) me renvoie-t-elle un Unit1.pas(18,37) Error: Type identifier expected. liée à la déclaration du tableau ?

    Lorsque je déclare un tableau dynamaique dans les var de la Form
    a : array of array of String; cela passe bien. Alors pourquoi pas dans une procedure ?

    Cordialement. Gilles

  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
    alors il y a une grosse différence entre une variable "array of" et un paramètre "array of".

    le premier est un tableau dynamique, le second un tableau ouvert.

    la nuance est subtile, mais elle est bien là comme illustré ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure test(a:array of string);
    var
      b: array of string;
    begin
      SetLength(a, 10); // impossible !
      SetLength(b, 10); // autorisé
    end;
     
    begin
      test(['a','b']);
    end;
    or le tableau ouvert n'a qu'une dimension; tu ne peux déclarer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    test([['a','b'],['c','d']]);
    et tu ne peux déclarer un array of array...sauf si l'un ou les deux array sont dynamiques :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    type
      aastring = array of array of string; // dynamique
     
    function test(a:aastring);
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Invité
    Invité(e)
    Par défaut
    Oui, je connais un peu les arrays et cette différence. Mais là, il s'agit d'un problème de déclaration.

    Pour l'instant, j'y perds mon latin... j'avais initialement déclaré en effet un type Tableau = array of array of string... et obtenu la même erreur.

    Donc ensuite je l'ai déclaré directement dans l'entête de la procédure... C'est "usuellement" maladroit et j'aurais dû copier le code initial. Quoique, je ne vois pas vraiment ce qui structurellement interdit d'utiliser directement un array of array dans une déclaration de procédure. Est-ce à rapprocher de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    const
      i : integer = 4;
      j : integer = 2 * i;
    qui immanquablement crée une erreur ? Pourtant on différencie les constantes des variables dans la déclaration des procédures ? Donc c'est probablement un mauvais rapprochement en suppossant qu'un array d'array serait l'équivalent d'un calcul. Qu'est ce qui fait l'array d'array un objet à part ?... Objet est encore mal choisi... Ce n'est pas un objet. Pascal OO n'est pas purement Objet...

    Votre exemple compile dans un projet à part, c'est rassurant... et pas le mien sauf si je passe mon array of array en variable globale et l'éliminine de la déclaration. Sinon, j'ai toujours la même erreur (et le même message). C'est donc un autre problème de déclaration... (ie ailleurs).

    Votre code introduit dans mon projet a produit ceci : "G:\lazarus\0.9.31-30686-fpc-2.4.3-20110512\lcl\forms.pp(1659,14) Error: [TFindDeclarationTool.FindCodeToolForUsedUnit] internal error: invalid UnitNameAtom"... Je crois que je vais revenir à la SVN précédente...

    Merci pour votre aide. Gilles
    Dernière modification par Invité ; 21/06/2011 à 10h41.

  4. #4
    Invité
    Invité(e)
    Par défaut
    Rebonjour,

    En rétrogradant la version de Lazarus/FPC, le code fonctionne correctement en déclarant le type initialement.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    type
      Tableau = array of array of string;   
    [...]
     
    procedure QuickSort(A: Tableau; ColToSort, Lo, Hi : Integer);
    Cordialement. Gilles

  5. #5
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    il me semble que :
    - un tableau ouvert est un pointeur sur le premier élément d'une suite dont la taille est connue du programmeur uniquement
    - un tableau dynamique est un pointeur sur une "structure" plus complexe qui gère sa longueur (ou en tous cas la connaît)
    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 !

  6. #6
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    je suis toujours très "coincé" sur la structure interne du Pascal... Les Int, les Int64, les array, array of array : pas facile de trouver de la documentation fine pour essayer de comprendre...

    Mais c'est bien utile pourtant.

    Merci pour vos précisions. Cordialement. Gilles

  7. #7
    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
    Citation Envoyé par tourlourou Voir le message
    il me semble que :
    - un tableau ouvert est un pointeur sur le premier élément d'une suite dont la taille est connue du programmeur uniquement
    - un tableau dynamique est un pointeur sur une "structure" plus complexe qui gère sa longueur (ou en tous cas la connaît)
    la taille du tableau est connue du programme également Low() et High() peuvent être utilisés...si mon souvenir est bon Delphi ajoute un paramètre implicite qui donne la taille du tableau.

    pour ce qui est de l'exemple des constantes, c'est propre aux constantes typés...qui sont variables ou pas selon un flag
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    const
      i = 1; // vraie constante
      j : integer = 2 * i; // constante typée
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  8. #8
    Modérateur
    Avatar de tourlourou
    Homme Profil pro
    Biologiste ; Progr(amateur)
    Inscrit en
    Mars 2005
    Messages
    3 858
    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 858
    Points : 11 300
    Points
    11 300
    Billets dans le blog
    6
    Par défaut
    Tu as raison, le programme connaît les bornes du tableau... par quel miracle ?
    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 !

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par Paul TOTH Voir le message
    la nuance est subtile, mais elle est bien là comme illustré ci-dessous:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    procedure test(a:array of string);
    var
      b: array of string;
    begin
      SetLength(a, 10); // impossible !
      SetLength(b, 10); // autorisé
    end;
     
    begin
      test(['a','b']);
    end;
    Oui, ben moi je ne l'étais pas (subtil)... En tous cas, en train de me dépatouiller ce matin avec mon problème de stabilité, je n'ai perçu la nuance... que bien après. Maintenant cette partie du programme fonctionne correctement (et pas seulement le bout de code extrait).

    Merci beaucoup.
    Gilles

Discussions similaires

  1. Process.Start génère une erreur
    Par jerome.fortias dans le forum C#
    Réponses: 6
    Dernier message: 17/09/2007, 15h31
  2. Source du fichier plat : trop de ligne génère une erreur
    Par Monico dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 30/08/2007, 16h04
  3. Exécutable qui génére une erreur windows
    Par jouidos dans le forum Windows Forms
    Réponses: 4
    Dernier message: 22/01/2007, 15h50
  4. .lib qui génère une erreur au link
    Par mrshadow dans le forum VC++ .NET
    Réponses: 2
    Dernier message: 19/01/2007, 10h47
  5. [VB6] Problème de textbox multiligne qui génére une erreur
    Par bb62 dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 20/02/2006, 16h21

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