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

Free Pascal Discussion :

Runtime error 216 - Pointeurs - Procédures - Unit [Free Pascal]


Sujet :

Free Pascal

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Runtime error 216 - Pointeurs - Procédures - Unit
    Bonjour à tous,
    tout d'abord merci pour le temps que vous voulez bien me consacrer afin de lire mon message et je l'espère d'y répondre. Je vais essayer d'être rapide :
    lorsque je compile mon programme, l'erreur 216 apparait, je vous poste mon code ci-dessous:
    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
    unit tirage;
     
    interface
     
    const max=9;
     
    type
     img=record
          numero:integer; // numero de l'image
          compteur:integer; // nombre de fois que l'image a été attribué
         end;
     PImg=^img;
     listeImg=array[1..max*3] of PImg;
     
     Tableau=array[1..6,1..max] of pinteger;
     
    var
     PListe:listeImg;
     PteurT:Tableau;
     
    procedure tiralea(ligne,colonne:integer); 
     
    implementation
     
    procedure tiralea(ligne,colonne:integer);
    var i,j,z,nombre:integer;
    begin
     nombre:=trunc((ligne*colonne)/2); // valeur : nombre de paires ; astuce(trunc): dans tous les cas on obtiendra la même valeur !
     
     for i:=1 to nombre do
      begin
       new(PListe[i]);
       PListe[i]^.numero:=i; // image(i)=numero(i) ... jusque la… rien de très compliqu‚
       PListe[i]^.compteur:=0; // initialisation: l'image i a été attribué 0 fois
      end;
     
     for i:=1 to ligne do
      for j:=1 to colonne do
       repeat
        z:=random(nombre)+1; // on tire un numéro de carte au hasard
        if PListe[z]^.compteur<2 then  // si l'image n'a pas été utilisé plus de 2 fois(ou 2) alors...
         begin
          new(PteurT[i,j]);
          PteurT[i,j]^:=Pliste[z]^.numero;
          Pliste[z]^.compteur:=Pliste[z]^.compteur+1;
         end
        else PteurT[i,j]^:=0;  // Astuce
       until PteurT[i,j]^<>0;
     
    end;
     
    end.

    Question subsidiaire:
    C'est mieux de faire un tableau de pointeurs pointant vers des entiers ou un pointeur pointant vers un tableau d'entiers? (Vous avez suivi? )

    Merci pour le temps que vous aurez bien voulu m'accorder

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

    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
    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
    81
    82
    83
    84
    unit tirage;
     
    interface
     
    const
      maxRows = 6;
      maxCols = 9;
      maxList = maxRows*maxCols; // ou maxCols*3 ?
     
    type
      TImgItem = record
        Index    : LongInt; // numero de l'image
        RefCount : LongInt; // nombre de fois que l'image a été attribué
      end;
      TImgList = packed array[0..maxList-1] of TImgItem;
     
      TCounter = packed array[0..maxRows-1, 0..maxCols-1] of LongInt;
     
    procedure RandPull(const aRow, aCol: LongInt; var aImgList: TImgList; var aCounter: TCounter);
    procedure InitImgList(var aImgList: TImgList);
    procedure InitCounter(var aCounter: TCounter);
     
    var
     ImgList : TImgList;
     Counter : TCounter;
     
     
    implementation
     
     
    procedure InitImgList(var aImgList: TImgList);
    var N : LongInt;
    begin
      for N := 0 to maxList-1 do
      begin
        aImgList[N].Index    := N;
        aImgList[N].RefCount := 0;
      end;
    end;
     
    procedure InitCounter(var aCounter: TCounter);
    var R,C : LongInt;
    begin
      for R := 0 to maxRows-1 do
        for C := 0 to maxCols-1 do
          aCounter[R, C] := 0;
    end;
     
     
    procedure RandPull(const aRow, aCol: LongInt; var aImgList: TImgList; var aCounter: TCounter);
    var R, C, IL, N, Rw, Cl:LongInt;
    begin
      if aRow < 0 then Rw := 0 else if aRow >= maxRows then Rw := maxRows-1 else Rw := aRow;
      if aCol < 0 then Cl := 0 else if aCol >= maxCols then Cl := maxCols-1 else Cl := aCol;
     
     
      // valeur : nombre de paires
      N := (Rw*Cl) div 2;
     
      for R := 0 to Rw do
        for C := 0 to Cl do
         repeat
           // on tire un numéro de carte au hasard
           IL := random(N);
     
           // si l'image n'a pas été utilisé plus de 2 fois
           if aImgList[IL].RefCount < 2 then
           begin
             aCounter[R,C] := aImgList[IL].Index;
             inc(aImgList[IL].RefCount);
           end
           else
             aCounter[R,C] := 0;
     
         until aCounter[R,C] <> 0;
    end;
     
     
    initialization
      Randomize;
      InitImgList(ImgList);
      InitCounter(Counter);
     
    end.

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

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Merci pour la réponse, là je n'ai pas le temps d'essayer mais dès que je me lève demain je le test et je te tiens au courant.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Décembre 2009
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2009
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    J'ai trouvé mon erreur pour ce que ça pourrait intéresser:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    for i:=1 to ligne do
      for j:=1 to colonne do
       repeat
        z:=random(nombre)+1; // on tire un numéro de carte au hasard
        if PListe[z]^.compteur<2 then  // si l'image n'a pas été utilisé plus de 2 fois(ou 2) alors...
         begin
          new(PteurT[i,j]);
          PteurT[i,j]^:=Pliste[z]^.numero;
          Pliste[z]^.compteur:=Pliste[z]^.compteur+1;
         end
        else PteurT[i,j]^:=0;  // Astuce
       until PteurT[i,j]^<>0;
    En faite le problème c'est new(PteurT[i,j]);, il est mal placé. En effet, s'il la condition n'est pas vérifiée alors la boucle recommence et il crée un nouvel emplacement mémoire pour le même emplacement du tableau => erreur

    Pour résoudre le problème je propose donc tout simplement de virer cette ligne et d'écrire une boucle suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for i:=1 to ligne do
     for j:=1 to colonne do
      new(PteurT[i,j]);
    PS: Ça marche chez moi a+

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

    Informations forums :
    Inscription : Septembre 2009
    Messages : 980
    Points : 1 294
    Points
    1 294
    Par défaut
    en fait tu n'as pas besoin de pointeurs dans ce cas!

    et de plus il ne faut pas oublier de liberer les pointeurs alloué a la fin.

    en utilisant des pointeurs tu devrais avoir 4 fonction :

    l'initialisation
    le reset
    le trie
    la finalisation

    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
    81
    82
     
    unit tirage;
     
    interface
     
     
    const
      maxRow  = 6;
      maxCol  = 9;
      maxItem = maxRow * maxCol;
     
    type
      PListItem = ^TListItem;
      TListItem = record
        index : integer;
        refCount : integer;
      end;
      TListArray = packed array[0..maxItem-1] of PListItem;
     
    var
      MyList      : TListArray;
      MyListReady : boolean = false;
     
     
    procedure ListReset;
    procedure ListInitialize;
    procedure ListFinalize;
     
    implementation
     
    procedure ListReset;
    var N: integer;
    begin
      if not MyListReady then
        ListInitialize(MyList)
      else
        for N := 0 to maxItem-1 do
        begin
          MyList[N]^.Index := N;
          MyList[N]^.RefCount := 0;
        end;
    end;
     
    procedure ListInitialize;
    var N: integer;
    begin
      if MyListReady then
        ListReset
      else
      begin
        for N := 0 to maxItem-1 do
        begin
          new(MyList[N]);
          MyList[N]^.Index := N;
          MyList[N]^.RefCount := 0;
        end;
        MyListReady := true;
      end;
    end;
     
    procedure ListFinalize;
    var N : integer;
    begin
      if not MyListReady then
        exit;
     
      for N := 0 to maxItem-1 do
        Dispose(MyList[N]);
      MyListReady := false;
    end;
     
     
    initialization
      Randomize;
      ListInitialize;
     
    finalization
      ListFinalize;
     
    end.
     
    end.

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

Discussions similaires

  1. [Wamp] Runtime Error 216
    Par seksaki dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 0
    Dernier message: 18/02/2013, 12h50
  2. Runtime Error 216
    Par Bernard B dans le forum Langage
    Réponses: 10
    Dernier message: 25/01/2012, 08h52
  3. Runtime error 216
    Par Kcintim dans le forum EDI
    Réponses: 7
    Dernier message: 17/02/2009, 23h42
  4. Réponses: 6
    Dernier message: 16/06/2006, 09h14

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