Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1478 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [RESOLU] Signal SIGABRT dans mon programme sous Ubuntu

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Signal SIGABRT dans mon programme sous Ubuntu

n°1592894
nieahaiban​e
Posté le 29-07-2007 à 12:18:33  profilanswer
 

Bonjour à tous,
 
Je développe depuis peu sous Ubuntu en C++. Je réalise un moteur 3D en raytracing avec photonmapping et ça marchait très bien sous windows.
Le passage sous linux m'a forcé à me séparer de quelques bibliothèques très pratiques que je dois reprogrammer, en particulier la gestion des matrices.
 
Le programme fonctionnait très bien jusqu'à maintenant. En le lancant, j'ai une erreur que je n'avais pas avant (sous Ubuntu), je ne sais pas pourquoi ça me le fait maintenant mais je connais avec gdb la ligne de code où ça plante et je ne comprends pas l'origine.
 
Le message d'erreur est le suivant : Program received signal SIGABRT, Aborted.
Cette ligne est précédée de pas mal de valeurs mais peu de texte.
 
Voici le code de la fonction à problème :
Cmatrix
Cmatrix::operator *(const Cmatrix &mat) const
{
 if (mNumCol!=mat.mNumRow)
  return Cmatrix(0, 0);
 
 int r, c, d;
 Cmatrix res(mNumRow, mat.mNumCol);
 
 for (r=0; r<res.mNumRow; r++)
  for (c=0; c<res.mNumCol; c++)
  {
   res[r][c] = 0.0;
 
   for (d=0; d<mNumCol; d++)
    res[r][c] += (*this)[r][d] * mat[d][c];
  }
 
 
 double w = res[res.mNumRow-1][res.mNumCol-1];
 
 if (w!=0.0 && w!=1.0)
  for (r=0; r<res.mNumRow; r++)
   for (c=0; c<res.mNumCol; c++)
    res[r][c] /= w;
 
 return res;
}

 
et ça plante à la dernière ligne : }
j'appelle la fonction ainsi : Vertex = Scale*Vertex;
 
Je me demande si je n'ai pas désinstallé involontairement une bibliothèque en supprimant des logiciels que j'essayais
Vous avez des pistes?


Message édité par nieahaibane le 07-08-2007 à 22:07:48
mood
Publicité
Posté le 29-07-2007 à 12:18:33  profilanswer
 

n°1592899
Taz
bisounours-codeur
Posté le 29-07-2007 à 12:40:49  profilanswer
 

on espère tous pour toi que tu utilises std::vector<double>

n°1592901
nieahaiban​e
Posté le 29-07-2007 à 12:46:56  profilanswer
 

Non, les variables membres de ma classe Cmatrix sont :
double *mData;
int mNumRow;
int mNumCol;
 
