J'écrivais un programme C pour calculer le coefficient de Spearman. Il fonctionne très bien, mais quand je l'utiliseAffecter la référence de la variable au pointeur entraîne un comportement inattendu
*spearmanCoefficient = coeff;
je reçois cette sortie: Spearman: 0.01
et quand j'utilise
spearmanCoefficient = &coeff;
je reçois cette sortie: Spearman: 15707109983512927750860237824432537600.00
Cependant, correlationFlag = &corrFlag;
me donne la sortie correcte.
Si je comprends bien, la première instruction affecte la valeur de la coeff
variable à la valeur du pointeur spearmanCoefficient
et la deuxième instruction attribue l'adresse du coeff
variable au pointeur spearmanCoefficient
qui devrait aboutir à la même sortie, mais la La sortie suggère que la deuxième déclaration fait référence à l'adresse de la variable et non à sa valeur.
Quelqu'un peut-il expliquer pourquoi cela se produit? Je vous remercie.
code source:
#include <stdio.h>
#include <math.h>
_Bool Correlate (int size, float arrayOne[], float arrayTwo[], float *spearmanCoefficient, float *correlationFlag)
{
if (size > 0) {
float sumOne = 0.0f;
float sumTwo = 0.0f;
for (int i = 0; i < size; i++) {
sumOne = sumOne + arrayOne[i];
sumTwo = sumTwo + arrayTwo[i];
}
float meanOne = sumOne/(float)size;
float meanTwo = sumTwo/(float)size;
float varianceOne = 0.0f, varianceTwo = 0.0f;
for (int i = 0; i < size; i++) {
sumOne = sumOne + pow((arrayOne[i] - meanOne), 2);
sumTwo = sumTwo + pow((arrayTwo[i] - meanTwo), 2);
}
varianceOne = sumOne/(float)size;
varianceTwo = sumTwo/(float)size;
float coeff = 0.0f;
float corrFlag = 0.0f;
for (int i = 0; i < size; i++) {
coeff = coeff + (((arrayOne[i] - meanOne) * (arrayTwo[i] - meanTwo))/(size * sqrt(varianceOne * varianceTwo)));
}
spearmanCoefficient = &coeff;
if (coeff >= 0.9 && coeff <= 1.0) {
corrFlag = 1.0;
} else if (coeff >= -1.0 && coeff <= -0.9) {
corrFlag = -1.0;
} else {
corrFlag = 0.0;
}
correlationFlag = &corrFlag;
return 1;
}
else {
return 0;
}
}
int main() {
float arrayOne[10] = {1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 10.0};
float arrayTwo[10] = {4.0, 6.0, 9.0, 10.0, 2.0, 3.0, 5.0, 5.0, 6.0, 8.0};
int size = 10;
float *spearmanCoefficient;
float *correlationFlag;
_Bool var = Correlate(size, arrayOne, arrayTwo, spearmanCoefficient, correlationFlag);
printf("Spearman: %.2f\n", *spearmanCoefficient);
printf("Flag: %.2f\n", *correlationFlag);
return 0;
}
Ces pointeurs 'main' ne pointent pas vers nulle part. – Kevin
Votre fonction ne met pas à jour les pointeurs car ils sont passés par valeur. Et si les pointeurs étaient mis à jour, cela ne fonctionnerait pas car ils pointeraient vers des variables locales qui n'existent plus. –