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. #41
    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 du prog sans les tableaux :

    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
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
     #include <stdlib.h>
    #include <stdio.h>
    #include <SDL/SDL.h>
    #include <time.h>
    #include <math.h>
     
    #define TAILLE 250000
     
    void initSDL(void);
    void setPixel(int x, int y, Uint32 coul);
    void actualiser(void);
    void attendreTouche(void);
     
    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);
     
     
    SDL_Surface *ecran; /* Le pointeur qui va stocker la surface de l'écran */
     
    int main(int argc, char *argv[])
    {
        srand(time(NULL));
     
    	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;
     
     
    	initSDL();
     
    	SDL_WM_SetCaption("Fractale", NULL); 
     
    	SDL_FillRect(ecran, NULL, SDL_MapRGB(ecran->format, 255, 255, 255));
     
     
        int j;
     
    	float present[2];
    	present[0]=0;
    	present[1]=0;
     
    	int n;
     
        int x, y;
     
    	for (j=0; j<TAILLE-1; j++)
    	{
    		n=pileOuFace();
     
    		if(n==1)
    		{
    			present[0]=produit_abscisse(matriceA, present)+colonneA[0];
    			present[1]=produit_ordonnee(matriceA, present)+colonneA[1];
    		}
    		else
    		{
    			present[0]=produit_abscisse(matriceB, present)+colonneB[0];
    			present[1]=produit_ordonnee(matriceB, present)+colonneB[1];
    		}
     
     
     
     
             x=floor(640*(1-present[0]));
    		y=floor(480*(1-present[1]));
     
                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;
    }
     
     
     
     
     
    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);
     
    }
     
     
    int pileOuFace()
    {
    	if ((rand() % 100) <49)
    	{
    		return 1;
    	}
    	else
    	{
    		return 2;
    	}
    }
     
     
     
    /* 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);
    }

  2. #42
    Invité
    Invité(e)
    Par défaut
    C'est remoi

    Je peux passer en revue un peu ton code ? (bon, je le fait, j'attend pas la réponse)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    int main(int argc, char *argv[])
    {
        srand(time(NULL));
     
    	float matriceA[2][2], matriceB[2][2];
    	float colonneA[2], colonneB[2];
    En C, il faut (si on exepte la norme c99) déclarer ses variables en début de bloc. Un bloc, c'est ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    {
       /* ceci est un bloc */
    }
    Cette remarque est valable pour tout le code, je ne l'ai mise qu'ici, mais c'est partout comme ca.

    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
     
       int n;
       int x, y;
     
       for (j=0; j<TAILLE-1; j++)
       {
          n=pileOuFace();
     
    		if(n==1)
    		{
    			present[0]=produit_abscisse(matriceA, present)+colonneA[0];
    			present[1]=produit_ordonnee(matriceA, present)+colonneA[1];
    		}
    		else
    		{
    			present[0]=produit_abscisse(matriceB, present)+colonneB[0];
    			present[1]=produit_ordonnee(matriceB, present)+colonneB[1];
    		}	
    /* ... */
    Pourquoi avoir utilisé une variable n qui ne sert qu'une seule fois ? Tu aurai pu faire ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if ( pileOuFace() == 1) {
       /* */
    } else {
       /* */
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
       system("PAUSE");	
       return 0;
    Ca, c'est moche... c'est pas portable, et en plus, ca ne sert pas à grand chose...

    De même utilser les variables EXIT_SUCCESS et EXIT_FAILLURE de stdlib.h

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    float produit_abscisse(float (*matrice)[2], float *colonne)
    {       
    	float prod1;
    	prod1=(matrice[0][0] * colonne[0]) + (matrice[0][1] * colonne[1]);
    	return(prod1);
    }
    pareil ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float produit_abscisse(float (*matrice)[2], float *colonne) {
    	return (matrice[0][0] * colonne[0]) + (matrice[0][1] * colonne[1]);
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    int pileOuFace()
    {
    	if ((rand() % 100) <49)
    	{
    		return 1;
    	}
    	else
    	{
    		return 2;
    	}
    }
    Pourquoi retourner 1 ou 2 et pas 0 ou 1... le 0/1 s'assimile au faux/vrai, et surtout te permet encore un fois d'alleger ton code par un simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    int pileOuFace() {
       return (rand() % 100) <49);
    }
    Voila, tout ceci allège un peu le code... sans pour autant le rendre moins lisible.

    Pour des questions de rapidité on peux aussi envisager de remplacer certaines fonctions par des macros, je pense par exemple à ceci

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    float produit_abscisse(float (*matrice)[2], float *colonne) {
    	return (matrice[0][0] * colonne[0]) + (matrice[0][1] * colonne[1]);
    }
    Que l'on peux remplacer par cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    #define produit_abscisse( matrice, colonne ) \
       (matrice[0][0] * colonne[0]) + (matrice[0][1] * colonne[1])
    moins typé, mais qui evite 2 jump... enfin, non, ca c'est pas important, on oublie. a part que ca evite ici de s'embeter avec des pointeurs...

    Vala, fini
    Dernière modification par Invité ; 24/08/2006 à 01h56.

  3. #43
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Tu ne peux pas allouer des tableaux gigantesques sur la pile. Si ton prog crash lorsque tu augmentes leur taille, alors tente une allocation dynamique.

  4. #44
    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 stokastik
    Mais ce qui est incompréhensible, c'est que bien que le calcul des points se fasse exactement de la même façon, la fractale n'est plus la même !
    Encore une fois, c'est un problème de C qui se passe ici et pas de SDL. Cette question ne devrait pas se trouver ici...


    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
    for (j=0; j<TAILLE-1; j++)
    	{
    		n=pileOuFace();
     
    		if(n==1)
    		{
                            /* ATTENTION, ICI CE CALCUL MODIFIE present[0] */
    			present[0]=produit_abscisse(matriceA, present)+colonneA[0];
                            /* DONC CE CALCUL N'EST PLUS LE MEME QU'AVANT!!!!*/
    			present[1]=produit_ordonnee(matriceA, present)+colonneA[1];
    		}
    		else
    		{
                            /* ATTENTION, ICI CE CALCUL MODIFIE present[0] */
    			present[0]=produit_abscisse(matriceB, present)+colonneB[0];
                            /* DONC CE CALCUL N'EST PLUS LE MEME QU'AVANT!!!!*/
    			present[1]=produit_ordonnee(matriceB, present)+colonneB[1];
    		}
    Et après :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((rand() % 100) <49)
    n'est pas pareil que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ((rand() % 100) <80)
    Donc il ne faut pas dire que les 2 sont identiques si ce n'est pas le cas...
    Jc

  5. #45
    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 Laurent Gomila
    Tu ne peux pas allouer des tableaux gigantesques sur la pile. Si ton prog crash lorsque tu augmentes leur taille, alors tente une allocation dynamique.
    En principe, ce n'est pas encore gigantesque, il était à un million d'éléments, cela devrait tenir dans la pile... Mais sa nouvelle méthode n'utilise plus de tableau...

    Jc

  6. #46
    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
    Bonjour,

    Je ne comprends pas pourquoi tu dis que le calcul de present[0] et present[1] est différent d'auparavant.

    Quant au pileOuFace, oui 'if ((rand() % 100) <49)' n'est pas pareil que 'if ((rand() % 100) <80)' mais j'ai essayé de mettre pareil, il n'empêche que la fractale change d'allure.

  7. #47
    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
    aaaaaaaahhhhhhhhh j'ai compris!!

  8. #48
    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
    Désolé au fait de vous avoir dérangé pour ça. Dans mon passé je n'aurais jamais fait une telle erreur algorithmique sans m'en aprecevoir. Il faut que je me mette en tête que mes neurones sont moins fiables que dans ma tendre jeunesse.

    Merci pour votre attention et tous vos conseils

  9. #49
    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
    Mais sa nouvelle méthode n'utilise plus de tableau...

    Bonjour vous vous souvenez de moi ?

    Depuis j'ai ajouté de la RAM à mon ordi et avec la 2ème version de mon prog, celle sans les tableaux, je peux augmenter la taille bien au-delà de 250000.
    Par contre ça ne change rien à la 1ère version du prog, celle avec les tableaux, la taille est toujours limitée à 130000.

  10. #50
    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 stokastik
    Bonjour vous vous souvenez de moi ?

    Depuis j'ai ajouté de la RAM à mon ordi et avec la 2ème version de mon prog, celle sans les tableaux, je peux augmenter la taille bien au-delà de 250000.
    Par contre ça ne change rien à la 1ère version du prog, celle avec les tableaux, la taille est toujours limitée à 130000.
    Je suppose que tu as trituré le code et que tu as pris en compte toutes les remarques. Je te propose donc de donner la nouvelle version avec tableau pour voir le problème...

    Jc

  11. #51
    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
    Ah euh non désolé le prog avec les tableaux je ne l'ai pas touché depuis.

  12. #52
    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 stokastik
    Ah euh non désolé le prog avec les tableaux je ne l'ai pas touché depuis.
    Tout de même, mets tes fichiers dans un .zip et mets le en pièce jointe. Je veux être sûr qu'on travaille sur la même version.

    Jc

  13. #53
    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
    Ca fait bien longtemps que je n'ai pas touché à ce prog. Il faudra que je le retrouve. Pour l'instant je vais faire un footing

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