Segmentation Fault & Badly placed ()'s

aymaneelboujnani Messages postés 3 Statut Membre -  
yg_be Messages postés 23437 Date d'inscription   Statut Contributeur Dernière intervention   -
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;
}

1 réponse

  1. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
     
    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
    1
    1. Utilisateur anonyme
       
      Bonjour

      "K est évalué à 0"
      Je n'ai pas fait l'essai et ça ne serait pas la première fois que je dis une bêtise en C, mais ça m'étonne. 1.38/pow(10,23), ça n'est pas tout simplement 1.38e-23 ?
      0
    2. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      oups, tu as raison, mon erreur est due au fait que j'avais tenté d'afficher le résultat avec le spécificateur habituel pour moi
      "%f"
      pour afficher des
      float
      ou
      double
      sans utiliser le spécificateur
      "%e"
      de printf qui est réservé à la notation scientifique et je croyais naïvement ce qui était affiché :-/

      #include <stdio.h>
      #include <math.h>
      
      int main(void) {
          float K = 1.38 / pow(10,23);
      
          printf("K = %f\n", K);
          printf("K = %e\n", K);
      
          return 0;
      }

      donne :

      $ gcc -Wall 35799000.c -lm
      $ ./a.out
      K = 0.000000
      K = 1.380000e-23
      $

      Cela fonctionne bien chez moi, même avec un float :-)
      0
    3. Utilisateur anonyme
       
      Ç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).
      0
    4. aymaneelboujnani Messages postés 3 Statut Membre
       
      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 !
      0
    5. [Dal] Messages postés 6122 Date d'inscription   Statut Contributeur Dernière intervention   1 108
       
      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);
      ...
      0