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 :

Usage de GetMem


Sujet :

Free Pascal

  1. #1
    Membre du Club
    Homme Profil pro
    Gérant d'un site
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Gérant d'un site
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 44
    Points
    44
    Par défaut Usage de GetMem
    Bonjour

    En TurboPascal, j'utilisais GetMem pur créér des tableaux de grande taille (limités à 32000 octets environ).
    Pour transposer en FreePascal, j'ai procédé de même. Pour d'autres adaptations dont un programme jumeau cela fonctionne, mais pas ici.

    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
     
    type indCourt = record
    		          nom     : string6;
                      	  adresse : smallInt;
                    	  nbFFB   : longint;
                    	end;
             tabIndCourt = array [1..1] of indCourt;
     
    var CIndex : ^tabIndCourt;
     
    procedure CIndex_Filou;
    var Nb_W : word;
          vu : boolean;
    begin
      vu:=true;
      nb9899:=1850;
      if vu then Erreurs(30,'début de CIndex_Filou');
     
      nb_w:=nb9899*sizeof(indcourt);
      if vu then writeln('total = ',nb_w);      { soit environ 29000 octets }
      if vu then Erreurs(30,'avant getmem');
      GetMem (CIndex, nb_w);
      if vu then Erreurs(30,'fin de CIndex_Filou'); 
    end;
    Pourriez-vous me donner un conseil ?
    Merci
    Bernard

  2. #2
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    Qu'est-ce qui ne fonctionne pas au juste ?

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  3. #3
    Membre du Club
    Homme Profil pro
    Gérant d'un site
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Gérant d'un site
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 44
    Points
    44
    Par défaut usage de GetMem
    Citation Envoyé par e-ric Voir le message
    Salut

    Qu'est-ce qui ne fonctionne pas au juste ?

    cdlt
    Au lancement du programme, le message apparaît :
    An unhandled exception occurs at $00409828 :
    EAccessviolation : Access violation
    $xyz...
    $xyz...
    $xyz...
    et retour à l'écran Dos.

    Voilà !

  4. #4
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    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
     
    #!/usr/bin/instantfpc
    //program GetMemTest; 
     
    type indCourt = record
    		          nom     : string;
                      	  adresse : smallInt;
                    	  nbFFB   : longint;
                    	end;
             tabIndCourt = array [1..1] of indCourt;
     
    var CIndex : ^tabIndCourt;
     
    procedure CIndex_Filou;
    var Nb_W : word;
          vu : boolean;
          nb9899: Integer;
    begin
      vu:=true;
      nb9899:=1850;
    //  if vu then Erreurs(30,'début de CIndex_Filou');
     
      nb_w:=nb9899*sizeof(indcourt);
    //  if vu then writeln('total = ',nb_w);      { soit environ 29000 octets }
    //  if vu then Erreurs(30,'avant getmem');
      GetMem (CIndex, nb_w);
    //  if vu then Erreurs(30,'fin de CIndex_Filou'); 
    end;
     
    begin
      CIndex_Filou;
    end.
    J'ai exécuté le code ci-dessus, sous Linux avec InstantFPC, et n'ai pas reproduit le message d'erreur. J'ai dû mettre en commentaires les éléments non déclarés dans ton premier message.

    EAccessViolation: sans doute un pointeur dans un état indéfini.

    N'as-tu pas plus de détails ? As-tu débogué avec Lazarus p.exe ?

    (Ma config = FPC 2.6.4 sous Debian 7.7 Wheezy)

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  5. #5
    Membre du Club
    Homme Profil pro
    Gérant d'un site
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Gérant d'un site
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 44
    Points
    44
    Par défaut Usage de GetMem
    J'utilise Dev-Pascal et l'outil "Deboguer" ne signale rien.

  6. #6
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    Salut

    J'ai installé DevPascal (de manière standard) sur une image virtuelle Windows XP (avec VirtualBox). J'ai compilé le même code et exécuté le binaire obtenu, aucun message d'erreur. Utilises-tu des directives de compilation particulières ?

    cdlt

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  7. #7
    Rédacteur/Modérateur

    Avatar de Roland Chastain
    Homme Profil pro
    Enseignant
    Inscrit en
    Décembre 2011
    Messages
    4 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Décembre 2011
    Messages : 4 062
    Points : 15 353
    Points
    15 353
    Billets dans le blog
    9
    Par défaut
    Pas d'erreur ici non plus (FPC 2.6.4, Windows 8).
    Mon site personnel consacré à MSEide+MSEgui : msegui.net

  8. #8
    Membre expert
    Avatar de e-ric
    Homme Profil pro
    Apprenti chat, bienfaiteur de tritons et autres bestioles
    Inscrit en
    Mars 2002
    Messages
    1 550
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Apprenti chat, bienfaiteur de tritons et autres bestioles

    Informations forums :
    Inscription : Mars 2002
    Messages : 1 550
    Points : 3 916
    Points
    3 916
    Par défaut
    J'ai approfondi l'essai et j'ai reproduit ton erreur en exécutant cela :
    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
    program GetMemTest;
     
    uses
      SysUtils;
     
    type
      indCourt = record
        nom     : string;
        adresse : smallInt;
        nbFFB   : longint;
     	end;
      tabIndCourt = array [1..1] of indCourt;
     
    var
      CIndex : ^tabIndCourt;
      CSize: Integer;
     
    begin
      CSize := 1 * sizeof(indcourt);
      GetMem (CIndex, CSize);
      try
        CIndex^[1].Nom := 'Eric';
        CIndex^[2].Nom := 'Autre';
        CIndex^[3].Nom := 'Poum!!';
        WriteLn(CIndex^[1].Nom);
        WriteLn(CIndex^[2].Nom);
        WriteLn(CIndex^[3].Nom);
      finally
        FreeMem(CIndex, CSize);
      end;
        WriteLn(CIndex^[1].Nom);
        WriteLn(CIndex^[2].Nom);
        WriteLn(CIndex^[3].Nom);
    end.
    L'erreur se produit dans les dernières lignes (WriteLn) suite à la désallocation par FreeMem, cela semble normal. est-ce que cela s'approche de ton cas ???

    Ce qui est moins normal, c'est que j'ai alloué pour un élément de tableau mais les 3 affectations sont acceptées et les 3 premiers WriteLn ne provoquent pas non plus d'erreur, je trouve cela très (très) curieux. Un examen rapide des unités heap.inc et heaph.inc (sous Linux) montre aussi un recalcul de la taille demandée, la taille allouée n'est donc pas celle rigoureusement demandée.

    En caviardant le code avec quelques fonctions de la gestion mémoire, on découvre des choses intéressantes (mais mon esprit d'analyse est bien fatigué à cette heure-là).

    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
    #!/usr/bin/instantfpc
    //program GetMemTest; 
     
    uses
      SysUtils;
     
    type
      indCourt = record
        nom     : string;
        adresse : smallInt;
        nbFFB   : longint;
     	end;
      tabIndCourt = array [1..1] of indCourt;
     
    var
      CIndex : ^tabIndCourt;
      CSize: Integer;
     
    begin
      CSize := sizeof(indcourt);
     
      writeln('avant GetMem');
      WriteLn('CurrHeapFree =', GetFPCHeapStatus.CurrHeapFree);
      WriteLn('CurrHeapSize =', GetFPCHeapStatus.CurrHeapSize);
      WriteLn('CurrHeapUsed =', GetFPCHeapStatus.CurrHeapUsed);
     
      GetMem (CIndex, CSize);
      writeln('après GetMem');
      WriteLn('MemSize      =', MemSize(CIndex));
      WriteLn('CSize        =', CSize);
      WriteLn('CurrHeapFree =', GetFPCHeapStatus.CurrHeapFree);
      WriteLn('CurrHeapSize =', GetFPCHeapStatus.CurrHeapSize);
      WriteLn('CurrHeapUsed =', GetFPCHeapStatus.CurrHeapUsed);
     
      CIndex^[1].Nom := 'Eric';
      CIndex^[2].Nom := 'Autre';
      CIndex^[3].Nom := 'Poum!!';
     
      WriteLn(CIndex^[1].Nom);
      WriteLn(CIndex^[2].Nom);
      WriteLn(CIndex^[3].Nom);
      FreeMem(CIndex, CSize);
      writeln('après FreeMem');
      WriteLn('MemSize      =', MemSize(CIndex));
      WriteLn('CurrHeapFree =', GetFPCHeapStatus.CurrHeapFree);
      WriteLn('CurrHeapSize =', GetFPCHeapStatus.CurrHeapSize);
      WriteLn('CurrHeapUsed =', GetFPCHeapStatus.CurrHeapUsed);
     
      WriteLn(CIndex^[1].Nom);
      WriteLn(CIndex^[2].Nom);
      WriteLn(CIndex^[3].Nom);
    end.
    Si quelqu'un a des informations claires sur le sujet, ce serait intéressant de les partager.

    @+

    M E N S . A G I T A T . M O L E M
    Debian 64bit, Lazarus + FPC -> n'oubliez pas de consulter les FAQ Delphi et Pascal ainsi que les cours et tutoriels Delphi et Pascal

    "La théorie, c'est quand on sait tout, mais que rien ne marche. La pratique, c'est quand tout marche, mais qu'on ne sait pas pourquoi. En informatique, la théorie et la pratique sont réunies: rien ne marche et on ne sait pas pourquoi!".
    Mais Emmanuel Kant disait aussi : "La théorie sans la pratique est inutile, la pratique sans la théorie est aveugle."

  9. #9
    Membre du Club
    Homme Profil pro
    Gérant d'un site
    Inscrit en
    Février 2014
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Saône et Loire (Bourgogne)

    Informations professionnelles :
    Activité : Gérant d'un site
    Secteur : Enseignement

    Informations forums :
    Inscription : Février 2014
    Messages : 59
    Points : 44
    Points
    44
    Par défaut Usage de GetMem
    Merci à tous les deux.
    J'utilise devPascal sous window7.
    Mon pgm adapté provient de turboPascal, jamais je n'ai eu de problème, de ce type avec windowsXP.
    Par ailleurs, j'ai adapté le pgm jumeau (il a des données un peu différentes par commodité), il ne m'indique pas d'erreurs.

    Bernard

Discussions similaires

  1. Quel usage faites vous de Python (2004 - 2008) ?
    Par Guigui_ dans le forum Général Python
    Réponses: 130
    Dernier message: 04/12/2008, 00h59
  2. [POI] Usage à partir d'une Servlet
    Par fredmorvant29 dans le forum Servlets/JSP
    Réponses: 8
    Dernier message: 19/07/2004, 16h35

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