Accueil > Forum > > > > pb en C -> SDL et pointeur
pb en C -> SDL et pointeur
mercredi 4 mars 2009 à 19:41:04 |
pb en C -> SDL et pointeur

snake57
|
Bonjour, j'ai un petit problème avec un prog que je suis entrain de faire.
C'est la première fois que j'utilse la SDL et les pointeurs donc je galère un peu.
Voici mon code :
[code] const int tailleCarre=20; // Taille d'un carré en pixel.
const int nbrCarreLigneTotal=22; // Nombre de carré composant la hauteur du plateau.
const int nbrCarreColonneTotal=11; // Nombre de carré composant la largeur du plateau.
const int tailleEcranLargeur=800; // Taille de la largeur de la fenêtre de jeu (en pixel).
const int tailleEcranHauteur=600; // Taille de la hauteur de la fenêtre de jeu (en pixel).
const int tailleEspaceCarre=1; // Taille de l'espace entre les différents carré (en pixel).
SDL_Surface *ecran = NULL; // Le pointeur qui va stocker la surface de l'écran.
SDL_Surface *carre = NULL; // Les formes sont composées de plusieurs carrés mis cote a cote.
SDL_Rect *positionCarre = NULL;
SDL_Event event; // La variable contenant l'évènement
int continuer=1; //Variable qui permettra de sortir du programme dès qu'elle passera a 0.
int i,j;
SDL_Init(SDL_INIT_VIDEO);
ecran = SDL_SetVideoMode(tailleEcranLargeur, tailleEcranHauteur, 32, SDL_HWSURFACE| SDL_DOUBLEBUF); // On ouvre une fenêtre, SDL_HWSURFACE : les données seront chargées dans la mémoire vidéo, mode double buffering.
if (ecran == NULL) // Si l'ouverture a échoué, on écrit l'erreur et on arrête.
{
fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("Tetris", NULL); // Mettre "Tetris" comme nom de la fenêtre.
carre = (SDL_Surface*) malloc(nbrCarreLigneTotal * nbrCarreColonneTotal * sizeof(SDL_Surface));
if (carre == NULL) // On vérifie si l'allocation a marché ou pas
{
exit(EXIT_FAILURE); // On arrête tout
}
positionCarre =(SDL_Rect*) malloc(nbrCarreLigneTotal * nbrCarreColonneTotal * sizeof(SDL_Rect));
if (positionCarre == NULL) // On vérifie si l'allocation a marché ou pas
{
exit(EXIT_FAILURE); // On arrête tout
}
for (i=0; i<nbrCarreLigneTotal; i++) // création des carrés, mise encouleur des carres de bord, définition de l'emplacement des carrés.
{
for (j=0; j<nbrCarreColonneTotal; j++)
{
carre+i*nbrCarreColonneTotal+j = SDL_CreateRGBSurface(SDL_HWSURFACE, tailleCarre, tailleCarre, 32, 0, 0, 0, 0); // On creer les carré.
SDL_FillRect(carre+i*nbrCarreColonneTotal+j, NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); // On choisit la couleur de fond des carré.
positionCarre+i*nbrCarreColonneTotal+j->x = j*tailleCarre+j*tailleEspaceCarre;
positionCarre+i*nbrCarreColonneTotal+j->y = i*tailleCarre+i*tailleEspaceCarre;
}
}
[/code]
Enfait j'ai 3 erreurs de compil dans ma double boucle for:
la première est au niveau du SDL_CreateRGBSurface, le compilo me dit "error: non-lvalue in assignment".
les deux autres sont sur les deux dernieres ligne des boucles for, le compilo me dis "error: base operand of `->' is not a pointer".
Pour la première je vois pas trop ce que c'est le pb, les autres je pense que c'est a cause des pointeurs mais je vois pas quoi faire.
|
|
jeudi 5 mars 2009 à 15:49:52 |
Re : pb en C -> SDL et pointeur

The_Snail
|
Salut,
Je te conseil dans un premier temps de lire un cours sur les pointeurs : ici par exemple http://www.siteduzero.com/tutoriel-3-14005-a-l-assaut-des-pointeurs.html
Le soucis que tu as c'est que la tu écris un peu nimporte où en mémoire (un pointeur représente une adresse de la mémoire) et même si le programme passait la compilation tu aurais surement une erreur fatale au lancement.
Sinon pour résoudre ton probleme tu peut utiliser des tableau de pointeur pour carre et positionCarre.
Il faudrait que tu arrives à ce genre de ligne :
au lieu de "positionCarre+i*nbrCarreColonneTotal+j->x" tu devrais avoir un truc du genre "positionCarre[i*nbrCarreColonneTotal+j]->x"
++
|
|
jeudi 5 mars 2009 à 16:53:22 |
Re : pb en C -> SDL et pointeur

The_Snail
|
Salut,
Après modif ça donne un truc du genre :
#include "sdl.h"
#include <stdio.h>
int main(int argc, char** argv)
{
const int tailleCarre=20;
const int nbrCarreLigneTotal=22;
const int nbrCarreColonneTotal=11;
const int tailleEcranLargeur=800;
const int tailleEcranHauteur=600;
const int tailleEspaceCarre=1;
SDL_Surface *ecran;
SDL_Surface *carre[nbrCarreColonneTotal][nbrCarreLigneTotal]; // on utilise un tableau à 2 entrées
SDL_Rect positionCarre[nbrCarreColonneTotal][nbrCarreLigneTotal]; // idem
SDL_Event event;
int continuer=1;
int i,j;
printf("Init SDL\n");
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
atexit(SDL_Quit);
printf("Creation de la fenetre\n");
ecran = SDL_SetVideoMode(tailleEcranLargeur, tailleEcranHauteur, 16, SDL_HWSURFACE|SDL_DOUBLEBUF);
if (ecran == NULL)
{
fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("Tetris", NULL);
printf("Creation de la grille\n");
for (i = 0; i < nbrCarreColonneTotal; i++) // i colonne
{
for (j = 0; j < nbrCarreLigneTotal; j++) // j ligne
{
carre[i][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, tailleCarre, tailleCarre, 32, 0, 0, 0, 0); // On creer les carré.
printf("ajout couleur\n");
SDL_FillRect(carre[i][j], NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); // On choisit la couleur de fond des carré.
positionCarre[i][j].x = i*tailleCarre+i*tailleEspaceCarre; // position x du carre
positionCarre[i][j].y = j*tailleCarre+j*tailleEspaceCarre; // position y du carre
}
}
printf("Boucle principale\n");
while(continuer == 1)
{
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
continuer = 0;
break;
// check for keypresses
case SDL_KEYDOWN:
{
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE)
continuer = 0;
break;
}
} // end switch
}
// Efface l'ecran
SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
// Affichage des carres
for (i = 0; i < nbrCarreColonneTotal; i++)
{
for (j = 0; j < nbrCarreLigneTotal; j++)
{
SDL_BlitSurface(carre[i][j], 0, ecran, &positionCarre[i][j]);
}
}
// Switch du buffer de l'ecran
SDL_Flip(ecran);
}
return 0;
}
voila j'espere que ça t'aidera.
++
|
|
jeudi 5 mars 2009 à 19:30:44 |
Re : pb en C -> SDL et pointeur

snake57
|
oui the_snail cela fonctionne, mais plus tard j'aurais besoin de passer mon tableau "carre" et "positioncarre" a des fonctions.
Si elle sont déclaré de la sorte est ce que c'est possible?
SDL_Surface *carre[nbrCarreColonneTotal][nbrCarreLigneTotal]; // on utilise un tableau à 2 entrées
SDL_Rect positionCarre[nbrCarreColonneTotal][nbrCarreLigneTotal]; // idem
Si c'est possible tu peux juste me donner un exemple de ce que sa donnerais si par ex je voulais mettre cette partie dans une fonction :
for (i = 0; i < nbrCarreColonneTotal; i++) // i colonne
{
for (j = 0; j < nbrCarreLigneTotal; j++) // j ligne
{
carre[i][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, tailleCarre, tailleCarre, 32, 0, 0, 0, 0); // On creer les carré.
printf("ajout couleur\n");
SDL_FillRect(carre[i][j], NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); // On choisit la couleur de fond des carré.
positionCarre[i][j].x = i*tailleCarre+i*tailleEspaceCarre; // position x du carre
positionCarre[i][j].y = j*tailleCarre+j*tailleEspaceCarre; // position y du carre
}
}
Voila si tu avais le temps pour me montrer sa, sa serait sympa ;)
|
|
vendredi 6 mars 2009 à 17:09:31 |
Re : pb en C -> SDL et pointeur

The_Snail
|
Salut,
Oui il est possible de passer des tableaux en paramètre à des fonctions et c'est très simple. Voici ce que ça donne (sur le code précédent j'avais inversé les indice de tableau par rapport à toi donc je les ai remis comme toi mais ça change rien à leur utilisation) :
#include "sdl.h"
#include <stdio.h>
#define nbrCarreLigneTotal 22
#define nbrCarreColonneTotal 11
#define tailleCarre 20
#define tailleEspaceCarre 1
int drawSquare(SDL_Surface* ecran, SDL_Surface* carre[][nbrCarreColonneTotal], SDL_Rect positionCarre[][nbrCarreColonneTotal]);
void createMap(SDL_Surface* carre[][nbrCarreColonneTotal], SDL_Rect positionCarre[][nbrCarreColonneTotal], SDL_Surface* ecran);
int main(int argc, char** argv)
{
const int tailleEcranLargeur = 800; // Taille de la largeur de la fenêtre de jeu (en pixel).
const int tailleEcranHauteur = 600; // Taille de la hauteur de la fenêtre de jeu (en pixel).
SDL_Surface *ecran; // Le pointeur qui va stocker la surface de l'écran.
SDL_Surface *carre[nbrCarreLigneTotal][nbrCarreColonneTotal]; // Les formes sont composées de plusieurs carrés mis cote a cote.
SDL_Rect positionCarre[nbrCarreLigneTotal][nbrCarreColonneTotal];
SDL_Event event; // La variable contenant l'évènement
int continuer=1; //Variable qui permettra de sortir du programme dès qu'elle passera a 0.
printf("Init SDL\n");
if ( SDL_Init( SDL_INIT_VIDEO ) < 0 )
{
printf( "Unable to init SDL: %s\n", SDL_GetError() );
return 1;
}
atexit(SDL_Quit);
printf("Creation de la fenetre\n");
ecran = SDL_SetVideoMode(tailleEcranLargeur, tailleEcranHauteur, 16, SDL_HWSURFACE|SDL_DOUBLEBUF); // On ouvre une fenêtre, SDL_HWSURFACE : les données seront chargées dans la mémoire vidéo, mode double buffering.
if (ecran == NULL) // Si l'ouverture a échoué, on écrit l'erreur et on arrête.
{
fprintf(stderr, "Impossible de charger le mode vidéo : %s\n", SDL_GetError());
exit(EXIT_FAILURE);
}
SDL_WM_SetCaption("Tetris", NULL); // Mettre "Tetris" comme nom de la fenêtre.
printf("Creation de la grille\n");
createMap(carre, positionCarre, ecran);
printf("Boucle principale\n");
while(continuer == 1)
{
while (SDL_PollEvent(&event))
{
// check for messages
switch (event.type)
{
// exit if the window is closed
case SDL_QUIT:
continuer = 0;
break;
// check for keypresses
case SDL_KEYDOWN:
{
// exit if ESCAPE is pressed
if (event.key.keysym.sym == SDLK_ESCAPE)
continuer = 0;
break;
}
} // end switch
}
// Efface l'ecran
SDL_FillRect(ecran, 0, SDL_MapRGB(ecran->format, 0, 0, 0));
// Affichage des carres
drawSquare(ecran, carre, positionCarre);
SDL_Flip(ecran);
}
return 0;
}
int drawSquare(SDL_Surface* ecran, SDL_Surface* carre[][nbrCarreColonneTotal], SDL_Rect positionCarre[][nbrCarreColonneTotal])
{
int i, j;
for (i = 0; i < nbrCarreLigneTotal; i++)
{
for (j = 0; j < nbrCarreColonneTotal; j++)
{
if((SDL_BlitSurface(carre[i][j], 0, ecran, &positionCarre[i][j]) == -1))
{
fprintf(stderr, "Erreur avec SDL_BlitSurface : %s\n",SDL_GetError());
return -1;
}
}
}
return 0;
}
void createMap(SDL_Surface* carre[][nbrCarreColonneTotal], SDL_Rect positionCarre[][nbrCarreColonneTotal], SDL_Surface* ecran)
{
int i, j;
for (i = 0; i < nbrCarreLigneTotal; i++) // création des carrés, mise encouleur des carres de bord, définition de l'emplacement des carrés.
{
for (j = 0; j < nbrCarreColonneTotal; j++)
{
carre[i][j] = SDL_CreateRGBSurface(SDL_HWSURFACE, tailleCarre, tailleCarre, 32, 0, 0, 0, 0); // On creer les carré.
SDL_FillRect(carre[i][j], NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); // On choisit la couleur de fond des carré.
positionCarre[i][j].x = j*tailleCarre+j*tailleEspaceCarre;
positionCarre[i][j].y = i*tailleCarre+i*tailleEspaceCarre;
}
}
}
Alors pour commencer j'ai supprimer quelques unes de tes variable constantes pour les mettre en "define" puisque qu'elle n'ont pas lieu d'être modifiés dans le programme.
Pour le passage de tableau en argument d'une fonction, tu n'est pas obligé de mettre la taille du premier indice mais pour les autres la taille est obligatoire. De plus lorsque tu écris "SDL_Surface* carre[][nbrCarreColonneTotal]", nbrCarreColonneTotal ne doit pas être une variable d'où l'interet de le mettre en define.
|
|
vendredi 6 mars 2009 à 20:37:26 |
Re : pb en C -> SDL et pointeur

