Tableau de pointeur

Signaler
Messages postés
3
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
10 mars 2009
-
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
-
Bonjour
voici mon code qui marche pas : les commentaires sont dans le code
Pourquoi es-ce que ca ne veut pas ? En fait j'essaye ici de ne pas recopier les données de allSndP vers outputBuffer, j'aimerais que à la sortie de "func", "truc" soit mis a jour comme dans func.
PS : La déclaration de "func(float *outputBuffer )" doit rester la meme quelque soit la solution (c'est une librairie)

#include <stdio.h>
#include <stdlib.h>

float *allSndP;
int temp = 0;

void func(float *outputBuffer ){
    outputBuffer = allSndP + temp * 4;
    // fonctionne : la valeur n'est pas encore perdue ?
    printf("--> outputBuffer[2] = %f, allSndP[%d] = %f\n",outputBuffer[2], 2 + temp*4, allSndP[2 + temp*4]);
    temp++;
}

void myCall(){
    float *truc;
    truc = (float *) malloc( 4 * sizeof(float) );

    func(truc);
    func(truc);
    func(truc);
    func(truc);

    // ne marche pas : la valeur est perdue ?
    printf("--> truc[2] = %f, allSndP[14] = %f\n",truc[2], allSndP[14]);
}

int main(void) {

    int cpt;

    allSndP = (float *) malloc( 16 * sizeof(float) );
    for (cpt=0;cpt<16;cpt++) allSndP[cpt] = cpt;

    myCall();

    return 0;
}

Ceci est la sortie

--> outputBuffer[2] = 2.000000, allSndP[2] = 2.000000
--> outputBuffer[2] = 6.000000, allSndP[6] = 6.000000
--> outputBuffer[2] = 10.000000, allSndP[10] = 10.000000
--> outputBuffer[2] = 14.000000, allSndP[14] = 14.000000
--> truc[2] = 0.000000, allSndP[14] = 14.000000

Merci pour toute explication

3 réponses

Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Salut,

Avant de te lancer dans de telles choses, tu pourrais ouvrir un bon bouquin de C a la section pointeur.
Lorsque tu fais :
  float *pfVar1, *pfVar2;
  pfVar1 = (float *) malloc(sizeof(float));
  pfVar2 = (float *) malloc(sizeof(float));

  pfVar1 = pfVar2 + 2; // Ici tu ne fait que modifier le pointeur de pfVar pas étonnant que tu perdes la valeur. PAS OK

Il faut faire :
  *pfVar1 = *pfVar2 + 2; // Ici en mettant * tu fait bien la distinction enter le pointeur et la valeur associée à ce pointeur. OK

Corrige ton code dans ce sens la et ca devrais aller mieux.
Autre chose, évote de déclarer des variables globales surtout pour ce que tu en fais.
Et donne des noms parlant à tes fonction et variables.

Bon courage.

Shell
Messages postés
3
Date d'inscription
mardi 7 janvier 2003
Statut
Membre
Dernière intervention
10 mars 2009

Salut, merci pour ta reponse
je pense que tu n'a pas bien vu la subtilité de la chose lorsque tu m'ecrit
*pfVar1 = *pfVar2 + 2;
et bien tu met dans la valeur de pfVar1 la valeur de pfVar2 incrementé de 2

moi c'est beaucoup plus fou
j'ai mon tableau allSndP (que j'ai declaré en global pour l'exemple ;) ) qui fait 16float
et j'ai mon tableau "truc" qui fait 4float
en fait je veut mettre que "truc" pointe vers le premier element du tableau
puis second appel vers le 5eme
puis troisieme appel vers le 9eme
puis quatrieme appel vers le 13eme
--> en fait je veut prendre 4 valeur par 4 valeur de mon tableau allSndP et "les mettre" dans truc et donc j'incremente l'adresse de 4 par 4

et bien cela fonctionne à merveille dans func et lors du retour dans myCall et bien il n'y a plus rien (je repete que je ne veux pas modifier la definition de "func" et que je ne veux pas utiliser le memcpy)

merci encore deathcrash
Messages postés
2671
Date d'inscription
vendredi 25 janvier 2002
Statut
Membre
Dernière intervention
6 février 2013
1
Salut,

Ce que tu souhaites faire est impossible tel que tu le présente.
Je ne sais pas si tu es toujours bloqué sur ton problème mais une solution serait de faire en sorte à ce que ta fonction retourne un pointeur sur l'élément qui t'interresse.

Exemple :
float * func(float *outputBuffer ){
    return allSndP + ++temp * 4;
}

truc = func(truc);

Bon courage.

Shell