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 :

Ecrasement variable incompréhensible


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut Ecrasement variable incompréhensible
    Bonjour à tous,
    je suis nouveau mais je me permets de venir poster ici car j'ai un souci que je ne sais pas réglé.
    J'explique mon problème:

    J'ai un code qui dispose des instructions suivantes :

    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
    //declaration d'un tableau
    int row_ptr[]={0,2,5,8,12,16,19};
    //affichage de l'adresse
    printf("&row_ptr = %p\n",&row_ptr);
    //affectation au champ rowPtr du tableau
    matCSR.rowPtr=row_ptr;
    //affichage de l'adresse
    printf("&matCSR.rowPtr = %p\n",&matCSR.rowPtr[0]);     
    //[...]
    //affichage un peu plus loin dans le code
    printf("&matCSR.rowPtr= %p\n",&matCSR.rowPtr[0]);
    //creation d'une nouvelle variable et affectation
    Partial_Mat_CSR_t info_matCSR=convertToPartialCSRFormat(&matCSR_block_tmp);
    //affichage de l'adresse de cette variable
    printf("&info_matCSR = %p\n",&info_matCSR);
    et lorsque j'execute j'obtiens ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    &row_ptr = 0x7fff82115c40
    &matCSR.rowPtr = 0x7fff82115c40
     
    &matCSR.rowPtr= 0x7fff82115c40
    &info_matCSR = 0x7fff82115c40
    et lorsque j'affiche le contenu de mon tableau à la fin j'obtiens :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ROW POINTER : [  6   6  19   6   6  19   1  ]
    Donc ma variable info_matCSR a pour adresse la même que celle de row_ptr et je ne comprends pas pourquoi ...
    Quelqu'un a déja été dans ce cas la?
    Merci d'avance de m'aider ou de me donner des pistes.

  2. #2
    Membre actif Avatar de moins1
    Homme Profil pro
    Autre
    Inscrit en
    Février 2013
    Messages
    85
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Autre
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Février 2013
    Messages : 85
    Points : 222
    Points
    222
    Par défaut
    Pas écrit divination en haut du forum, si?

    C'est quoi Partial_Mat_CSR_t?
    Aussi convertToPartialCSRFormat(&matCSR_block_tmp)?

    Tu utilises une librairie, la moindre des choses serait de nous dire laquelle.


  3. #3
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Salut,

    Tu souffres d'une crise de commentinite aiguë ! Tu commentes trop mais surtout tes commentaires ne donnent pas d'informations pertinentes. Exemple de "//declaration d'un tableau" : n'importe quel programmeur le sait, ce commentaire n'a donc pas lieu d'être. Un commentaire plus utile aurait été "tableau des points à tracer" (si tel est son rôle, mais tu comprends l'idée ). De même avec "//creation d'une nouvelle variable et affectation" qui aurait dû être "matrice des éléments qui ont tel rôle".

    Cela est important car tes commentaires n'aident pas à comprendre le code. Tu décris chaque ligne en terme d'opération technique (couper une planche, planter un clou) et non en terme d'objectif (construire une porte).

    Pour parler de ton problème, il nous faut le type de matCSR, mais je sens venir que c'est une structure donc le premier élément est le champ rowPtr. Or, une structure et son premier élément ont la même adresse. Ou alors le fait que matCSR.rowPtr=row_ptr; ne fait pas de recopie du tableau mais seulement une affectation d'adresse.

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Bonjour,

    J'ai beaucoup rigolé cette nuit quand je suis rentré avec vos deux messages!! Merci ça détend ^^


    Alors je vais tacher de reprendre correctement.
    Le contexte : je bosse actuellement sur les matrices et la résolution d'equation. Les matrices sont stockées sous un format particulier que l'on appelle CSR (Compressed Sparse Row) car les matrices sont creuses ( remplies de 0 ).

    Dans ce cadre là, je suis amené à declarer une variable représentant ma matrice qui est de type Mat_CSR_t. Ce type est une structure de la forme suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    typedef struct {
      int M;
      int N;
      int nnz;
      int m;
      int n;
      int lnnz;
      int blockSize;
      Mat_CSR_format_t format;
      int* rowPtr;
      int* colInd;
      double* val;
    } Mat_CSR_t;
    En outre j'utilise openMPI pour avoir un code parallèle. Il se trouve que j'envoie donc une partie de cette structure sur le réseau aux cores disponibles. J'ai donc créé une structure partielle quie vous vous en douterez s'appelle Partial_Mat_CSR_t qui contient juste les champs int de la structure complète.

    J'ai donc créé une fonction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Partial_Mat_CSR_t convertToPartialCSRFormat(Mat_CSR_t *matCSR)
    qui me retourne les informations nécessaires.

    Il est à noter que je n'utilise aucune lilbrairy exterieur car je dois rester indépendant de tout ( ou presque ^^ ).

    Il en découle une phase de test pour valider le bon fonctionnement de mon code. J'ai alors créé un tableau row_ptr ( qui ne sert que pour les tests ) et j'ai alors le code suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int row_ptr[]={0,2,5,8,12,16,19};
     
    printf("&row_ptr = %p\n",&row_ptr);
     
    matCSR.rowPtr=row_ptr;
     
    printf("&matCSR.rowPtr = %p\n",&matCSR.rowPtr[0]);     
     
    Partial_Mat_CSR_t info_matCSR=convertToPartialCSRFormat(&matCSR_block_tmp);
     
    printf("&info_matCSR = %p\n",&info_matCSR);
    Je joins aussi le code de la fonction qui est très basique:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Partial_Mat_CSR_t convertToPartialCSRFormat(Mat_CSR_t *matCSR){
    	Partial_Mat_CSR_t matCSR_tmp;
     
    	matCSR_tmp.M=matCSR->M;
    	matCSR_tmp.N=matCSR->N;
    	matCSR_tmp.nnz=matCSR->nnz;
    	matCSR_tmp.m=matCSR->m;
    	matCSR_tmp.n=matCSR->n;
    	matCSR_tmp.lnnz=matCSR->lnnz;
    	matCSR_tmp.blockSize=matCSR->blockSize;
    	matCSR_tmp.format=matCSR->format;
     
    	return matCSR_tmp;
    }
    J'espère avoir été plus clair et je m'excuse de mon message précédent plus que concis.

    EDIT : du coup plus personne ne répond... ils étaient bien mes petits commentaires finalement XD

  5. #5
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Je trouve ça étonnant pour le coup... Je ne pense pas que le compilateur en voyant que tes deux variables sont identiques va les "fusionner", ça n'aurait aucun sens. Si tu modifies l'une des deux structures, est-ce que l'autre l'est aussi ? D'après ton post je dirais que non, ce qui me rend encore plus perplexe.

    Quelque chose que j'éviterais de faire par contre :

    Je passerais plutôt par une allocation dynamique (malloc / free) et ferais un memcpy pour copier les infos d'un tableau dans l'autre.

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup imperio!!

    J'ai fait à peu près, pour tester, ce que tu me recommandais à savoir remplacer :
    par cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    matCSR.rowPtr=(int*)malloc(7*sizeof(int));
    for(int i=0;i<7;i++)
           matCSR.rowPtr[i]=row_ptr[i];
    Et cela résoud mon problème!

    Faut il y comprendre que le compilateur ne voit pas qu'un pointeur pointe sur ce tableau?
    En tous les cas maintenant je n'ai plus d'erreur d'écrasement! Merci beaucoup!

  7. #7
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par moi
    Ou alors le fait que matCSR.rowPtr=row_ptr; ne fait pas de recopie du tableau mais seulement une affectation d'adresse.
    C'est pas parce que le début de mon message est marrant qu'il ne faut pas en lire la fin ! (au passage, pour imperio)

    Faut il y comprendre que le compilateur ne voit pas qu'un pointeur pointe sur ce tableau?
    Aie... Dans ton code, il ne semble pas qu'il y ait un pointeur qui pointe sur un tableau. Il y a un tableau d'un côté et une structure avec un pointeur de l'autre. Un tableau et un pointeur ne sont pas interchangeables. En fait, il n'y a même pas de tableau stricto sensu dans la ligne :
    Dans cette expression, row_ptr n'est pas le tableau lui-même mais est automatiquement converti en un pointeur vers son premier élément.

    Tu pourras lire cet article sur le sujet.

  8. #8
    Membre émérite
    Avatar de imperio
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2010
    Messages
    852
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2010
    Messages : 852
    Points : 2 298
    Points
    2 298
    Par défaut
    Citation Envoyé par Bktero Voir le message
    C'est pas parce que le début de mon message est marrant qu'il ne faut pas en lire la fin !
    C'est justement parce que tu l'avais mis que je pensais qu'il avait vérifié et que du coup le problème ne venait pas de là. Ça me parait déjà plus logique maintenant !

  9. #9
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    5
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 5
    Points : 6
    Points
    6
    Par défaut
    Excusez moi, je n'avais pas compris ce que signifiait :
    Ou alors le fait que matCSR.rowPtr=row_ptr; ne fait pas de recopie du tableau mais seulement une affectation d'adresse.
    Pour moi, cela n'était pas embétant. Je comprends aisément que cela est une affectation d'adresse et c'est ce que je cherchais à faire. Je pensais que le programme de débrouillait pour soit garder ça sur la pile, soit le déplacer ...
    Mais après réflexion, je comprends que c'était idiot de ma part!
    Donc merci de m'avoir été et je m'incline devant ta réponse Bktero

    Et je suis en train de regarder ton lien! Je découvre pleins de choses ^^ ( je n'ai jamais vraiment appris le C et ça ne fait qu'un mois et demi que je code en C ).

    Bref Merci beaucoup à vous pour votre aide et vos explications!

  10. #10
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Juin 2009
    Messages
    4 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 481
    Points : 13 679
    Points
    13 679
    Billets dans le blog
    1
    Par défaut
    Excusez moi, je n'avais pas compris ce que signifiait
    Tu es tout excusé

    N'hésite pas à demander plus de détails sur certains points que tu n'es pas sûr de comprendre, le but est aussi que tu progresses et comprennes et non de simplement corriger les erreurs

    De rien pour les explications.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Changement de variable incompréhensible
    Par 2rock dans le forum C
    Réponses: 4
    Dernier message: 11/11/2009, 17h13
  2. Réponses: 3
    Dernier message: 06/04/2008, 17h54
  3. Construire un formulaire qui ecrase les variables hidden
    Par Battosaiii dans le forum Servlets/JSP
    Réponses: 7
    Dernier message: 14/04/2006, 11h58
  4. [POO] petite khôle variable ecrasée
    Par jeff_! dans le forum Langage
    Réponses: 5
    Dernier message: 01/02/2006, 21h13

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