mData est un tableau à 1 dimension et j'accède aux données avec ces opérateurs :
double* operator [](int i) { return mData + i*mNumCol; }
const double* operator [](int i) const { return mData + i*mNumCol; }

 
Les matrices étant utilisées plusieurs millions de fois, je me passe de la classe vector pour augmenter la rapidité des calculs (j'ai fait des tests).

n°1592902
Taz
bisounours-codeur
Posté le 29-07-2007 à 12:49:57  profilanswer
 

bah tu veux jouer au grand, alors assume. Sors ton debugger et bon courage.

 

edit: nan en fait les grands utilisent les multiarray de boost.


Message édité par Taz le 29-07-2007 à 12:50:59
n°1592907
Taz
bisounours-codeur
Posté le 29-07-2007 à 12:56:20  profilanswer
 

au fait, superbe exemple d'optimisation prématurée d'un truc ne fonctionnant même pas.

n°1592923
nieahaiban​e
Posté le 29-07-2007 à 13:33:08  profilanswer
 

Merci Taz pour tes messages très constructifs...
Ca marchait très bien sous Windows et purify ne me trouvais aucune erreur ni warning, aucun dépassement de mémoire.
Et franchement, je ne vois pas du tout ce que vector apporterais dans ce cas.
Quelqu'un d'autre pour donner un avis constructif?

n°1593004
_darkalt3_
Proctopathe
Posté le 29-07-2007 à 18:39:39  profilanswer
 

passer le debugger et vérifier les valeurs des variables en jeu ?


---------------
Töp of the plöp
n°1593012
nieahaiban​e
Posté le 29-07-2007 à 19:07:24  profilanswer
 

Oui, c'est la première chose que j'ai faite.
j'ai bien vérifié que les index n'allaient pas au dela des tableaux.
L'erreur se produit vraiment à la fin de la fonction, après même le return.

n°1593017
KangOl
Profil : pointeur
Posté le 29-07-2007 à 19:20:51  profilanswer
 

donc lors de la liberation de mémoire...

n°1593034
nieahaiban​e
Posté le 29-07-2007 à 20:13:35  profilanswer
 

Ok, voici mon constructeur et destructeur :
 
Cmatrix::Cmatrix(int numRow, int numCol)
{
 mNumRow = 0;
 mNumCol = 0;
 mData = NULL;
 
 if (numRow>0 && numCol>0)
 {
  mNumRow = numRow;
  mNumCol = numCol;
  mData = new double[numRow*numCol];
  memset(mData, 0, sizeof(double)*numRow*numCol);
 }
}
 
 
Cmatrix::~Cmatrix()
{
 if (mData!=NULL)
  delete [] mData;
}

 
Entre temps, j'essaie de passer par des matrices à dimensions fixes (4x4 et 4x1) car je n'utilise que des matrice de transformation et des vecteurs.
Si je trouve la raison plus tard, après m'être familiarisé avec les outils de debugage de linux, je ne manquerais pas de donner son origine et sa solution (si j'en trouve une).

mood
Publicité
Posté le 29-07-2007 à 20:13:35  profilanswer
 

n°1593047
Taz
bisounours-codeur
Posté le 29-07-2007 à 21:19:53  profilanswer
 

un tel code est complètement baisé ...

n°1593048
Taz
bisounours-codeur
Posté le 29-07-2007 à 21:20:12  profilanswer
 

et donc utilise std::vector<> ou ouvre un livre

n°1596955
nieahaiban​e
Posté le 07-08-2007 à 22:01:13  profilanswer
 

Je suis finalement repassé à des matrices de dimensions fixes et ça marche mieux.
J'ai ré-essayé avec vector mais les temps de calculs explosent, je préfère donc m'en passer tant que c'est possible.
Pour ceux que ça intéresse, voici quelques images générées par mon moteur  : http://s.a.partage.free.fr/raytracing.html

n°1596962
IrmatDen
Posté le 07-08-2007 à 22:31:57  profilanswer
 

Boost::array n'a pas la lenteur de vector; donc si tes tableaux sont finalement fixes, ça vaut sans doute le coup d'y jeter un oeil.

n°1596965
nieahaiban​e
Posté le 07-08-2007 à 22:36:08  profilanswer
 

Merci IrmatDen. Je pense rester sur des matrices à dimensions fixes pour ce cas là mais j'étudierai ça pour mes futurs développements.


Message édité par nieahaibane le 07-08-2007 à 22:36:21
n°1597636
Taz
bisounours-codeur
Posté le 09-08-2007 à 12:07:41  profilanswer
 

nieahaibane a écrit :

Je suis finalement repassé à des matrices de dimensions fixes et ça marche mieux.
J'ai ré-essayé avec vector mais les temps de calculs explosent, je préfère donc m'en passer tant que c'est possible.


Aucune raison. La différence est d'une seule indirection. Ton problème est ailleurs.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [RESOLU] Signal SIGABRT dans mon programme sous Ubuntu

 

Sujets relatifs
[Résolu] MySql : Dernière entrée qui apparait en premier?[Resolu] repaint(), je comprends pas.
[Résolu] Problème de décalage de date java sous windows vista[résolu] extraction du nom de fichier d'une url
Execution d'un programme[RESOLU] MySQL jointure sur clé primaire LENTE
[RESOLU] exec -> exit php[Résolu] Affichage variable de champs texte en Dreamweaver
Programme pour modification en ligne 
Plus de sujets relatifs à : [RESOLU] Signal SIGABRT dans mon programme sous Ubuntu


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR