Cpowa | Salut,
J'ai des erreurs à la compilation de mon programme:
Code :
- ||=== pendule, Debug ===|
- obj\Debug\main.o||In function `SDL_main':|
- taire\Bureau\pendule\main.c|36|undefined reference to `_affichePoint'|
- taire\Bureau\pendule\main.c|49|undefined reference to `_calculeAcc'|
- taire\Bureau\pendule\main.c|50|undefined reference to `_eulerVit'|
- taire\Bureau\pendule\main.c|51|undefined reference to `_eulerPos'|
- taire\Bureau\pendule\main.c|56|undefined reference to `_affichePoint'|
- obj\Debug\evenement.o||In function `affichePoint.4':|
- taire\Bureau\pendule\evenement.c|135|undefined reference to `_disque'|
- ||=== Build finished: 6 errors, 0 warnings ===|
|
Je compile avec code::blocks, Le projet est bien en mode realase et debug, ainsi que tout mes fichiers.
Voici mes sources:
main.c
Code :
- #include <stdio.h>
- #include <SDL/SDL.h>
- #include "graphique.h"
- #include <math.h>
- #include "evenement.h"
- #include "commun.h"
- int main(int argc, char *argv[])
- {
- double point[NB_PROP][NBPART];
- int i, continuer=1, vecteur=0;
- SDL_Event event;
- /*Initialisation de la SDL et ouverture de la fenêtre graphique avec redirection des erreurs vers la sortie standard*/
- if(SDL_Init(SDL_INIT_VIDEO)==-1){
- fprintf(stderr, "Erreur à l'initialisation de la SDL: %s \n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- ecran=SDL_SetVideoMode(800, 800, 32, SDL_HWSURFACE | SDL_DOUBLEBUF);
- if(ecran==NULL){
- fprintf(stderr, "Erreur à l'initilisation du mode graphique: %s\n", SDL_GetError());
- exit(EXIT_FAILURE);
- }
- SDL_WM_SetCaption("Pendule élastique", NULL);
- /*#################################################################################################################*/
- initCouleurs(ecran);
- effacerEcran();
- init(point, ecran);
- affichePoint(point, vecteur);
- SDL_Flip(ecran);
- attendTouche();
- /*--------=========#####Boucle principale du programme######========-------*/
- while(continuer){
- for(i=0; i<NBPART; i++){
- calculeAcc(i, point);
- eulerVit(i, point);
- eulerPos(i, point);
- }
- /*On calcul les positions*/
- effacerEcran();
- affichePoint(point, vecteur);
- ligne(400, 400, point[POSX][0], point[POSY][0], couleurs[C_NOIR]); /*On affiche les particules */
- ligne(point[POSX][0], point[POSY][0], point[POSX][1], point[POSY][1], couleurs[C_NOIR]);
- SDL_Flip(ecran);
- SDL_Delay(DELAI_MS);
- appuisSurV(&vecteur, event);
- quitterOuEchap(&continuer, event);
- }
- /*##################################################################################*/
- SDL_Quit();
- return EXIT_SUCCESS;
- }
|
graphique.c
Code :
- #include <SDL/SDL.h>
- #include "graphique.h"
- /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
- Données: Aucunes
- Précondition: Avoir initialisé la SDL
- */
- void initCouleurs(SDL_Surface *v_ecran)
- {
- couleurs[C_NOIR] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x00);
- couleurs[C_BLEU_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0x80);
- couleurs[C_VERT_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x00);
- couleurs[C_CYAN_FONCE] = SDL_MapRGB(v_ecran->format, 0x00, 0x80, 0x80);
- couleurs[C_ROUGE_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x00);
- couleurs[C_MAGENTA_FONCE] = SDL_MapRGB(v_ecran->format, 0x80, 0x00, 0x80);
- couleurs[C_OCRE] = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x00);
- couleurs[C_GRIS_CLAIR] = SDL_MapRGB(v_ecran->format, 0xC0, 0xC0, 0xC0);
- couleurs[C_GRIS] = SDL_MapRGB(v_ecran->format, 0x80, 0x80, 0x80);
- couleurs[C_BLEU] = SDL_MapRGB(v_ecran->format, 0x00, 0x00, 0xFF);
- couleurs[C_VERT] = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0x00);
- couleurs[C_CYAN] = SDL_MapRGB(v_ecran->format, 0x00, 0xFF, 0xFF);
- couleurs[C_ROUGE] = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0x00);
- couleurs[C_MAGENTA] = SDL_MapRGB(v_ecran->format, 0xFF, 0x00, 0xFF);
- couleurs[C_JAUNE] = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0x00);
- couleurs[C_BLANC] = SDL_MapRGB(v_ecran->format, 0xFF, 0xFF, 0xFF);
- }
- /*Procédure: Affiche un pixel de couleur donnée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- les coordonnées du pixel doivent se situer dans la fenêtre
- */
- void setPixel(int x, int y, Uint32 coul)
- {
- *((Uint32*)(POINTEUR_SURFACE->pixels) + x + y * POINTEUR_SURFACE->w) = coul;
- }
- /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
- */
- void setPixelVerif(int x, int y, Uint32 coul)
- {
- if (x >= 0 && x < POINTEUR_SURFACE->w &&
- y >= 0 && y < POINTEUR_SURFACE->h)
- setPixel(x, y, coul);
- }
- /*Procédure: Affiche une barre de dimensions données
- Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void barre(int x, int y, int w, int h, Uint32 coul)
- {
- SDL_Rect r;
- r.x = x;
- r.y = y;
- r.w = w;
- r.h = h;
- SDL_FillRect(POINTEUR_SURFACE, &r, coul);
- }
- /*Procédure: Remplit la fenêtre en blanc
- Données: Aucunes
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void effacerEcran(void)
- {
- SDL_FillRect(POINTEUR_SURFACE, NULL, couleurs[C_BLANC]);
- }
- /*Fonction: Echange deux variables d'entiers.
- Données: deux entiers
- Effet de bord: sur les deux variables
- */
- void echangerEntiers(int* x, int* y)
- {
- int t = *x;
- *x = *y;
- *y = t;
- }
- /*Procédure: Trace une ligne quelconque
- Données: Coordonnées du premier point, du second point et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32 bit.
- */
- void ligne(int x1, int y1, int x2, int y2, Uint32 coul)
- {
- int d, dx, dy, aincr, bincr, xincr, yincr, x, y;
- if (abs(x2 - x1) < abs(y2 - y1)) {
- /* parcours par l'axe vertical */
- if (y1 > y2) {
- echangerEntiers(&x1, &x2);
- echangerEntiers(&y1, &y2);
- }
- xincr = x2 > x1 ? 1 : -1;
- dy = y2 - y1;
- dx = abs(x2 - x1);
- d = 2 * dx - dy;
- aincr = 2 * (dx - dy);
- bincr = 2 * dx;
- x = x1;
- y = y1;
- setPixelVerif(x, y, coul);
- for (y = y1+1; y <= y2; ++y) {
- if (d >= 0) {
- x += xincr;
- d += aincr;
- } else
- d += bincr;
- setPixelVerif(x, y, coul);
- }
- } else {
- /* parcours par l'axe horizontal */
- if (x1 > x2) {
- echangerEntiers(&x1, &x2);
- echangerEntiers(&y1, &y2);
- }
- yincr = y2 > y1 ? 1 : -1;
- dx = x2 - x1;
- dy = abs(y2 - y1);
- d = 2 * dy - dx;
- aincr = 2 * (dy - dx);
- bincr = 2 * dy;
- x = x1;
- y = y1;
- setPixelVerif(x, y, coul);
- for (x = x1+1; x <= x2; ++x) {
- if (d >= 0) {
- y += yincr;
- d += aincr;
- } else
- d += bincr;
- setPixelVerif(x, y, coul);
- }
- }
- }
- /*Procédure: Trace un cercle
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- */
- void cercle(int cx, int cy, int rayon, int coul)
- {
- int d, y, x;
- d = 3 - (2 * rayon);
- x = 0;
- y = rayon;
- while (y >= x) {
- setPixelVerif(cx + x, cy + y, coul);
- setPixelVerif(cx + y, cy + x, coul);
- setPixelVerif(cx - x, cy + y, coul);
- setPixelVerif(cx - y, cy + x, coul);
- setPixelVerif(cx + x, cy - y, coul);
- setPixelVerif(cx + y, cy - x, coul);
- setPixelVerif(cx - x, cy - y, coul);
- setPixelVerif(cx - y, cy - x, coul);
- if (d < 0)
- d = d + (4 * x) + 6;
- else {
- d = d + 4 * (x - y) + 10;
- y--;
- }
- x++;
- }
- }
|
graphique.h
Code :
- #ifndef GRAPHIQUE_H
- #define GRAPHIQUE_H
- /*nom du pointeur (de type SDL_Surface) qui va stocker la surface qui correspond à toute la fenêtre,
- utilisé dans quasiment toutes les fonctions de ce fichier. Il faudra donc pour utiliser la plupart
- des modules de ce fichier récupérer le pointeur renvoyé par SDL_SetVideoMode
- */
- #define POINTEUR_SURFACE ecran
- enum
- {
- C_NOIR, C_BLEU_FONCE, C_VERT_FONCE, C_CYAN_FONCE, C_ROUGE_FONCE,
- C_MAGENTA_FONCE, C_OCRE, C_GRIS_CLAIR, C_GRIS, C_BLEU, C_VERT,
- C_CYAN, C_ROUGE, C_MAGENTA, C_JAUNE, C_BLANC,
- NB_COULEURS
- };
- SDL_Surface* POINTEUR_SURFACE;
- Uint32 couleurs[NB_COULEURS]; /*tableau global servant à la fonction InitCouleurs()*/
- /*Procédure: Permet d'utiliser les couleurs plus facilement en appellant la fonction au début du programme
- Données: Aucunes
- Précondition: Avoir initialisé la SDL
- */
- void initCouleurs(SDL_Surface *v_ecran);
- /*Procédure: Affiche un pixel de couleur donnée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- les coordonnées du pixel doivent se situer dans la fenêtre
- */
- void setPixel(int x, int y, Uint32 coul);
- /*Procédure: Affiche un pixel de couleur donnée de façon sécurisée
- Données: Coordonées du pixel et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit
- */
- void setPixelVerif(int x, int y, Uint32 coul);
- /*Procédure: Affiche une barre de dimensions données
- Données: coordonnées du point supérieur gauche, largeur, hauteur et le code couleur.
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void barre(int x, int y, int w, int h, Uint32 coul);
- /*Procédure: Remplit la fenêtre en blanc
- Données: Aucunes
- Préconditions: Avoir initialisé la SDL et le mode graphique
- */
- void effacerEcran(void);
- /*Fonction: Echange deux variables d'entiers.
- Données: deux entiers
- Effet de bord: sur les deux variables
- */
- void echangerEntiers(int* x, int* y);
- /*Procédure: Trace une ligne quelconque
- Données: Coordonnées du premier point, du second point et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32 bit.
- */
- void ligne(int x1, int y1, int x2, int y2, Uint32 coul);
- /*Procédure: Trace un cercle
- Données: Coordonnées du centre, rayon et code couleur
- Préconditions: Avoir initialisé la SDL et le mode graphique en 32bit,
- */
- void cercle(int cx, int cy, int rayon, int coul);
- #endif
|
evenement.c
Code :
- #include <math.h>
- #include <SDL/SDL.h>
- #include "graphique.h"
- #include "evenement.h"
- #include "commun.h"
- /*Procédure: Permet à l'utilisateur d'initialiser les particules (position, vitesse et rayon)
- Données: Tableau, et adresse de la surface contenant l'écran
- EB: modification des cases du tableau aux lignes indiquées
- Précondition: Avoir initialisé la SDL
- */
- void init(double point[][NBPART], SDL_Surface *ecran)
- {
- int i;
- double x, y, vx, vy, masse, constante_raideur, longueur_vide;
- for(i=0; i<NBPART; i++){
- /* printf("Position initiale en cm x,y \n" );
- scanf("%lf", &x);
- scanf("%lf", &y);
-
- point[POSX][i]=x;
- point[POSY][i]=y;
-
-
- printf("Vitesse initiale en m/s x,y \n" );
- scanf("%lf", &vx);
- scanf("%lf", &vy);
-
- point[VITX][i]=vx;
- point[VITY][i]=vy;
-
-
-
- printf("Masse en kg \n" );
- scanf("%lf", &masse);
- nuage[MASSE][i]=masse;
-
- printf("Constante de raideur en N/m \n" );
- scanf("%lf", &constante_raideur);
- point[CONSTANTE_RAIDEUR][i]=constante_raideur;
-
- printf("longueur a vide en cm \n" );
- scanf("%lf", &longueur_vide);
- point[LONGUEUR_VIDE][i]=longueur_vide;
-
-
- point[COULEUR][i]=couleurs[C_ROUGE];
- point[ACCX][i]=0;
- point[ACCY][i]=0;
- */
- point[POSX][i]=600;
- point[POSY][i]=400;
- point[VITX][i]=0;
- point[VITY][i]=0;
- point[ACCX][i]=0;
- point[ACCY][i]=0;
- point[MASSE][i]=1;
- point[COULEUR][i]=couleurs[C_CYAN];
- point[CONSTANTE_RAIDEUR][i]=50;
- point[LONGUEUR_VIDE][i]=100;
- }
- /*Procédure: Affiche un vecteur vitesse depuis le centre d'un particule
- Donnée: le tableau contenant les vitesses et la position et le n° de la colonne de la particule
- EB: Auncun
- Précondition: Avoir initialisé la SDL
- */
- void afficheUneVitesse(double point[][NBPART], int j)
- {
- ligne(point[POSX][j], point[POSY][j],point[POSX][j]+point[VITX][j],point[POSY][j]+point[VITY][j], couleurs[C_JAUNE]);
- }
- /*Procédure: calcule la position d'une particule
- Donné: indice de la particule et tableau où sont rangés les vitesses et les positions des particules
- EB: modifie les cases correspondant aux positions dans le tableau des particules
- Préconditions: Avoir initialisé la vitesse et la position des particules
- */
- void calculeAcc(int indice, double point[][NBPART])
- {
- point[ACCX][indice]=(-1*point[CONSTANTE_RAIDEUR][indice]/point[MASSE][indice])*(sqrt((point[POSX][indice]-400)*(point[POSX][indice]-400)+(point[POSY][indice]-400)*(point[POSY][indice]-400))-point[LONGUEUR_VIDE][indice])*((point[POSX][indice]-400)/sqrt((point[POSX][indice]-400)*(point[POSX][indice]-400)+(point[POSY][indice]-400)*(point[POSY][indice]-400)))-(COEF_FROTTEMENT/point[MASSE][indice])*point[VITX][indice];
- point[ACCY][indice]=g-(-1*point[CONSTANTE_RAIDEUR][indice]/point[MASSE][indice])*(sqrt((point[POSX][indice]-400)*(point[POSX][indice]-400)+(point[POSY][indice]-400)*(point[POSY][indice]-400))-point[LONGUEUR_VIDE][indice])*((point[POSY][indice]-400)/sqrt((point[POSX][indice]-400)*(point[POSX][indice]-400)+(point[POSY][indice]-400)*(point[POSY][indice]-400)))-(COEF_FROTTEMENT/point[MASSE][indice])*point[VITY][indice];
- }
- void eulerVit(int indice, double point[][NBPART])
- {
- point[VITX][indice]=point[VITX][indice]+DT*point[ACCX][indice];
- point[VITY][indice]=point[VITY][indice]+DT*point[ACCY][indice];
- }
- /*Procédure: calcule la position d'une particule
- Donné: indice de la particule et tableau où sont rangés les vitesses et les positions des particules
- EB: modifie les cases correspondant aux positions dans le tableau des particules
- Préconditions: Avoir initialisé la vitesse et la position des particules
- */
- void eulerPos(int indice, double point[][NBPART])
- {
- point[POSX][indice]=point[POSX][indice]+DT*point[VITX][indice];
- point[POSY][indice]=point[POSY][indice]+DT*point[VITY][indice];
- }
- /*Procédure: Affiche toutes les particules avec leur vecteurs vitesse ou non
- Données: tableau où sont stockés la position et le vecteur vitesse des particules
- booléen pour le cercle et le vecteur
- EB: aucun
- Préconditions: avoir initialisé la vitesse et la position des particules ainsi que la SDL.
- */
- void affichePoint(double point[][NBPART], int Vecteur)
- {
- int i;
- for(i=0; i<NBPART; i++){
- disque(point[POSX][i],point[POSY][i], 10, point[COULEUR][i]);
- }
- if(Vecteur)
- afficheUneVitesse(point, i);
- }
- }
- /*Procédure: vérifié si la touche echape est pressée ou si on a un évènement SDL_QUIT (clique sur la croix)
- sans bloquer l'éxecution du programme
- Données: Adresse de la varible de boucle et variable de l'évènement.
- EB: mise à zéro de la variable si un des deux évènement est détecté.
- Préconditions: avoir initialisé la SDL
- */
- void quitterOuEchap(int *continuer, SDL_Event event)
- {
- SDL_PollEvent(&event);
- switch(event.type){
- case SDL_QUIT:
- *continuer = 0;
- break;
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym){
- case SDLK_ESCAPE:
- *continuer = 0;
- break;
- }
- break;
- }
- }
- void appuisSurV(int *vecteur, SDL_Event event)
- {
- SDL_PollEvent(&event);
- switch(event.type){
- case SDL_KEYDOWN:
- switch (event.key.keysym.sym){
- case SDLK_v:
- *vecteur = 0;
- break;
- }
- break;
- }
- }
- /*Procédure: Attend jusqu'à l'appuie sur une touche
- Précondition: Avoir initialisé la SDL
- */
- void attendTouche(void)
- {
- int continuer=1;
- SDL_Event event;
- while (continuer){
- SDL_WaitEvent(&event);
- switch(event.type){
- case SDL_KEYDOWN:
- continuer = 0;
- break;
- }
- }
- }
|
evenement.h
Code :
- #ifndef EVENEMENT_H
- #define EVENEMENT_H
- #include "commun.h"
- /*Procédure: Permet à l'utilisateur d'initialiser les particules (position, vitesse et rayon)
- Données: Tableau, et adresse de la surface contenant l'écran
- EB: modification des cases du tableau aux lignes indiquées
- Précondition: Avoir initialisé la SDL
- */
- void init(double point[][NBPART], SDL_Surface *ecran);
- /*Procédure: Affiche un vecteur vitesse depuis le centre d'un particule
- Donnée: le tableau contenant les vitesses et la position et le n° de la colonne de la particule
- EB: Auncun
- Précondition: Avoir initialisé la SDL
- */
- void afficheUneVitesse(double point[][NBPART], int j);
- void calculeAcc(int indice, double point[][NBPART]);
- void eulerVit(int indice, double point[][NBPART]);
- void eulerPos(int indice, double point[][NBPART]);
- /*Procédure: Affiche les particuels avec leur vecteurs vitesse ou non
- Données: tableau où sont stockés la position et le vecteur vitesse des particules,
- booléen pour le cercle et le vecteur
- EB: aucun
- Préconditions: avoir initialisé la vitesse et la position des particules ainsi que la SDL.
- */
- void affichePoint(double point[][NBPART], int Vecteur);
- /*Procédure: vérifié si la touche echape est pressée ou si on a un évènement SDL_QUIT (clique sur la croix)
- sans bloquer l'éxecution du programme
- Données: Adresse de la varible de boucle et variable de l'évènement.
- EB: mise à zéro de la variable si un des deux évènement est détecté.
- Préconditions: avoir initialisé la SDL
- */
- void quitterOuEchap(int *continuer, SDL_Event event);
- void appuisSurV(int *vecteur, SDL_Event event);
- /*Procédure: Attend jusqu'à l'appuie sur une touche
- Précondition: Avoir initialisé la SDL
- */
- void attendTouche(void);
- #endif
|
commun.h
Code :
- #ifndef COMMUN_H
- #define COMMUN_H
- #define COEF_FROTTEMENT 0
- #define g 9.81
- #define NBPART 1
- #define DT 0.1
- #define DELAI_MS 5
- #define DELAI_S 0.005
- enum
- {
- POSX=0, POSY, VITX, VITY, ACCX, ACCY, MASSE, CONSTANTE_RAIDEUR, LONGUEUR_VIDE, COULEUR,
- NB_PROP
- };
- #endif
|
Merci pour votre aide. |