snake57
|
ok, mais moi je voulais placer les fonctions dans des fichers différents pas dans le main.
En faisant comme tu as dis je suis obligé de déclarer "#define nbrCarreColonneTotal 11" a chaque que je fais un fichier avec une fonction qui prend SDL_Surface* carre[][nbrCarreColonneTotal] en paramètre.
Je trouve pas sa super pratique.
Y'aurais pas moyen d'avoir une fonction qui prend en paramètre l'adresse du premier carré "SDL_Surface* carre" et qui calcul les adresse des carrés suivant en utilisant les variables des boucles?
Pour ensuite utiliser cette adresse calculé dans le SDL_FillRect?
|
|
vendredi 6 mars 2009 à 20:41:35 |
Re : pb en C -> SDL et pointeur

snake57
|
En clair sa donnerais un truc du genre la:
void modifCouleur(int nbrLigne, int nbrColonne, SDL_Surface *carre, SDL_Surface *ecran)
{
int i, j;
for (i = 0; i < nbrLigne; i++)
{
for (j = 0; j < nbrColonne; j++)
{
carre=carre+i*nbrColonne+j;
SDL_FillRect(carre, NULL, SDL_MapRGB(ecran->format, 128, 128, 128)); // On choisit la couleur de fond des carré.
}
}
}
La la compil passe mais le prog plante :((( et c'est justement en truc dans le genre la que je voudrais faire.
|
|
vendredi 6 mars 2009 à 23:53:34 |
Re : pb en C -> SDL et pointeur

The_Snail
|
Salut,
D'après moi la solution reste de créer un fichier d'en-tête comme ceci :
// Fichier constantes.h
#ifndef CONSTANTES__H__
#define CONSTANTES__H__
// Definition des constantes
#define nbrCarreColonneTotal 11
#define nbrCarreLigneTotal 22
#endif
// Fin du fichier constantes.h
et ce fichier tu l'inclus dans tous tes ficiers C qui ont besoin des constantes avec cette ligne
#include "constantes.h"
Si cette methode ne te plais pas, le seul moyen que je vois, c'est d'utiliser des pointeurs double et triple à la place des tableaux et d'allouer la memoire dynamiquement et la dans la fonction tu as juste à passer par les pointeur mais c'est assez galère je trouve. Ca rajoute pas mal de code (allocation mémoire et libération de la memoire allouée) et il est préférable de bien manipuler les pointeurs pour ça.
|
|
samedi 7 mars 2009 à 00:30:06 |
Re : pb en C -> SDL et pointeur

snake57
|
j'aurais préféré avec les pointeurs et l'allocation de mémoire, c'est ce que j'avais essayé de faire a la base mais sans succes.
|
|
samedi 14 mars 2009 à 21:10:22 |
Re : pb en C -> SDL et pointeur

snake57
|
Bonjour,
j'ai essayé de passer par les pointeurs triples, mais j'arrive pas a allouer, la compilation ne passe pas, pouvez vous m'aider svp?
Voici mon code :
const int nbrCarreLigneTotal=22;
const int nbrCarreColonneTotal=11;
SDL_Surface ***carre={NULL};
carre = malloc(nbrCarreLigneTotal*sizeof(*carre));
for( i = 0; i < nbrCarreLigneTotal; ++i)
{
carre[i] = malloc(nbrCarreColonneTotal*sizeof(**carre));
}
le compilo me bloc sur les deux malloc, sur le premier j'ai l'erreur :
"error: invalid conversion from `void*' to `SDL_Surface***'"
et sur le second malloc j'ai :
"error: invalid conversion from `void*' to `SDL_Surface**'"
|
|
Cette discussion est classée dans : int, const, exit, sdl, carré
Répondre à ce message
Sujets en rapport avec ce message
Format de données [ par leskritiques ]
Voici le programme que je veux modofier :#include "chaine.h"#include "entreeSortie.h"#include "chaine.cpp"#include "entreeSortie.cpp"int pgcd (const i
ProB avec la fonction int remove (const char*) [ par Avalon10101 ]
_-=AvAloN=-_Jai un petit prob avec cette fonction :Je cré mon prog il na aucune erreur é il est donc pré à etre exécuter pour suprimer un fichier test
Blit de surface avec SDL [problème d'affichage] [ par cyberlewis ]
Bonjour,Voilà j'ai fait un code (jeu vidéo SDL),j'arrive à afficher la partie que je veux (tiles, tiles.bmp) dans screen qui est affichée à l'écran, p
morpion 10 * 10 en C avec SDL [ par nicoworld ]
Voilà j'ai ce petit sujet : clair un petit morpion 100 cases donc et interface SDl à oui et 2 joueurs...je m'arrache les cheveux avec mes booléens =
Tableau avec new [ par Dalamar ]
bonjour, je suis incapable de créer un tableau multidimentionnel avec une fonction:TileEngine::TileEngine(const int w, const int h) { nTiles = w * h;
class matrice [ par flaky ]
Slt à tousJ'utilise une classe "matrice" (celle de nicolas aunai, téléchargée sur le site) qui fonctionne très bien. Mais j'ai du mal à manipuler l'ob
Probleme de carré noir devant un résultat [ par jekburn ]
Bonsoir je souhaiterais savoir si possible, si vous savez comment faire pour enlever un carré noir devant le résultat de mon programme.merci#include#i
Fatal signal: Segmentation Fault (SDL Parachute Deployed) [ par broks ]
Je ne comprends vraiment pas pourkoa ca ne marche pas...C'est surement un probleme au niveau de la fonction saisi puisque je plante lorsque je dois sa
[C++] Problème en POO [ par Tijee ]
Bonjour à tous.Voila, j'ai fait un petit moteur 2D avec SDL compilé avec Dev-Cpp, il est simple mais fonctionne très bien. J'aimerais parvenir au même
Livres en rapport
|
Derniers Blogs
TECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURSTECHDAYS PARIS 2010 : SHAREPOINT 2010 POUR LES DéVELOPPEURS par ROMELARD Fabrice
Animé par: Laurent Cotton Le développement dans SharePoint 2010 passe par plusieurs axes qui seront évoqués dans cette session, mais plus particulièrement les développements simples lié au besoin Business Business Connectivity Services Ce BCS es...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice TECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOURTECHDAYS PARIS 2010 : PLEINIèRE DERNIER JOUR par ROMELARD Fabrice
Cette session est la dernière pleinière de ces 3 jours de TechDays Paris 2010. Généralement, cette troisième journée est plus axée sur l'avenir vu par Microsoft. Après un retour sur l'avenir vu par la Science Fiction ou par ...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice UNE JOLIE-HORLOGE ET PAS QU'UN PEU !UNE JOLIE-HORLOGE ET PAS QU'UN PEU ! par neodante
Pour les possesseurs d'iPhone, ça y est Bijin Tokei - qui se traduit littéralement en Français par " Jolie Horloge " - est arrivé et GRATUITEMENT s'il vous plaît ! Après la version Tokyo, Hokkaido, night club, racing, Gal, "pour les mademoiselles'", . voi...
Cliquez pour lire la suite de l'article par neodante TECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICESTECHDAYS PARIS 2010 : CONNECTEZ VOS DONNéES à SHAREPOINT 2010 AVEC LES BUSINESS CONNECTIVITY SERVICES par ROMELARD Fabrice
Animé par: Gaetan Bouveret et Julien Chomarat Business Connectivity Services (BCS) est dans SharePoint 2010 la version 2 de Business Data Catalog (BDC dans SharePoint 2007). Il s'agit de la solution permettant de visualiser des données provenan...
Cliquez pour lire la suite de l'article par ROMELARD Fabrice [DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE[DIVERS] SUIVRE VOS SéRIES PRéFéRéS SUR LA TOILE par orion
Comme de nombreux geek, je suis un grand amateur de série TV et je rate régulièrement des épisodes de mes séries préférés. Une solution s'offre à vous avec ce merveilleux site : Tv Gorge - www.tvgorge.com Moteur de recherche à l'appui, vous pouvez ...
Cliquez pour lire la suite de l'article par orion
Forum
RE : WIN APIRE : WIN API par omarino_007
Cliquez pour lire la suite par omarino_007
Logiciels
DB-MAIN (9.1.0)DB-MAIN (9.1.0)DB-MAIN is a data-modeling and data-architecture tool. It is designed to help developers and anal... Cliquez pour télécharger DB-MAIN Xilisoft DPG Convertisseur (5.1.37.0120)XILISOFT DPG CONVERTISSEUR (5.1.37.0120)Xilisoft DPG Convertisseur offre aux fans de Nintendo DS une bonne solution leur permettant de dé... Cliquez pour télécharger Xilisoft DPG Convertisseur GraphicsGale (2.01.01)GRAPHICSGALE (2.01.01)GraphicsGale est un logiciel de PixelArt avec de nombreuse fonctionnalités permettant de réalisé ... Cliquez pour télécharger GraphicsGale Architecte 3D (Platinum 2010)ARCHITECTE 3D (PLATINUM 2010)Architecte 3D Platinium vous permet de concevoir facilement les plans votre future maison, de l'é... Cliquez pour télécharger Architecte 3D TeamViewer 5 (TeamViewer 5)TEAMVIEWER 5 (TEAMVIEWER 5)Dépanner un ami,expliquer une manipulation devient un jeu d'enfant.
Prise en main d'un autre ord... Cliquez pour télécharger TeamViewer 5
|