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 :

écrire la valeur pointée par un pointeur de pointeur???


Sujet :

C

  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut écrire la valeur pointée par un pointeur de pointeur???
    J'ai créer un tableau intitulé "image" à l'intérieur sont définis des valeurs que je veux réecrire dans "image_finale", mais avec un ordonnancement différent. Malheureusement je me perds dans les pointeurs...et pourtant j'ai fait pleins d'essais.

    Si quelqu'un à des pistes?

    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
     
    void ajout_bordure(unsigned char *image, unsigned char *image_finale, int *tailles)
    {
    	int  i, j;
    	int zone_length;
    	char nom[10]="titi.tiff";
    	int sqrt_zone_length;  unsigned char *ptr1, *ptr2, *ptr3, *ptr4;
    	unsigned char **buf1, *buf2, *buf3, *buf4;
     
    	zone_length = (tailles[0]+tailles[1])*8 / tailles[2]; 
    	sqrt_zone_length = (int) sqrt(zone_length);
     
     
    	//assignation des pointeurs bufx	
    	buf3 = image_finale + (int) sqrt (tailles[2]) * zone_length;
    	buf4 = buf3 + sqrt_zone_length;
     
    	//assignation des pointeurs ptrx
    	ptr3 = image_finale + (int) sqrt (tailles[2])  * (2*2*zone_length + 2*2) +2;
    	ptr4 = ptr3 + 2*sqrt_zone_length;
     
     
    	for(i=0;i<sqrt_zone_length;i++)
    	{
    		for(j=0;j<sqrt_zone_length;j++)
    		{
    			*(ptr3++) = *(buf3);
    			*(ptr3++) = *(buf3++);
    			*(ptr4++) = *(buf4);
    			*(ptr4++) = *(buf4++);
     
    		}
    		buf3 += sqrt_zone_length;
    		buf4 += sqrt_zone_length;
    	}

  2. #2
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    tu peux préciser ce que ça représente, le tableau de "tailles" ?
    car j'ai du mal a comprendre ce que tu fais la:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    zone_length = (tailles[0]+tailles[1])*8 / tailles[2];
    sqrt_zone_length = (int) sqrt(zone_length);
    au début j'ai pensé que tailles[0] et tailles[1] représentent largeur et longueur d'une image, mais alors je vois pas à quoi mène ce calcul...

    essaye de préciser un peu pls ce que tu veux faire, s'il te plait.

    la fonction s'appelle ajout_bordure. Est-ce que l'image finale doit être plus grande que l'image de départ, et la contenir mais avec un cadre?

    edit: et est-ce que c'est une image en niveau de gris ou chaque pixel est entierement contenu sur 1 octet? ou c'est du rgb? autre?

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    277
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 277
    Points : 141
    Points
    141
    Par défaut
    ok je vais préciser un peu plus,
    image est de taille : tailles[0]+tailles[1]
    et image_finale est de taille: (tailles[4]*2)*(tailles[4]*2)


    on a une relation entre "image" et "image_finale", effectivement "image_finale" est plus grande que "image". En deux mots je sépare "image" en 4 zones.
    je veux recopier ces 4 zones dans "image_finale" en rajoutant une bordure (de 2 pixels) le long de chacune des zones.

    Jusque là ça va, sauf que la bordure n'est pas forcement des pixels noirs.

    Mais revenons à nos moutons ce que je n'arrive pas à faire c'est écrire la valeur pointée par buf3 (ou buf4) dans ptr3 (ou ptr4), avec ptr3 représentant une zone géographique dans "image_finale"

    donc quand je fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
       for(i=0;i<(tailles[4]*2)*(tailles[4]*2);i++)
       { j = image_finale[i];}
    j devrait valoir de temps en temps 0 et de temps en temps 1, mais ce n'est pas le cas!!

  4. #4
    Membre actif Avatar de Biosox
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    298
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Mai 2005
    Messages : 298
    Points : 203
    Points
    203
    Par défaut
    en tout cas quand tu fais
    c'est sur que ça copie la valeur vers laquelle pointe buf3, dans l'octet vers lequel pointe ptr3. Puis ensuite ptr3 pointe vers l'octet suivant.

    si c'est bien ton souhait, alors l'erreur viens d'ailleur.

    1) es-tu sur que la mémoire vers laquelle pointe *image_finale est déja alouée avant d'entrer dans la fonction?

    2) es-tu sur de tes calculs
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    buf3 = image_finale + (int) sqrt (tailles[2]) * zone_length;
    et
    ptr3 = image_finale + (int) sqrt (tailles[2])  * (2*2*zone_length + 2*2) +2;
    3) un autre truc me semble louche:
    si tu sépare ta premiere image en 4 zone, il me semble que ces zones sont contigues. Or si j'ai bien compris, buf3 pointe vers le début d'une de ces zones; et ta boucle

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
          for(j=0;j<sqrt_zone_length;j++)
          {
             *(ptr3++) = *(buf3);
             *(ptr3++) = *(buf3++);
             *(ptr4++) = *(buf4);
             *(ptr4++) = *(buf4++);
          }
    a pour effet de copier (et dupliquer) le contenu d'une zone.

    note bien qu'à la fin de cette boucle, ptr3 pointe en dehors de cette zone (donc au début de la suivante) et donc, si le but de l'instruction
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    buf3 += sqrt_zone_length;
    est de sauter à la zone suivante (ce qu'il me semble) et bien cette instruction est en trop.

    Enfin,
    pour tester cette double boucle qui me semble louche (a moins que je n'ai pas compris son but) j'ai vite écrit le programme suivant:
    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
    int main(void)
    {	
    	int i,j;
    	int sqrt_zone_length = 4;
     
    	char *buf3 = "abcdefghijklmnop";
    	char *buf4 = "ABCDEFGHIJKLMNOP";
     
    	char dest3[100];
    	char dest4[100];
     
    	char *ptr3=dest3;
    	char *ptr4=dest4;
     
    	memset(dest3,0x0,100);
    	memset(dest4,0x0,100);
     
    	for(i=0;i<sqrt_zone_length;i++)
    	{
    		for(j=0;j<sqrt_zone_length;j++)
    		{
    			*(ptr3++) = *(buf3);
    			*(ptr3++) = *(buf3++);
    			*(ptr4++) = *(buf4);
    			*(ptr4++) = *(buf4++);
     
    		}
    		buf3 += sqrt_zone_length;
    		buf4 += sqrt_zone_length;
    	}
     
    	return 0;
    }
    apres execution, j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dest3-> aabbccddiijjkkll
    dest4-> AABBCCDDIIJJKKLL
    comme tu le vois, la tone "efgh" a été "sautée"

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

Discussions similaires

  1. Sauvegarde d'images valeur point par point
    Par betaplus dans le forum C++
    Réponses: 6
    Dernier message: 25/02/2015, 10h54
  2. Recupérer valeur pointé par void *
    Par guitou99999999 dans le forum C++
    Réponses: 6
    Dernier message: 25/11/2013, 12h20
  3. Réponses: 21
    Dernier message: 06/08/2009, 09h31
  4. Réponses: 3
    Dernier message: 29/07/2008, 09h56
  5. Réponses: 6
    Dernier message: 26/05/2007, 00h33

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