IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SDL Discussion :

projet "SDL" en plusieurs fichiers


Sujet :

SDL

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut projet "SDL" en plusieurs fichiers
    Bonjour,

    J'ai fait mon premier prog en C avec SDL, celui-ci dessine une fractale point par point à partir de nombres aléatoires simulées. J'ai mis l'image en pièce jointe.

    J'utilise Dev-C++ sous Windows98.

    - J'ai voulu faire un fichier à part contenant certaines fonctions faisant appel à la bibliothèque SDL, ça ne fonctionne pas, par contre ça fonctionne bien si je ne les mets pas dans un fichier en part mais juste en-dessous de la fonction "main". Pourquoi cela ?

    - Une autre question au passage : ma fractale est dessinée avec 120000 points, si je mets 150000 l'ordi plante ; qu'est-ce qui détermine le nombre maximum de points que je peux utiliser ?

    PS : j'avais fait un prog avec MuPad pour dessiner cette même fractale, c'était très lent et en C c'est quasi-immédiat, bravo le C! (par contre je ne sais pas ce que ça donnerait avec Maple)
    Images attachées Images attachées  

  2. #2
    Invité
    Invité(e)
    Par défaut
    Pourrais-tu détailler exactement ce que tu as fait pour mettre tes fonctions à part... les contenu de tes fichiers .c et .h, etc...

    pour le probleme de points, il va falloir nous montrer un peu ton code, étant donné que l'on ne sais pas du tout ce que tu fais, on peut encore moins te dire ce qui est mal

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Le code est un peu long... pour répondre à ta question je n'ai fait aucun fichier .h, et pour mettre une fonction à part je l'écris simplement dans un autre fichier .c. Quand je fais ça sans utiliser SDL ça marche.

  4. #4
    Invité
    Invité(e)
    Par défaut
    alors, cela peux marcher, mais c'est pas la methode standard on va dire, il faut faire un fichier .h, je te renvoye à un cours de C pour voir comment on fait.

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    pour le probleme de points, il va falloir nous montrer un peu ton code, étant donné que l'on ne sais pas du tout ce que tu fais, on peut encore moins te dire ce qui est mal
    Je peux te dire que durant mon prog je construis d'abord deux tableaux de 120000 float avec lesquels je construis ensuite deux tableaux de 120000 int, avec lesquels le prog dessine ces points (le n-ième point a pour abscisse le n-ième élément du 1er tableau et pour ordonnée le n-ième élément du 2ème tableau). Est-ce qu'il est possible de faire quelque chose de maladroit pour la mémoire en suivant cette façon de faire ?

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    alors, cela peux marcher, mais c'est pas la methode standard on va dire, il faut faire un fichier .h, je te renvoye à un cours de C pour voir comment on fait.
    J'ai mis les prototypes des fonctions dans un .h ça ne change rien. Dès qu'une fonction utilisant une variable de STL est dans un autre fichier que le main, cette variable n'est pas reconnue.

    Mais peut-être que je m'y prends mal quand je fais plusieurs fichiers. Par exemple si je fait un #define je dois le mettre dans chaque fichier...

  7. #7
    Invité
    Invité(e)
    Par défaut
    fait nous voir ce code, ou au moins les parties qui ne marchent pas...

    avec la chaine d'inclusion.

    Pour ton histoire de memoire, je crains que tu y aille un peu violement la... si je ne me trompe pas, un int, ca fait 16 bits, donc, 2 octet... tu demande donc d'avoir 4*120 000 octets, soit a peu pres 480 Mo ensuite, un float fait 32bits, soit 4octets, donc, encore autant...

    Es-tu sur que demander 960Mo pour ton programme est raisonnable ?

  8. #8
    Expert éminent sénior

    Avatar de fearyourself
    Homme Profil pro
    Ingénieur Informaticien Senior
    Inscrit en
    Décembre 2005
    Messages
    5 121
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Etats-Unis

    Informations professionnelles :
    Activité : Ingénieur Informaticien Senior
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2005
    Messages : 5 121
    Points : 11 877
    Points
    11 877
    Par défaut
    Citation Envoyé par bibi.skuk
    fait nous voir ce code, ou au moins les parties qui ne marchent pas...

    avec la chaine d'inclusion.
    En effet, mais c'est un problème C, merci de mettre un code minimal et compilable dans le forum C pour demander pourquoi cela ne fonctionne pas.

    Pour ton histoire de memoire, je crains que tu y aille un peu violement la... si je ne me trompe pas, un int, ca fait 16 bits, donc, 2 octet...
    Au minimum c'est 16 bits mais cela dépend de l'implémentation (c'est à l'heure actuelle plutôt 4 octets)...

    tu demande donc d'avoir 4*120 000 octets, soit a peu pres 480 Mo ensuite, un float fait 32bits, soit 4octets, donc, encore autant...

    Es-tu sur que demander 960Mo pour ton programme est raisonnable ?
    Il faudrait revoir ses maths quand même ce calcul est faux...

    Jc

  9. #9
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    oui
    deux tableaux de 120000 float avec lesquels je construis ensuite deux tableaux de 120000


    Un int c'est plutôt 4 octects idem pour un float.

    120000*4*2 + 120000*4*2 = 1.83 Mo... c'est ok... mais bon...

    Il faut un peu de code... sinon si c'est des tableaux statiques cela peut poser problème.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    avec la chaine d'inclusion.
    Je ne sais pas ce qu'est une chaîne d'inclusion, le problème viendrait-il de là ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Es-tu sur que demander 960Mo pour ton programme est raisonnable ?
    Je n'ai pas de notion en de domaine. Un tableau de 120000 float c'est donc gros ?

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par fearyourself
    En effet, mais c'est un problème C, merci de mettre un code minimal et compilable dans le forum C pour demander pourquoi cela ne fonctionne pas.



    Au minimum c'est 16 bits mais cela dépend de l'implémentation (c'est à l'heure actuelle plutôt 4 octets)...


    Il faudrait revoir ses maths quand même ce calcul est faut...

    Jc
    bon... on va revoir le calcul...

    2 tableaux d'ints... 16 * 2 * 120 *10^3 = 3840 *10^3 bits... ce qui fait 480 * 10^3 octets

    1 tableau de floats 32 * 120 *10^3 = 3840 *10^3 bits...

    donc effectivement la même chose... Mais effectivement, je suis stupide... je suis allé un poil vite sur ce coup la... J'etait persuadé que ca faisait beaucoup, alros j'ai voulu voir beaucoup... pardon, ce n'est qu'un petit Mo qui est demandé ici, rien de bien grave... ton erreur est donc surement autre part.

    La mienne était ici ppar contre

    Edit : cela reste quand même assez enorme pour un aussi petit programme...

  12. #12
    Membre expert
    Avatar de Eusebe
    Inscrit en
    Mars 2006
    Messages
    1 992
    Détails du profil
    Informations personnelles :
    Âge : 46

    Informations forums :
    Inscription : Mars 2006
    Messages : 1 992
    Points : 3 344
    Points
    3 344
    Par défaut
    Citation Envoyé par stokastik
    Je ne sais pas ce qu'est une chaîne d'inclusion, le problème viendrait-il de là ?
    Avant d'utiliser des fonctions de bibliothèques, il faut inclure les fichiers (généralement.h) qui les définissent. Si tu ne le fais pas, ton compilateur doit hurler et te dire qu'il ne connais pas les fonctions que tu utilises...

    Quand tu compiles, tu dois bien obtenir une erreur... Donnes-la aussi sur le forum C, ça peut toujours servir...

  13. #13
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Avant d'utiliser des fonctions de bibliothèques, il faut inclure les fichiers (généralement.h) qui les définissent. Si tu ne le fais pas, ton compilateur doit hurler et te dire qu'il ne connais pas les fonctions que tu utilises...
    Tout cela fonctionne parfaitement.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Sans le code, la on va difficilement pouvoir t'aider, tu es sur que tu ne peux même pas l'uploader sur le forum ? en piece jointe ?

  15. #15
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Citation Envoyé par stokastik
    Tout cela fonctionne parfaitement.
    Mais

    Citation Envoyé par stokastik
    J'ai voulu faire un fichier à part contenant certaines fonctions faisant appel à la bibliothèque SDL, ça ne fonctionne pas.
    ??

  16. #16
    Membre habitué Avatar de poussinphp
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    428
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 428
    Points : 176
    Points
    176
    Par défaut
    J'aurais une question. Faut t'il obligatoirement garder en mémoire les 120.000 int et float?

    Ca serais peut être plus simple de faire ton tableau, le remplir, plaquer tes points sur ta surface puis de garder en mémoire ta surface, non? Je ne sais pas mais gérer un tableau aussi énorme, ça me semble être un nid à erreur... enfin... je pense

    Après côté aide sur ton code, faut pas avoir peur de montrer son code. Surtout quand on veut un peu d'aide. Tu aurais programmé un nouveau système d'exploitation ou un programme révolutionnaire (quake5 ^^), je veut bien mais bon là... je pense pas que quelqu'un irais voler ton code
    De plus, on peut pas deviner l'erreur, sachant que chaque personne à ça manière de developper et que des explications sans code ça reste plutot abstrait pour une aide précise

  17. #17
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Ti-R je dis que ça marche parfaitement quand je ne fais pas de fichier annexe.

    Voici le code :

    *fichier main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
     
    #include "header.h" 
     
     
    int main(int argc, char *argv[])
    {
        srand(time(NULL));
     
     
        int mabscisse[TAILLE]={0};
        int mordonnee[TAILLE]={0};
     
        obtenirSimulation(mabscisse, mordonnee);
     
     
        initSDL();
     
        SDL_WM_SetCaption("Fractale", NULL); 
     
        SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
        int i;
     
      for (i = 0; i < TAILLE; i++)
      {
          int x, y;
          x=mabscisse[i];
          y=mordonnee[i];
     
          if (x<640 && x>0 && y <480 && y>0)
          {
                    setPixel(x, y, SDL_MapRGB(ecran->format, 0, 0, 0));
          }  
      }  
     
     
        actualiser();
     
        attendreTouche();
     
     
        return EXIT_SUCCESS;
     
        system("PAUSE");	
        return 0;
    }
     
    /* Les fonctions ci-dessous sont relatives à SDL ; je les ai copiées sur un tuto du site. Ce sont celles-ci que je ne parviens pas à mettre dans un fichier "annexe" */
     
    void initSDL(void)
    {
      if (SDL_Init(SDL_INIT_VIDEO) < 0) {
        fprintf(stderr, "Erreur à l'initialisation de la SDL : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
      }
     
      atexit(SDL_Quit);
      ecran = SDL_SetVideoMode(640, 480, 32, SDL_SWSURFACE);
     
      if (ecran == NULL) {
        fprintf(stderr, "Impossible d'activer le mode graphique : %s\n", SDL_GetError());
        exit(EXIT_FAILURE);
      }
    }
     
    void setPixel(int x, int y, Uint32 coul)
    {
      *((Uint32*)(ecran->pixels) + x + y * ecran->w) = coul;
    }
     
    void actualiser(void)
    {
      SDL_UpdateRect(ecran, 0, 0, 0, 0);
    }
     
     
    void attendreTouche(void)
    {
      SDL_Event event;
     
      do
        SDL_WaitEvent(&event);
      while (event.type != SDL_QUIT && event.type != SDL_KEYDOWN);
    }

    *fichier header.h :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #define TAILLE 120000
     
     
    float produit_abscisse(float (*matrice)[2], float *colonne);
    float produit_ordonnee(float (*matrice)[2], float *colonne);
    int pileOuFace();
    void convolution(float* preabscisse, float* preordonnee, float (*matriceA)[2], float *colonneA, float (*matriceB)[2], float *colonneB);
    void transformation(float* preabscisse, float* preordonnee, int* abscisse, int* ordonnee);
    void obtenirSimulation(int* abscisse, int* ordonnee);
     
     
     
    void initSDL(void);
    void setPixel(int x, int y, Uint32 coul);
    void actualiser(void);
    void attendreTouche(void);
     
    SDL_Surface *ecran; // Le pointeur qui va stocker la surface de l'écran

    * fichiers "annexes" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    #define TAILLE 120000
     
     
    void obtenirSimulation(int* abscisse, int* ordonnee)
    { 
      float matriceA[2][2], matriceB[2][2];
      float colonneA[2], colonneB[2];
     
      matriceA[0][0]=0.839;
      matriceA[0][1]=-0.303;
      matriceA[1][0]=0.383;
      matriceA[1][1]=0.924;
     
      matriceB[0][0]=-0.161;
      matriceB[0][1]=-0.136;
      matriceB[1][0]=0.138;
      matriceB[1][1]=-0.182;
     
      colonneA[0]=0.232;
      colonneA[1]=-0.08;
     
      colonneB[0]=0.921;
      colonneB[1]=0.178;
     
     
       float preabscisse[TAILLE]={0};
       float preordonnee[TAILLE]={0};
     
       convolution(preabscisse, preordonnee, matriceA, colonneA, matriceB, colonneB);
     
     
       transformation(preabscisse, preordonnee, abscisse, ordonnee);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    #define TAILLE 120000
     
    float produit_abscisse(float (*matrice)[2], float *colonne)
    {       
           float prod1;
           prod1=(matrice[0][0] * colonne[0]) + (matrice[0][1] * colonne[1]);
           return(prod1);
     
    }
     
    float produit_ordonnee(float (*matrice)[2], float *colonne)
    {       
           float prod2;
           prod2=matrice[1][0] * colonne[0] + matrice[1][1] * colonne[1];
           return(prod2);
     
    }
     
     
    void convolution(float* preabscisse, float* preordonnee, float (*matriceA)[2], float *colonneA, float (*matriceB)[2], float *colonneB) 
    {
      int i;
     
      float present[2]={0};
       int n;
     
      for (i=0; i<TAILLE-1; i++)
      {
          present[0]=preabscisse[i];
          present[1]=preordonnee[i];
     
     
          n=pileOuFace();
     
          if(n==1)
          {
              preabscisse[i+1]=produit_abscisse(matriceA, present)+colonneA[0];
              preordonnee[i+1]=produit_ordonnee(matriceA, present)+colonneA[1];
          }
          else
          {
              preabscisse[i+1]=produit_abscisse(matriceB, present)+colonneB[0];
              preordonnee[i+1]=produit_ordonnee(matriceB, present)+colonneB[1];
          }           
      }
    }
     
    void transformation(float* preabscisse, float* preordonnee, int* zabscisse, int* zordonnee)
    {
         int i;
         for (i=0; i<TAILLE; i++)
         {
             zabscisse[i]=floor(640*(1-preabscisse[i]));
             zordonnee[i]=floor(480*(1-preordonnee[i]));
         }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    int pileOuFace()
    {
        if ((rand() % 100) <80)
        {
            return 1;
        }
        else
        {
            return 2;
        }
    }

  18. #18
    Invité
    Invité(e)
    Par défaut
    Bon, déja, j'ai mis toutes les fonctions "annexes" dans un seul et même fichier "header.c"

    ensuite, en haut de celui-ci, j'ai placé un petit #include "header.h"

    il me reste ceci comme erreurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    [alastor]~/tmp/tests%gcc -Wall -Wextra -ansi -pedantic `sdl-config --libs --cflags` main.c header.c
    In file included from main.c:5:
    header.h:18: erreur: expected identifier or(’ before ‘/’ token
    header.h:18: erreur: caractère ' de terminaison manquant
    In file included from header.c:1:
    header.h:14: erreur: expected declaration specifiers or ‘...’ before ‘Uint32’
    header.h:18: erreur: expected ‘=’, ‘,’, ‘;’, ‘asmor ‘__attribute__’ before ‘*’ token
    header.h:18: erreur: expected identifier or(’ before ‘/’ token
    header.h:18: erreur: caractère ' de terminaison manquant
    header.c: In function ‘transformation’:
    header.c:89: attention : implicit declaration of function ‘floor’
    header.c:89: attention : incompatible implicit declaration of built-in function ‘floor’
    header.c: In function ‘pileOuFace’:
    header.c:96: attention : implicit declaration of function ‘rand’
    Edit : je suis vraiment mauvais aujourd'hui, ci-dessus une fois compilé correctement, je continue de regarder les erreurs

  19. #19
    Membre émérite
    Avatar de Ti-R
    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Avril 2003
    Messages
    1 683
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2003
    Messages : 1 683
    Points : 2 568
    Points
    2 568
    Par défaut
    Il est inclus où le fichier annexe ?

    [EDIT]
    Uint32
    il y a une typedef dessus Uint32?
    [\EDIT]
    [EDIT2]
    et avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #include <time.h> // pour time
    [/EDIT2]

  20. #20
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    99
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 99
    Points : 31
    Points
    31
    Par défaut
    Il est inclus où le fichier annexe ?
    Je fais "ajouter un fichier" avec Dev-C++ et rien d'autre, à la compilation il compile tous les fichiers .c. Je n'inclus pas les fichier "annexes" avec une commande.

    bibi.skuk je ne comprends rien à ces messages d'erreur. Est-ce que chez toi ça marche si tu mets #define TAILLE 150000 ?

    Merci pour votre attention.

Discussions similaires

  1. compilation projet ( en plusieur fichier )
    Par damien77 dans le forum Code::Blocks
    Réponses: 3
    Dernier message: 21/02/2007, 23h46
  2. Réponses: 5
    Dernier message: 07/09/2004, 17h38

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo