Partage
  • Partager sur Facebook
  • Partager sur Twitter

Exercice des tableaux du cours de C

Problème de fichiers .c séparés

Sujet résolu
17 juin 2016 à 14:39:28

Bonjour !

je suis actuellement en train de suivre le tutoriel du langage C, et j'en suis aux exercices sur les tableaux.

Dans mon exercice je dois réaliser la somme des éléments d'un tableau, et pour me familiariser avec des fonctions en dehors du main, j'ai créé un fichier exercice1.c et exercice1.h comme suis :

exercice1.c

 

exercice1.h

Et mon main dans lequel j'appelle ma fonction : 

Mais lorsque je compile j'obtiens 2 erreurs : 
undefined reference to 'sommeTableau'
error : ld returned 1 exit status

Ces 2 erreurs n'apparaissent plus lorsque je met ma fonction sommeTableau à la suite du main dans mon fichier main.c, et je me demande bien pourquoi !

Si vous avez des réponses ou des pistes que je comprenne bien comment ça marche ...


Merci :)

-
Edité par MacMax1 17 juin 2016 à 14:40:34

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 juin 2016 à 14:43:36

Dans ton fichier exercice1.c

#include "exercice1.h"

Dans ton fichier exercice1.c si tu n'inclus pas exercice1.h la définition de ta fonction est inconnus dans ton fichier main.c

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2016 à 14:54:40

Effectivement, problème résolu, merci !

Bizarrement entre temps j'avais "codé" l'exercice 2, sans mettre la ligne

#include "exercice2.h"

dans le exercice2.c et cela marchait..
Et après avoir compilé une fois avec la ligne

#include "exercice1.h"

dans le exercice1.c je peux enlever cette ligne sans que cela ne provoque d'erreurs.


Les codes sont décidément pleins de mystères :D !
 

  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 juin 2016 à 15:06:21

Un fichier .c contient la définition d'une fonction. Un fichier .h contient généralement seulement les prototypes de t'es fonctions.

Si tu compiles deux fichiers .c sans fichier .h qui prototypes t'es fonction tu n'auras pas forcement d'erreur de compilation seulement des warnings en fonction des options de ton compilateur (-W, -Wall, -ansi, -pedantic etc..). Ces flags permettent à ton compilateur de renvoyer une erreur au lieux d'un warning dans certains cas.

Par contre dans l'autre sens si tu inclus un fichier .h qui prototype une fonction qui est définis dans un fichier .c qui lui même n'inclus pas ce .h. Ton compilateur ne peux trouver la définition de ta fonction et donc te renvois une erreur.

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2016 à 15:19:41

Ah, je crois que j'ai compris la subtilité, merci :) !
  • Partager sur Facebook
  • Partager sur Twitter
Anonyme
17 juin 2016 à 15:52:29

C'est un plaisir. SI tu n'as plus de question tu peux passer ton sujet en résolu et continuer à travailler ;)
  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2016 à 16:22:21

MacMax1 a écrit:

Les codes sont décidément pleins de mystères :D !

Oui, et on tombe facilement sur de fausses informations, n'est-ce pas Yramyr...

'ld' est l'éditeur de liens. Ton erreur ne vient pas du source C, car la compilation a réussi. Elle est venue après, à l'édition des liens. Ton exercice1.c ne faisait visiblement pas partie du projet.
Si tu compilais en ligne de commande, c'est comme si tu avais lancé:
gcc main.c
au lieu de
gcc main.c exercice1.c

En C, il est généralement possible (mais toujours inutile et très risqué) de se passer des #include. Le compilateur arrive à construire un appel de fonction sans connaître le prototype de la fonction. Il déduit alors le prototype. Mais bien sûr, si l'on appelle mal la fonction, alors il déduit un mauvais prototype, et ça réagit mal à l'exécution.

Tu n'as pas besoin d'inclure <stdio.h> et <stdlib.h> si tu n'utilises rien de ces fichiers. En l'occurrence, il n'y a que <stdio.h> qui est utile dans main.c pour l'appel à printf.

-
Edité par Marc Mongenet 17 juin 2016 à 16:23:06

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2016 à 16:39:19

Bonjour Marc Mongenet,

Merci pour la précision, je vais vérifier l'inclusion de ce fichier dans mon projet ! Je vois maintenant qu'il faut bien mettre les .h et dans le main et dans la fonction dont le fichier est le prototype.

Quand aux librairies j'avoue avoir copié collé bêtement un code pour être sûr que cela marche sans comprendre quelles fonctions elles apportaient et quand elles devenaient nécessaire :honte: 

D'ailleurs puisque j'ai besoin de coder en C pour obtenir un code le plus rapide possible, j'imagine que le chargement d'une librairie non nécessaire n'est pas un facteur déterminant pour le temps de calcul puisqu'il ne se fait qu'une fois, est ce vrai ?

  • Partager sur Facebook
  • Partager sur Twitter
17 juin 2016 à 20:31:15

Bonsoir

MacMax1 a écrit:

Quand aux librairies j'avoue avoir copié collé bêtement un code pour être sûr que cela marche sans comprendre quelles fonctions elles apportaient et quand elles devenaient nécessaire :honte:

D'ailleurs puisque j'ai besoin de coder en C pour obtenir un code le plus rapide possible, j'imagine que le chargement d'une librairie non nécessaire n'est pas un facteur déterminant pour le temps de calcul puisqu'il ne se fait qu'une fois, est ce vrai ?

Les fichier d'en-tête (.h pour header) ne sont pas des bibliothèques (library en anglais).
Les inclure ralentit la compilation (en général très peu), mais ne change en principe pas le code exécutable produit. Ils n'ont donc pas d'effet sur les performances de cet exécutable.

  • Partager sur Facebook
  • Partager sur Twitter
29 août 2016 à 17:41:57

Bonjour, je fais le premier exo sur les tableaux et je me demandais où se trouvent les erreurs dans mon code :

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

int sommeTableau(int tableau [], int tailleTableau)


int main()

{
    int tableau[5] = {20, 30, 40, 100, 521};

    sommeTableau(tableau, 5);

    printf("La somme de ce tableau est de : %d", sommeTableau(tableau, 5));

    return 0;
}

int sommeTableau(int tableau [], int tailleTableau)
{
    int somme = 0, int i;

    for (i = 0 ; i < tailleTableau ; i++)
    {
        somme += tableau[i];
    }
    return somme;
}
J'ai un warning à la ligne 9 : "main" is usually a function
et une error aussi à la ligne 9 : syntax error before '{' token
Pourtant tout me semble bon, quelqu'un aurait-il la bonté de m'éclairer ? 
Merci d'avance !

-
Edité par TheMalnyr 29 août 2016 à 22:14:52

  • Partager sur Facebook
  • Partager sur Twitter
29 août 2016 à 20:38:12

Il manque un point-virgule ligne 4.

La ligne 12 ne sert à rien.

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2021 à 22:07:45

bonsoir 

je n'arrive pas à resoudre le probleme 3 sur les tableaux j'ai besion de quelques tuyaux

  • Partager sur Facebook
  • Partager sur Twitter
7 juin 2021 à 22:26:27

@TrueLoveisoneofgod Bonsoir, merci de ne pas déterrer d'ancien sujet résolu.

Déterrage

Citation des règles générales du forum :

Avant de poster un message, vérifiez la date du sujet dans lequel vous comptiez intervenir.

Si le dernier message sur le sujet date de plus de deux mois, mieux vaut ne pas répondre.
En effet, le déterrage d'un sujet nuit au bon fonctionnement du forum, et l'informatique pouvant grandement changer en quelques mois il n'est donc que rarement pertinent de déterrer un vieux sujet.

Au lieu de déterrer un sujet il est préférable :

  • soit de contacter directement le membre voulu par messagerie privée en cliquant sur son pseudonyme pour accéder à sa page profil, puis sur le lien "Ecrire un message"
  • soit de créer un nouveau sujet décrivant votre propre contexte
  • ne pas répondre à un déterrage et le signaler à la modération

Je ferme ce sujet. En cas de désaccord, me contacter par MP.

  • Partager sur Facebook
  • Partager sur Twitter