Journal pb de pôinteur en pascal

Posté par  (site web personnel) .
Étiquettes : aucune
0
27
sept.
2003
Ya t'il un pascaleux dans le coinb ? Ca existe encore ? ;o)

j'ai un petit problème : j'ai ecrit un réseau de neurone avec un objet neurone.
lorsque je fait pointer une variable pointeur (Pneurone) sur un tableau de Pneurone et que j'accède ensuite à une varaible de l'objet via ptneurone, ça plante...

comprend pas...

Ptneurone := Reseau[indice]^

J'ai bien initialisé chaque pointeur, chaque liens.

sa structure est la suivante :
Type
PNeurone = ^Neurone;
Neurone = object { Objet neurone}
constructor init(var Consdendrites : synapses;var sortie :Taxone);
function process : Taxone;
dendritesVal : array[1..250] of real{Taxone} ;
dendrites : array[1..250] of Pneurone ;
NeuroneID : string;
NeuroneNum : integer;
ValeurAxone : Taxone;
Destructor apoptose;
End; { prêt à l'addenda}



Procedure ProcessReseau(var ResNeurone : ReseauNeurone; MatriceLettre : MatriceLecture);
var iti, ity,cpt, num : integer;
Ptneurone : Pneurone; (un pointeur sur l'object neurone)
resultante : Taxone;

Begin

new(ptneurone); (avec ou sans, ça change rien)

For iti := 1 to 24 do
for ity := 1 to 24 do
Begin
resultante := ResNeurone[iti*24+ity]^.process;
writeln('Neurone : ',iti*24+ity,' valeur :', resultante);
for cpt := 1 to 200 do
BEgin
Ptneurone := ResNeurone[iti*24+ity]^.dendrites[cpt];
Il plante ici num := ptneurone^.neuronenum;
writeln('Résultante',resultante,' | cpt: ', cpt);
//writeln(Ptneurone^.dendrites[cpt]^.ValeurAxone);
// := resultante;
ENd;
End;
End;

Le problème est le suivant : chaque accès à une valeur de ptneurone^.VARIABLE contenue dans l'objet ---> segmentation fault....
  • # Re: pb de pôinteur en pascal

    Posté par  (site web personnel) . Évalué à 2.

    hooooo, du Pascal, ca fait 10 ans que je n'en avais pas vu au moins! :) et j'ai plus trop de souvenirs, mais ca sent le pbm d'allocation ou de confusion pointeurs/objet pointé

    Et sinon, il plante à la premiere itération ou pas? car avec ton ResNeurone[iti*24+ity] et comme tu commences à iti = 1 et ity = 1, ca fait que tu commences avec un décalage de 25 dans ton tableau. Tu ne déborderais pas un peu?
    • [^] # Re: pb de pôinteur en pascal

      Posté par  (site web personnel) . Évalué à 1.

      ben non, gdb me dit qu'il plante à la 25, 27 ou 29 valeur :*((((

      Je comprend pas, je n'ai pas de débordement, j'ai bien alloué mes pointeurs.
      J'comprend pas...

      Normalement mon pointeur ptneurone pointe sur un autr objet neurone, qui possède une valeur dans le tableau de pneurone...

      Ptet un bug du langage ?

      merci de t'y être penché

      « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

      • [^] # segfault n'est pas systématiquement au même endroit

        Posté par  . Évalué à 2.

        je n'ai aps fait de pascal depuis ... mais

        ben non, gdb me dit qu'il plante à la 25, 27 ou 29 valeur :*((((
        un dépassement de buffer ne fait pas crasher (segment fault) un programme forcément tout de suite. il faut que tu dépasses toute la zone mémoire allouée aux variables de ton programme (quand tu modifie par un pointeur erroné le contenue d'une autre variable, cela ne déclenche pas de fault, mais évidemment cela va déclencher des bugs ...)

        en + la détection du dépassement de cette zone par le proc (segfault) se fait lors du passage à la page mémoire suivante, ce qui complique un peu + les choses

        bref t'as plus qu'à exécuter pas à pas pour comprendre où ça foire (probablement 24 ou 25)
        • [^] # Re: segfault n'est pas systématiquement au même endroit

          Posté par  . Évalué à 1.

          Dans le même genre d'idée, es-tu sûr que Ptneurone := ResNeurone[iti*24+ity]^.dendrites[cpt]; affecte bien ce que tu veux (i.e. que tu ne dépasses pas la taille de ResNeurone, que le tableau dendrites est initialisé,...) ? Regarde aussi pour quelles valeurs de iti, ity, et cpt ça plante.
          • [^] # Re: segfault n'est pas systématiquement au même endroit

            Posté par  (site web personnel) . Évalué à 1.

            J'ai réussi à le faire planté en faisant :

            writeln('Neurone(ptneurone) : ',iti*24+ity,' valeur : ', ResNeurone[iti*24+ity]^.dendrites[cpt]^.dendritesval[cpt]);

            Autrement dit c'est le fait d'aller chercher
            ResNeurone[iti*24+ity]^.dendrites[cpt]^.dendritesval[cpt]


            Neurone1 -> Neurone2.valeur qui le fait planter.

            Je vais qd même vérifier un truc...

            merci encore (promis je met bientôt au C/C++)

            « Il n’y a pas de choix démocratiques contre les Traités européens » - Jean-Claude Junker

            • [^] # Re: segfault n'est pas systématiquement au même endroit

              Posté par  . Évalué à 1.

              Est-ce que tu pourrais donner la déclaration de ReseauNeuronne ?
              En gros est-ce que dendrites est un tableau de pointeurs ?

              Si ce n'est pas le cas,
              "Ptneuronne := ResNeuronne[iti*24+ity]^.dendrites[cpt]"
              est incorrect, comme l'est déjà new(Ptneuronne) puisque tu lui veux lui assigner une adresse plus loin dans le code.

              Ptneuronne := Reseau[indice]^ est incorrect si Ptneuronne est un pointeur et si Reseau[indice] n'est pas un pointeur de pointeur car ^ permet de retrouver une variable sur laquelle pointe un pointeur.

              Pour donner l'adresse d'une variable à un pointeur tu faits (ne le prends pas mal si tu sais déjà faire) : pointeur := @variable

              Si tu peux montrer ton code source, je veux bien y jetter un coup d'oeil. Ca fait pas longtemps que je programme mais j'aime bien le Pascal.

              Pour plus de précision n'hésite pas à demander.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.