Menu

Segmentation Fault & Badly placed ()'s

Messages postés
3
Date d'inscription
mardi 8 janvier 2019
Dernière intervention
11 janvier 2019
-
J'ai écris le code ci-dessous pour me permettre un calcul automatique d'une valeur physique mais il ne fonctionne pas depuis que j'ai ajouté la fonction pow.

Quand j'execute avec gcc -o Cal CalRes.c puis Cal, il me renvoi Segmentation fault
Quand j'execute avec ./CalRes.c il me renvoi badly placed ()'s

Help!

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


int main(int argc, char *argv[])
{
 unsigned int N;
 float I[N], V[N], R[N], Sth[N], K= 1.38/pow(10,23);
 int i, j, k, l;
 
 printf("Please indicate the number of points : ");
 scanf("%i",&N); 

 for(i=0; i<N; i++)
 {
  printf("_________%i_________",i+1);
  printf("\nVoltage value : ");
  scanf("%f",&V[i]);
  printf("Current value : ");
  scanf("%f",&I[i]);
 }
 
 for(j=0;j<N; j++)
 {
  R[j] = V[j]/I[j];
 }
 
 for(k=0; k<N; k++)
 {
  Sth[k] = (4 * K * 298) / R[k];
 }
 
 printf("***** Results *****");
 
 for(l=0; l<N; l++)
 {
  printf("\nSth%i = %f",l+1,Sth[l]);
 }
 printf("\n");
 
 return 0;
}
Afficher la suite 

Votre réponse

1 réponse

Meilleure réponse
Messages postés
4857
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 janvier 2019
925
1
Merci
Salut aymaneelboujnani,

Quand j'execute avec ./CalRes.c il me renvoi badly placed ()'s

Tu ne peux pas exécuter directement le programme source. Tu dois le compiler et exécuter le résultat de la compilation. Là le shell Linux (bash certainement) essaye d'exécuter le contenu du fichier source sous forme d'instructions shell, et, évidemment, cela ne fonctionne pas.

Quand j'execute avec gcc -o Cal CalRes.c puis Cal, il me renvoi Segmentation fault

Si tu es sous Linux, tu exécutes le programme "Cal" situé dans le répertoire courant en faisant
./Cal


Par ailleurs, pour compiler un programme utilisant les fonctions de
math.h
, avec gcc, tu devrais passer l'option
-lm
qui permet de lier l'exécutable à la bibliothèque
libm.a
...

$ gcc -Wall -o Cal CalRes.c -lm

Sinon, tu as certainement une erreur mémoire en exécutant l'exécutable produit par la compilation, car tu te sers la valeur de N pour déclarer la taille de tes tableaux, alors que N n'est pas encore initialisée et contient n'importe quoi (N n'est renseigné par l'utilisateur qu'après). Il y a des chances que cette valeur explose la pile mémoire en déclarant tes 4 tableaux avec une dimension de cette valeur arbitraire.

Tu pourrais donc faire comme cela :

    unsigned int N;
    double K = 1.38/pow(10,23);
    int i, j, k, l;

    printf("Please indicate the number of points : ");
    scanf("%i", &N);
    double I[N], V[N], R[N], Sth[N];


J'ai remplacé tes
float
par des
double
pour augmenter la précision disponible, mais même avec un
double
, le dénominateur de K est tellement grand, que K est évalué à 0 sur ma machine... Pareil avec
long double
chez moi.

Il y aura sans doutes d'autres choses à régler dans ton code pour qu'il ait du sens ou produise le résultat attendu, mais, au moins tu ne resteras pas sur une segfault :-)

Dal

Dire « Merci » 1

Heureux de vous avoir aidé ! Vous nous appréciez ? Donnez votre avis sur nous ! Evaluez CommentCaMarche

CCM 54460 internautes nous ont dit merci ce mois-ci

le père.
Messages postés
6286
Date d'inscription
mardi 15 mai 2012
Dernière intervention
11 janvier 2019
968 -
Ça me rassure.
Et mes excuses à aymaneelboujnani pour ces digressions qui s'écartent de son sujet. il me semble quand même qu'écrire 1.38e-23 est plus clair que 1.38 / pow(10,23).
aymaneelboujnani
Messages postés
3
Date d'inscription
mardi 8 janvier 2019
Dernière intervention
11 janvier 2019
-
Merci de tes réponses Dal, j'ai plus segmentation fault en effet. En revanche, effectivement, K vaut 0, même avec du long double.
Y a-t-il une solution ou je dois coder en utilisant un autre langage ?

Merci d'avance !
[Dal]
Messages postés
4857
Date d'inscription
mercredi 15 septembre 2004
Statut
Contributeur
Dernière intervention
11 janvier 2019
925 -
non, c'est une erreur de ma part (et tu as zappé notre discussion avec le père. sur ce sujet)

en fait K ne vaut pas 0, même si en faisant un
printf("K = %f\n", K);
tu vois
K = 0.000000
, c'est juste que, dans ce format d'affichage, il n'y a pas assez de zéros pour afficher la valeur

pour afficher un résultat mathématiquement correct, le format d'affichage normal ne suffit pas et il faut afficher la valeur en notation scientifique :
printf("K = %e\n", K);
affiche bien
K = 1.380000e-23
...

et comme suggéré par le père., il est sans doutes préférable d'écrire directement
float K = 1.38e-23;
que
float K = 1.38 / pow(10,23);
...
aymaneelboujnani
Messages postés
3
Date d'inscription
mardi 8 janvier 2019
Dernière intervention
11 janvier 2019
-
Oui, en effet j'avais zappé votre discussion. Le code marche bien maintenant !
Merci le père pour ta remarque, merci à vous deux !
yg_be
Messages postés
7215
Date d'inscription
lundi 9 juin 2008
Statut
Contributeur
Dernière intervention
12 janvier 2019
429 > aymaneelboujnani
Messages postés
3
Date d'inscription
mardi 8 janvier 2019
Dernière intervention
11 janvier 2019
-
bonjour, peux-tu marquer le sujet comme résolu, via la roue dentée à droite du titre?
Commenter la réponse de [Dal]