Un peut d'aide svp. (pointeur?) [Résolu]

Signaler
Messages postés
23
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
12 avril 2012
-
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019
-
int *tab[10];
int *pos;


int create(int val){
if (val>=0 && val<10) tab[val]=new int[100];
}

int test(int val){
pos=val; // ligne invalide
if (val>=0 && val<10) pos=tab[val]; // ligne OK
}


dans la fonction 'test' val est soit une valeur entre 1 et 9
ou directement l'adresse du tableau(tab[x])

comment fait-on pour que justement 'pos=val'?

13 réponses

Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Pour te familiariser avec les pointeur je te conseil de lire ce cours :
Le Site du Zéro -> A l'assaut des pointeurs

ici mon problème c'est vraiment les pointeurs
exemple :
pos=15;
int *p=pos;
donc que *p pointe vers l'adresse mémoire 15 de la ram
en gros voici se qui faut que j'arrive à faire.

Si je comprend bien tu veut mettre 15 dans p ?
Tu peut faire comme sa :
pos=15;
int *p;
p=(int*)pos;

Dzl mais je ne comprend toujours pas ton problème (sa doit venir de moi )

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
3983
Date d'inscription
jeudi 14 juillet 2005
Statut
Membre
Dernière intervention
30 juin 2013
12
Que veux-tu modifier ? La valeur pointée par pos ou le pointeur contenu dans cette variable ?

VB.NET is good ... VB6 is better
Utilise Réponse acceptée quand un post répond à ta question
Messages postés
1243
Date d'inscription
jeudi 31 mars 2005
Statut
Membre
Dernière intervention
3 août 2016
1
Yop,

A mon avis il veut modifier la valeur pointée par pos :) Donc il faut faire :

*pos=val;


++

deck_bsd

/*************************************/
http://deck-bsd.eurower.net
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Attention dans ce cas à initialisé pos . Perso je ferais :
int *tab[10];
int *pos =  0;


int create(int val){
if (val>=0 && val<10) tab[val]=new int[100];
}

int test(int val){
   if (pos == 0)
   {
      pos = (int*)malloc(sizeof(int));
   }
   *pos= val;
}

ATTENTION de bien penser à libérer la mémoire alloué à pos dans ce cas
free(pos);


Pour info si tu veut que pos sauvegarde l'adresse de val il faut faire :
int test(int* val){
pos  =val;
}

Et appeler la fonction :
test(&inValeur);


et je voie que ta fonction retourne un int. Que veut tu retourner ? La valeur contenu dans pos pour vérification ? Si oui :
return(*pos);


Voila bonne prog

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Oups c'est du C++ (même si le code que j'ai posté fonctionne)
int test(int val){
   if (pos == 0)
   {
      pos = new int;
   }
   *pos=val;
}

Et pour libérer :
delete pos;
pos = 0; //<- sa c'est une sécurité comme sa tu peut tester si de la mémoire est allouée ou non 


Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
23
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
12 avril 2012

dsl mais j'ai beaucoup de mal avec les pointeurs ainsi que le vocabulaire qui y est attribuer.

int *tab[10];
int *pos;

// ici je crée un tableau
int create(int val){
if (val>=0 && val<10) tab[val]=new int[100];}

// je teste si c'est un tableau que j'ai crée
// ou si c'est l'adresse d'un tabeau
int test(int val){
if (val>=0 && val<10) pos=tab[val];return;
pos=???;
return}

