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 B r u n o (site web personnel) . Évalué à 2.
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 Ontologia (site web personnel) . Évalué à 1.
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 free2.org . Évalué à 2.
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 xentyr . Évalué à 1.
[^] # Re: segfault n'est pas systématiquement au même endroit
Posté par Ontologia (site web personnel) . Évalué à 1.
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 Duser . Évalué à 1.
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.
[^] # Re: segfault n'est pas systématiquement au même endroit
Posté par gerald dumas . Évalué à -2.
Ok, je sors ---------------------> []
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.