Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 22/02/2007, à 20:05

amwus

[RESOLU] Problème pointeurs en C

Bonjour. Voila, j'ai un petit problème de pointeurs dans une fonction en C. En fait je n'ai pas que ce problème, mais je vais déjà commencer par celui la smile !

je poste d'abord le code de la fonction :

static void setAverageVector(float std_vector[], float * avg_vector[])
{

  int actualPos = 0;
  float temp = 0;
  
  while(actualPos < 12) {
    
    for(int pos = 0; pos <= actualPos; pos++) {
      temp = temp + std_vector[pos];
    }

    float average = temp / actualPos;
    *avg_vector[actualPos] = average;

    actualPos++;
    temp = 0;
  }

  return;
}

Cette fonction prend en premier argument un tableau source, qui contient 12 élements. Ensuite, elle modifie le tableau pointé dans le second argument en y mettant la moyenne des éléments à la position actuelle. Par exemple, à l'indice 5 du tableau pointé, elle devrait mettre la moyenne des 5 premiers éléments du tableau source. Mais.... Problème, ça ne fonctionne pas. Le programme compile mais j'ai l'erreur suivante :

gcc --std=c99 prexix-average.c
prexix-average.c: In function ‘main’:
prexix-average.c:25: warning: passing argument 2 of ‘setAverageVector’ from incompatible pointer type

Et bien entendu, le programme foire :

Exception en point flottant (core dumped)

Une petite aide serait la bienvenue. Je débute dans les pointeurs en C...

Merci d'avance !

smile

Dernière modification par amwus (Le 23/02/2007, à 13:15)


Black holes are where god divided by zero...

Hors ligne

#2 Le 22/02/2007, à 20:15

best_friend_fr

Re : [RESOLU] Problème pointeurs en C

Si tu nous envoyais la fonction main aussi, ca pourrait aider wink


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#3 Le 22/02/2007, à 20:24

best_friend_fr

Re : [RESOLU] Problème pointeurs en C

Bon, le problème vient des pointeurs de tableaux, et des tableaux de pointeurs.

Ce que tu mets
float * avg_vector[]
est un tableau de pointeurs. Ce que tu veux est un pointeur de tableau
float (* avg_vector)[]

Il faut aussi modifier le ligne
*avg_vector[actualPos] = average;
en
(*avg_vector)[actualPos] = average;


sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#4 Le 22/02/2007, à 20:37

amwus

Re : [RESOLU] Problème pointeurs en C

ha oui, tout de suite ça compile mieux cool

Mais la fonction ne fait pas ce qu'elle devrait apparement. Je poste le code total pour plus de facilité :

/* prefix-average.c   Osmalskyj Julien   2007-02-22
 *
 *
 */


#include <stdio.h>
#include <stdbool.h>

#define OK

// Functions prototypes

static void resetScan();
static void printVector(float vector[]);
static void setAverageVector(float std_vector[], float (*avg_vector)[]);


int main()
{

  float first_vector[] = {5, 6.3, 4.2, 8, 9, 2, 5, 3, 1, 3, 9, 5};
  float new_vector[12];

  printVector(first_vector);

#ifdef OK

  setAverageVector(first_vector, &new_vector);

  puts("\n");

  printVector(new_vector);

#endif

  puts("\n");

  return 0;

};



// resetScan() : empty scanf buffer. Returns nothing.

static void resetScan()
{
  int carac;

  while((carac = getchar()) != '\n' && carac != EOF);

  return;
}


// printVector(float vector[]) : prints vector contained in float vector[]. Returns nothing.

static void printVector(float vector[])
{

  const int MAX_LENGHT = 12;

  for(int count = 0; count < MAX_LENGHT; count++) {
    printf("%.2f  ", vector[count]);
  }

  return;
}


/* setAverageVector(float std_vector[], float (*avg_vector)[])
 * Creates new vector containing first vector's average values.
 * Its calculates the average value of the preceding elements to the actual element 
 * in the vector.
 * Reads the values from std_vector, and set the average into avg_vector.
 */

static void setAverageVector(float std_vector[], float (*avg_vector)[])
{

  int actualPos = 0;
  float temp = 0;
  
  while(actualPos < 12) {
    
    for(int pos = 0; pos <= actualPos; pos++) {
      temp = temp + std_vector[pos];
    }

    float average = temp / actualPos;
    (*avg_vector)[actualPos] = average;

    actualPos++;
    temp = 0;
  }

  return;
}

Merci d'avance pour votre aide !

Je précise que ce programme n'est pas terminé. Il en est à son stade de développement ^^ !

Le résultat actuel donne ça :

5.00  6.30  4.20  8.00  9.00  2.00  5.00  3.00  1.00  3.00  9.00  5.00  

inf  11.30  7.75  7.83  8.12  6.90  6.58  6.07  5.44  5.17  5.55  5.50

Dernière modification par amwus (Le 22/02/2007, à 20:38)


Black holes are where god divided by zero...

Hors ligne

#5 Le 22/02/2007, à 20:45

best_friend_fr

Re : [RESOLU] Problème pointeurs en C

Salut

Si, ca marche.

Mais il ne faut pas que tu oublies que à chaque tour, actualPos vaut le numéro de la dernière case, soit 1 de moins que le nombre de cases. Il faut diviser par acrualPos+1.

Tu pourrais éviter aussi cette double boucle, en mettant

static void setAverageVector(float std_vector[], float (*avg_vector)[])
{

  int actualPos = 0;
  float temp = 0;
  
  while(actualPos < 12) {
	temp = temp + std_vector[actualPos];
	float average = temp / (actualPos+1);
    (*avg_vector)[actualPos] = average;
    actualPos++;
  }

  return;
}

sudo apt-get replace langage_sms by grammaire orthographe ponctuation
La documentation est avant tout faite pour ceux qui posent les questions, et non ceux qui y répondent
Best_friend_fr

Hors ligne

#6 Le 22/02/2007, à 21:08

amwus

Re : [RESOLU] Problème pointeurs en C

Ha oui pas bête du tout comme ça. Il ne réinitialise pas temp de cette façon. Plus efficace ! Merci du tuyaux ^^. Mais bon, c'est ma première version, le but est de le rendre efficace j'aurais trouvé big_smile

Mais c'est super sympa ça marche en tout cas !

Thanks ! cool


Black holes are where god divided by zero...

Hors ligne