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

C Discussion :

Bug?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut Bug?
    Bonjour,
    J'ai un problème dont je n'arrive pas à déceler la cause:
    J'appelle une fonction dont je suis sur qu'elle fonctionne. Je ne parviens pas à
    afficher la valeur de tau à l'intérieur de cette fonction si le printf est situé après une fonction appartenant à une bibliothèque nommée libgsl, s'il est situé avant, je peux l'afficher. Pouvez vous m'indiquer pourquoi et résoudre mon problème? Merci, voici la partie importante de la fonction avec printf (en fin de code) qui génére un blocage de mon programme:

    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
    int
    gsl_linalg_complex_QR_decomp (gsl_matrix_complex * A, gsl_vector_complex * tau)
    {
      const size_t M = A->size1;
      const size_t N = A->size2;
     
      gsl_vector_complex_view c_full;
      gsl_vector_complex_view c;
      gsl_complex tau_i;
      gsl_matrix_complex_view m;
     
      if (tau->size != GSL_MIN (M, N))
        {
          GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
        }
      else
        {
          size_t i;
     
          for (i = 0; i < GSL_MIN (M, N); i++)
            {
              /* Compute the Householder transformation to reduce the j-th
                 column of the matrix to a multiple of the j-th unit vector */
            c_full = gsl_matrix_complex_column (A, i);
            c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    		printf ("m(%d,%d) = %f + i %f\n", 0, 0,
    		gsl_vector_complex_get (tau, 1));

  2. #2
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf ("m(%d,%d) = %f + i %f\n", 0, 0, gsl_vector_complex_get (tau, 1));
    Déjà il manque un paramètre à cette fonction, je suppose un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gsl_vector_complex_get (tau, 0)
    Mais ceci ne provoquerait pas le blocage dont tu parles...

    Poste aussi le code qui pose un problème, sinon regarde avec un debugger si l'appel gsl_vector_complex_get termine ou sinon tente ce code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    float reel,imag;
     
    printf("Avant:\n");
    reel = gsl_vector_complex_get (tau, 0);
    printf("Entre:\n");
    imag = gsl_vector_complex_get (tau, 1);
    printf("m(%d,%d) = %f + i %f\n", 0, 0, reel,imag);
    Jc

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Ce n'est pas gsl_vector_complex_get qui pose problème puisqu'elle fonctionne située avant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    c_full = gsl_matrix_complex_column (A, i);
            c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    J'ai l'impresion que ces fonctions génerent la perte de tau. J'ai pensé à un problème d'extern mais je n'arrive pas à mettre tau en externe car il est d'un type prédéfini?

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Je réexplique autrement mon problème. J'ai réalisé un projet qui fonctionne très bien où dans le main la fonction gsl_linalg_complex_QR_decomp (1) inclue au projet est appelée. J'ai insérré ce même code dans un plus gros projet mais il provoque le blocage du programme. J'ai aussi localisé la source du problème, une fonction interne à (1) nommée gsl_vector_complex_set (tau, i, tau_i) (2) appartenant à une bibliothèque. Ce qui m'intrigue c'est que cette fonction fonctionnait très bien dans mon premier projet. Je me suis donc dit que cela était lié à des problèmes de règles de portée. J'ai donc tenté de voir si la variable tau appellée par (1) et (2) était perdue, ce qui semble être le cas puisque je ne parviens pas à "printer" sa valeur partout dans (1). voici (1):
    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
    int
    gsl_linalg_complex_QR_decomp (gsl_matrix_complex * A, gsl_vector_complex * tau)
    {
      const size_t M = A->size1;
      const size_t N = A->size2;
     
      if (tau->size != GSL_MIN (M, N))
        {
          GSL_ERROR ("size of tau must be MIN(M,N)", GSL_EBADLEN);
        }
      else
        {
          size_t i;
     
          for (i = 0; i < GSL_MIN (M, N); i++)
            {
              /* Compute the Householder transformation to reduce the j-th
                 column of the matrix to a multiple of the j-th unit vector */
     
              gsl_vector_complex_view c_full = gsl_matrix_complex_column (A, i);
              gsl_vector_complex_view c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    "!!!!!!!!!!!!!!!!!!!"
              gsl_complex tau_i = gsl_linalg_complex_householder_transform (&(c.vector));
     
              gsl_vector_complex_set (tau, i, tau_i);
     
              /* Apply the transformation to the remaining columns and
                 update the norms */
     
              if (i + 1 < N)
                {
                  gsl_matrix_complex_view m = gsl_matrix_complex_submatrix (A, i, i + 1, M - i, N - (i + 1));
                  gsl_linalg_complex_householder_hm (tau_i, &(c.vector), &(m.matrix));
                }
            }
          return GSL_SUCCESS;
        }
    }
    J'ai indiqué par un "!!!!!" l'endroit où était perdue tau.

  5. #5
    Expert confirmé

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gsl_vector_complex_view c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    Es-tu sûr de tes bornes [i,M-i]? Que se passe-t-il si M > N?

    Jc

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    241
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2005
    Messages : 241
    Par défaut
    Oui, c'est sûr puisque le même bout de code fonctionne dans un autre projet. Pour info, j'ai enlevé dans les paramètres du projet le /QZ sous visual mais je ne pense pas que cela soit lié. J'ai remarqué que l'appel des fonctions
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     c_full = gsl_matrix_complex_column (A, i);
              c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    de la biblio faisait perdre tau donc il y a un bloquage à la fonction suivante qui appelle tau mais je n'arrive pas à résoudre ce pb, une idée?
    Merci encore.

  7. #7
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
      gsl_vector_complex_view c_full = gsl_matrix_complex_column (A, i); 
      gsl_vector_complex_view c = gsl_vector_complex_subvector (&(c_full.vector), i, M-i);
    Sauf erreur de ma part à la lecture de ton code, ce sont les seules fonctions qui ont des effets de bords sur la fonction gsl_linalg_complex_QR_decomp avant le bug détecté. Ou les arguments ne sont pas corrects ou correctement dimensionnés (c_full.vector) ou c'est le cas des valeurs de retour (c_full ou c) ou le code d'une ou des deux fonctions est bugué

Discussions similaires

  1. Réponses: 2
    Dernier message: 06/03/2003, 16h37
  2. Bug new build ??
    Par rgarnier dans le forum XMLRAD
    Réponses: 4
    Dernier message: 31/01/2003, 10h30

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