int mafonction(){
int *p=pos;
for (int k=0;k<100;k++){
int v=*p;
v--;
*p++=v;
}
c'est une version simplifier de mon programme.
je pense que je veut modifier La valeur pointée par 'pos'.
mon problème c'est que dans la fonction 'create' , 'val' est soit une variable compris entre 1 et 9 ou directement une adresse mémoire.
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Houlalalala je comprend rien à ce que tu veut faire
Quel est ton objectif en faite ?

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
23
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
12 avril 2012

mon objectif est de gérer des images.
j'ai 2 type d'image,

_ la première est de créer une image par la fonction 'create',
en y assignent une valeur 'val'(de 1 a 9);

_ la deuxième , c'est une image créé par une autre application et là,
je récupère son adresse par une variable.(il n'y a pas d'autres solutions)

la fonction 'teste' devrai me permettre de récupérer l'adresse
sois d'une image que j'ai créé par l'instruction suivante ,
'pos=tab[val]'
sois une image d'une autre application par l'instruction :
'pos=val'
mais celle-ci ne marche pas.

puis avec la fonction 'mafonction' me permet de manipuler les images.

ps. 'pos' est une variable(pointeur) global.
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Ok donc si Val est entre 0 et 9 compris tu copie une "cellule" de ton tableau et si non tu copie val
Si je ne me trompe pas sa devrais donnée un truc du genre de :
void test(int val)
{
   if (val>= 0 && val<10)
   {
      pos=tab[val];
   }
   else
   {
      pos=&val;
   }
}


Tu remarqueras que j'ai viré les "return" et passé ta fonction en void (ne retourne rien)

Par contre ta fonction reçois un int pas un pointeur sur int (donc ATTENTION il est possible que la 1ére valeur soit comprise entre 0 et 9 alors que c'est une image que tu n'a pas crée )

En C++ tu peut faire sa :
void test(int val)
{
   pos=tab[val];
}
void test(int* val)
{
   pos= val;
}

Comme sa si val est un int tu entre dans la 1ér fonction si c'est un int* dans la seconde.
Je ne sait plus par contre si le C autorise les redéfinitions

Si non il fraudais que tu ajoute un flag qui sauvegarde cette info de façon à savoir à l'avance ce que tu veut récupérer plutôt que d'avoir à le testé (je pense qu'il faudrait que tu revoie l'analyse pas vraiment le code, soit le "quoi faire" pas le "comment faire")

Autre idée (mais attention c'est du bricolage en contournant certaine sécurité de l'interpréteur de code donc méfiance)
//Appel de test :
test((int*)inValeur) //la tu caste la variable que sa soit un int ou un int* tu recevras un int* problème sa ne sera pas forcément un pointeur est ça c'est VRAIMENT pas propre

//Déclaration de test :
void test(int* val)
{
   if (val>  =0 && val<10)
   {
      //Du coup ici tu re-caste en int pour récupérer une valeur et non un pointeur (encore une fois ce n'est VRAIMENT pas propre)
      pos= tab[(int)val];
   }
   else
   {
      pos= val;
   }
}


Mais il vaudrais vraiment mieux que tu ajoute une variable (ou un tableau de variable ) qui indique la "provenance" de ton image si non il y à de gros risque que sa finisse par être impossible à maintenir comme code

PS :
Je te conseil aussi de toujours ajouter les "{" et "}" quand tu fait un if (même quand il n'y à qu'une seul ligne dans le if si non la lisibilité en prend un coup, enfin ce n'est que mon havie, d'autre développeur te dirais sans doute qu'il est inutile de surcharger ton code avec ça )

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

Sauf erreur de ma part ton problème venais justement des "{" et "}" manquant dans ton code car (encore une fois sauf erreur de ma part) le C ne reconnais pas les retour à la ligne donc :
if (toto = 1) toto++;return toto;

Feras exactement la même chose que :
if (toto = 1)
   toto++;
return toto;


Soit dans tout les cas tu passeras par "return toto;" que toto soit égale à 1 ou non

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo
Messages postés
23
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
12 avril 2012

malheureusement la surcharge des fonctions n'est pas passible puisque 'val' est une variable non un pointeur.

il faudrait que : ( si c'est possible)

int *tab[10]; => int[tab]
int *pos; => int pos

int create(int val){
tab[val]=new int[100] => ici je sais pas ?
mais je dois pouvoir trouver
}

int test(int val){
pos=tab[val];
pos=val;
}

int mafonction(){
int *p=pos; je sais pas
}

'tab' et 'pos' soient des variables et non des pointeurs et que dans 'mafonction':
int*p=pos;

je raccourcie volontairement les codes pour éviter d'avoir des codes à rallonge ,
( je sais , c'est pas très propre et peut lisible dsl) et pour se qui est des
parantaises , crochais , point virgule ...
se ne sont que des erreurs d'écriture.

ici mon problème c'est vraiment les pointeurs
exemple :
pos=15;
int *p=pos;
donc que *p pointe vers l'adresse mémoire 15 de la ram
en gros voici se qui faut que j'arrive à faire.
Messages postés
23
Date d'inscription
mardi 8 avril 2003
Statut
Membre
Dernière intervention
12 avril 2012

merci.
Messages postés
1098
Date d'inscription
mercredi 22 mars 2006
Statut
Membre
Dernière intervention
22 octobre 2019

De rien sa fait plaisir de se sentir utile

Amicalement
1000 recherches sur Google = 1Km de voiture en CO² (réfuté par Google )
1000 recherches sur Forestle = 100 m² de forêt tropicale sauvé .
Surfez écolo