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 :

comparer la valeur d'un pointeur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Par défaut comparer la valeur d'un pointeur
    Bonjour à tous,

    Me revoila encore avec mes tableaux doubles entrées...

    Alors voila, j'ai un tableau de 255 lignes et 255 colonnes qui est déja rempli. j'ai deux variables int u et v et je voudrais faire une action à chaque fois que tableau[u][v] est supérieur à 10 par exemple.

    Voila le code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int* tab_reference[255][255];
    int u=0;
    int v=0;
    u=ess.val[1];
    v=ess.val[2];
     
    printf("u=%d  et v=%d\n",u,v);
    printf("tab reference = %d\n",tab_reference[u][v]);
    if(*(tab_reference[u][v]) > 5)
    { 
    //faire quelque chose
    					}
    Alors voila il ya plusieurs choses que je comprends pas : on m'a appris que lorsque l'on déclarait un pointeur avec une étoile comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* tab_reference[255][255];
    pour obtenir la valeur de mon pointeur (son contenu pas son adresse ) il fallait mettre une étoile devant, or le printf marche très bien...

    Ensuite j'ai d'abord fais une condition :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((tab_reference[u][v]) !=0)
    et la tout marchait bien. Puis j'ai voulu la modifier et mettre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((tab_reference[u][v])>5)
    et c'est la que les ennuis ont commencé... j'ai obtenu l'erreur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2446: '>'*: pas de conversion de 'int' en 'int *'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error C2040: '>'*: les niveaux d'indirection de 'int *' et de 'int' sont différents
    ...
    C'est pour ca que j'ai mis une étoile dans le code en haut dans ma condition. Ainsi le programme compile très bien mais dès que j'execute, le programme cesse de fonctionner sans aucune explication...

    J'espère avoir été assez claire... désolée pour l'édit,erreur de manip.

    Merci pour vos réponses

  2. #2
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int* tab_reference[255][255];
    est un tableau à 2 dimensions de pointeurs sur des entiers !

    Le test suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((tab_reference[u][v]) !=0)
    porte sur le pointeur et non sur le contenu pointé, il est d'ailleurs équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if((tab_reference[u][v]) !=NULL)
    Quand tu écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if(*(tab_reference[u][v]) > 5)
    tu testes le contenu pointé (= contenu à l'adresse référencée par le pointeur).

    Dans le cas de ton tableau, que tu n'as pas initialisé, les pointeurs indiquent n'importe quelles valeurs(= adresses) : il devient donc risqué de regarder les valeurs présentes aux emplacements pointés. Tu vois ce que je veux dire ?

  3. #3
    Membre confirmé Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Par défaut
    Merci pour ta réponse,

    Mais si si mon tableau est initialisé (par une fonction un peu avant dans mon programme)

    pour être exacte
    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
     
    int* tab_reference[255][255];
     
    //fonction qui initialise tab_reference;
    int u=0;
    int v=0;
    u=ess.val[1];
    v=ess.val[2];
     
    printf("u=%d  et v=%d\n",u,v);
    printf("tab reference = %d\n",tab_reference[u][v]);
    if(*(tab_reference[u][v]) > 5)
    { 
    //faire quelque chose
    					}
    Alors ce que je ne comprends pas et ce qui m'énerve de ne pas comprendre c'est : si tab_reference[u][v] porte sur le pointeur et non le contenu pointé pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("tab reference = %d\n",tab_reference[u][v]);
    me renvoie bien les valeurs que je veux, c'est à dire les valeurs que j'ai initialement mis dans mon tableau???(en fait j'ai fais ce printf pour voir si j'avais bien initialisé mon tableau...)

    Merci en tout cas

  4. #4
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Tu as mis le même bout de code que tout à l'heure qui ne contient aucune initialisation.
    Après tu as initialisé ton tableau en fixant les valeurs de tab_reference[u][v] directement à des entiers, c'est qu'il faut vraiment que tu ailles revoir tes cours.

    En effet :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("tab reference = %d\n",tab_reference[u][v]);
    permet d'afficher les adresses des variables pointées (= contenu du pointeur) et non leur contenu ...

  5. #5
    Membre confirmé Avatar de suzan_
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 87
    Par défaut
    Citation Envoyé par TheGzD Voir le message
    Tu as mis le même bout de code que tout à l'heure qui ne contient aucune initialisation.
    Après tu as initialisé ton tableau en fixant les valeurs de tab_reference[u][v] directement à des entiers, c'est qu'il faut vraiment que tu ailles revoir tes cours.
    désolé, mais le code est bien différent ^^. j'avais rajouté un petit commentaire pour dire ://ici j'ai une initialisation de mon tableau. je veux bien mettre la fonction qui fais ça même si je pense que ça n'a pas d'importance...
    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
     
    int* tab_reference[255][255];
     
    //fonction qui initialise tab_reference;
    reference_matrix("myfile.txt");
     
    int u=0;
    int v=0;
    u=ess.val[1];
    v=ess.val[2];
     
    printf("u=%d  et v=%d\n",u,v);
    printf("tab reference = %d\n",tab_reference[u][v]);
    if(*(tab_reference[u][v]) > 5)
    { 
    //faire quelque chose
    					}
    et la fonction d'initialisation :
    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
    void reference_matrix(const char* filename)
     {
    	int i=0;
    	int j=0;
    	FILE* file=NULL;
    	file =fopen(filename,"r");
    	if(file != NULL){
    	for (i=0 ;i<255;i++){
    		for(j=0;j<255;j++){
    			fscanf(file,"%d ",&tab_reference[i][j]);	
    		}
    	}
    	fclose(file);
    	}
     
     }
    tab_reference est une variable globale, définie en dehors du main.


    En effet :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("tab reference = %d\n",tab_reference[u][v]);
    permet d'afficher les adresses des variables pointées (= contenu du pointeur) et non leur contenu ...
    d'accord donc je suis censé mettre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    printf("tab reference = %d\n",*tab_reference[u][v]);
    le problème c'est qu'avec l'étoile le programme ne se lance plus, il me dit à arrêter de fonctionner...
    Donc je suis d'accord : pour acceder à la valeur contenu dans mon tab_reference je devrai en théorie faire *tab_reference[u][v] mais pourquoi le programme ne se lance pas???
    Est-ce qu'il y a une erreur dans l'initialisation??

    Merci de m'aider (et désolé pour la pause déjeuner!!)

  6. #6
    Membre éprouvé
    Avatar de TheGzD
    Homme Profil pro
    Ingénieur/ Docteur en Informatique
    Inscrit en
    Avril 2007
    Messages
    1 327
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : Ingénieur/ Docteur en Informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 327
    Par défaut
    Est-ce qu'il y a une erreur dans l'initialisation??
    le problème est celui que l'on t'as énoncé précédemment : tu initialises les pointeurs avec un int au lieu de l'adresse d'un int !

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Citation Envoyé par suzan_ Voir le message
    Alors ce que je ne comprends pas et ce qui m'énerve de ne pas comprendre c'est : si tab_reference[u][v] porte sur le pointeur et non le contenu pointé pourquoi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("tab reference = %d\n",tab_reference[u][v]);
    me renvoie bien les valeurs que je veux, c'est à dire les valeurs que j'ai initialement mis dans mon tableau???(en fait j'ai fais ce printf pour voir si j'avais bien initialisé mon tableau...) Merci en tout cas
    Parce que, syntaxiquement, printf() ne peut pas savoir à l'avance si le paramètre que tu lui passes correspond bien au jeton que tu as placé dans ta chaîne de formatage. Ceci ne concerne que la bibliothèque C à l'exécution et même là, on est obligé de faire confiance à l'utilisateur. Certains compilateurs « intelligents » incluent des contrôles spéciaux sur les fonctions standard les plus connues et sont à même de générer des avertissements quand même mais il ne faut pas compter dessus.

    D'autre part, tu as probablement rempli ton tableau de pointeurs avec des entiers. Étant donné qu'une adresse mémoire est en elle-même un nombre entier et qu'elle a généralement le même format. Il est très facile de transtyper un nombre entier en pointeur en mémoire. Cela revient simplement à dire au compilo « le nombre 123456 est une adresse mémoire, celle de ma variable xxxx ». Et comme le type de chaque côté de l'affectation « = » est connu, le transtypage devait être implicite.

    Le compilateur t'a donc fait confiance et considéré l'opération comme légale, mais il n'en reste pas moins qu'officiellement, ce sont des pointeurs qu'il te sert et pas des nombres entiers. Tant que tu peux les convertir ou que tu utilises des opérations qui sont applicables aux deux, pas de problème. Dès que tu commences à faire des calculs, évidement, les problèmes vont surgir.

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

Discussions similaires

  1. Comparer une valeur à plus ou moins quelque chose...?
    Par Thierry8 dans le forum Langage
    Réponses: 4
    Dernier message: 11/10/2005, 13h17
  2. comparer des valeurs
    Par nah_wah dans le forum Langage
    Réponses: 15
    Dernier message: 23/09/2005, 14h32
  3. Réponses: 3
    Dernier message: 11/08/2005, 15h54
  4. comparer les valeurs d'un tableau
    Par nicerico dans le forum ASP
    Réponses: 4
    Dernier message: 19/08/2004, 11h20
  5. [RegEdit] comparer 2 valeurs
    Par Halleck dans le forum Windows
    Réponses: 2
    Dernier message: 15/03/2004, 21h51

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