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

Linux Discussion :

Valeur d'un pointeur non modifiée


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut Valeur d'un pointeur non modifiée
    Bonjour,

    Voilà, j'ai un petit problème avec un pointeur sur un tableau d'entier.
    Ce pointeur est définis comme tel dans un header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef	_SERVER_RESOURCES_H_
    #define _SERVER_RESOURCES_H_
    ...
    int * array_ptr;
     
    int create_array(void);
     
    #endif     /* _SERVER_RESOURCES_H_ */
    Lorsque je démarre mon programme "server", j'alloue et initialise ce pointeur grâce à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int create_array(void)
    {
    	int i;
     
    	srand(time(NULL));
     
    	array_ptr = (int *)malloc(ARRAY_SIZE * sizeof(int));
    	for(i = 0; i < ARRAY_SIZE; i++)
    		*(array_ptr+i) = rand()%19 + 1;
     
    	return 0;
    }
    Jusque là tout ce passe bien mais le problème survient quand je désire modifier les valeurs de ce tableau. En effet, j'ai beau lui attribuer une nouvelle valeur avec (ces fonctions se trouvent dans un autre fichier qui inclut le "server_resources.h" du dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int setI(int i, int val)
    {
    	printf("SETI : %d\n", val);
     
    	if(i >= 0 && i < ARRAY_SIZE)
    	{
    		*(array_ptr+i) = val;
    		return 0;
    	}
     
    	return -1;
    }
    celle-ci ne veut pas changer. Elle se modifie uniquement dans la fonction or j'aurais besoin qu'il se modifie de manière globale pour que lorsque j'appelle une autre fonction, celle-ci s'exécute sur les nouvelles valeurs. Ce que je croyais possible en déclarant le pointeur dans le .h.

    Merci.

  2. #2
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Citation Envoyé par Dimitri_87 Voir le message
    Bonjour,

    Voilà, j'ai un petit problème avec un pointeur sur un tableau d'entier.
    Ce pointeur est définis comme tel dans un header :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    #ifndef	_SERVER_RESOURCES_H_
    #define _SERVER_RESOURCES_H_
    ...
    int * array_ptr;
     
    int create_array(void);
     
    #endif     /* _SERVER_RESOURCES_H_ */
    Lorsque je démarre mon programme "server", j'alloue et initialise ce pointeur grâce à la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int create_array(void)
    {
    	int i;
     
    	srand(time(NULL));
     
    	array_ptr = (int *)malloc(ARRAY_SIZE * sizeof(int));
    	for(i = 0; i < ARRAY_SIZE; i++)
    		*(array_ptr+i) = rand()%19 + 1;
     
    	return 0;
    }
    Jusque là tout ce passe bien mais le problème survient quand je désire modifier les valeurs de ce tableau. En effet, j'ai beau lui attribuer une nouvelle valeur avec (ces fonctions se trouvent dans un autre fichier qui inclut le "server_resources.h" du dessus) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    int setI(int i, int val)
    {
    	printf("SETI : %d\n", val);
     
    	if(i >= 0 && i < ARRAY_SIZE)
    	{
    		*(array_ptr+i) = val;
    		return 0;
    	}
     
    	return -1;
    }
    celle-ci ne veut pas changer. Elle se modifie uniquement dans la fonction or j'aurais besoin qu'il se modifie de manière globale pour que lorsque j'appelle une autre fonction, celle-ci s'exécute sur les nouvelles valeurs. Ce que je croyais possible en déclarant le pointeur dans le .h.

    Merci.
    Non tu dois déclarer ton pointeur dans un .c et mettre sa déclaration "extern" dans le .h :
    *.c
    *.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    extern int * array_ptr;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Cela ne change rien. Le pointeur n'est pas définis dans le .h mais bien déclarer (erreur de syntaxe dans mon post).
    Lorsque je liste dans chaque fonction, l'adresse de mon pointeur, elle est bien la même pour tous.

  4. #4
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    on peut avoir un code minimal qui reproduise le problème?

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 103
    Points : 48
    Points
    48
    Par défaut
    Bonjour,

    Voilà, j'ai trouvé ce qui clochait mais je ne sais pas comment le résoudre. En fait si j'appelle les fonctions l'une après l'autre dans le même processus, la valeur du pointeur se modifie. Par contre, si ce sont des processus différents (mon cas), la valeur ne change pas pour les autre processus.

    J'ai mis le zip en pièce jointe. Normalement il compile du premier coup.

    Merci
    Fichiers attachés Fichiers attachés

  6. #6
    Membre émérite Avatar de nicolas.sitbon
    Profil pro
    Inscrit en
    Août 2007
    Messages
    2 015
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 2 015
    Points : 2 280
    Points
    2 280
    Par défaut
    Si ce sont des processus différents, tu n'as pas le choix, tu dois passer par une mémoire partagée.

Discussions similaires

  1. Pointeur non modifié.
    Par Invité dans le forum C++
    Réponses: 5
    Dernier message: 24/04/2014, 17h44
  2. [Jena] Valeur de propriété non modifiée
    Par Matt112 dans le forum Frameworks
    Réponses: 0
    Dernier message: 15/12/2011, 13h54
  3. Pointeur non modifié à l'interieur d'une fonction ? o_O
    Par stephane.lallee dans le forum SL & STL
    Réponses: 8
    Dernier message: 19/03/2009, 16h06
  4. Attributs d'un record en property non modifiables
    Par WebPac dans le forum Langage
    Réponses: 15
    Dernier message: 11/04/2005, 12h59
  5. Valeur d'un champ non connu
    Par Pierre FORAZ dans le forum XMLRAD
    Réponses: 2
    Dernier message: 11/10/2004, 11h08

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