Pacman / kbhit() / linux

Pacman / kbhit() / linux - C - Programmation

Marsh Posté le 09-10-2005 à 16:38:25    

Salut  :hello:  
 
Je continue mes questions sur le même topic.
 
Bon pour mon petit pacman j'ai biensur été confronté au problème du kbhit()  :pfff:  et j'ai donc utilisé la méthode de Taz qui fonctionne très bien  :jap:.
 
Le problème c'est qu'avec la boucle while le programme bouffe méchament les ressources CPU, donc je me suis dis : tu va mettre un ptit sleep()! enfin la j'utilise un napms(), c'est mieux mais pas encore ca... puis en fonction du temps que je met ca ralentit l'affichage (logique).
 
Avez vous une idée/astuce pour améliorer le schmilblick ?
 
voila ma boucle while qui chope les entrées clavier :

Code :
  1. while(key!='p')
  2.   {
  3.     key = getcarac();
  4.     switch(key)
  5.       {
  6.         case 'z' :
  7.           move_UP(tab, MAX, &x_P, &y_P);
  8.           afficher_tab(tab, MAX);
  9.           break;         
  10.         case 's' :
  11.           move_DOWN(tab, MAX, &x_P, &y_P);
  12.           afficher_tab(tab, MAX);     
  13.           break;   
  14.         case 'd' :
  15.           move_RIGHT(tab, MAX, &x_P, &y_P);
  16.           afficher_tab(tab, MAX);     
  17.           break;   
  18.         case 'q' :
  19.           move_LEFT(tab, MAX, &x_P, &y_P);
  20.           afficher_tab(tab, MAX);     
  21.           break;
  22.         default :
  23.           break;           
  24.       }
  25.   napms(5);     
  26.   }


Je précise : linux/gcc/pacman sous shell
 
 :bounce:  
/*------------------------      [RESOLU]      ------------------------*/
J'ai commencé un genre de ptit pacman pour apprendre à bien maitriser les tableaux 2D mais voila lors de l'allocation de mon tableau j'ai une erreur de segmentation (je suis sous linux) alors que le même code fonctionne très bien sous win  :heink:  
 
vla l'code  de mon allocation :

Code :
  1. int** allouer_tab(int taille)
  2. {
  3.   int** tab;
  4.   int i;
  5.   tab = (int**) malloc (taille*sizeof(int*));
  6.   if(tab == NULL) {printw("erreur1\n" );return NULL;}
  7.   for(i=0;i<taille;i++)
  8.     tab[i] = (int*) malloc (taille*sizeof(int));
  9.   if(tab[i] == NULL) {printw("erreur2\n" );return NULL;}
  10.   return tab;
  11. }


et je l'apelle comme ca :

Code :
  1. int** tab;
  2. tab = allouer_tab(MAX);


Il compile bien mais lorsque j'execute il me dit "erreur2"  :pt1cable: et je vois pas ou est mon erreur sachant que ca fonctionnait bien sous win :/
 
Merci d'avance
/*------------------------      [/RESOLU]      ------------------------*/

Message cité 1 fois
Message édité par D-Jey le 09-10-2005 à 23:26:52
Reply

Marsh Posté le 09-10-2005 à 16:38:25   

Reply

Marsh Posté le 09-10-2005 à 16:44:38    

Déjà, le cast est inutile sur malloc() (je vais me la mettre en signature, cette phrase :o ).
 
Ensuite, ton test de tab[i]==NULL tu devrais le mettre à l'intérieur de la boucle for.
 
Sinon je ne vois pas d'erreur particulière, MAX vaut quoi ?
Tu as essayé de regarder la valeur de errno pour savoir pourquoi malloc() avait échoué ?

Reply

Marsh Posté le 09-10-2005 à 16:46:40    

Elmoricq a écrit :

Déjà, le cast est inutile sur malloc() (je vais me la mettre en signature, cette phrase :o ).
 
Ensuite, ton test de tab[i]==NULL tu devrais le mettre à l'intérieur de la boucle for.

Sinon je ne vois pas d'erreur particulière
, MAX vaut quoi ?
Tu as essayé de regarder la valeur de errno pour savoir pourquoi malloc() avait échoué ?


 
 
elle est la, l'erreur, tab[i] tape un cran trop loin

Reply

Marsh Posté le 09-10-2005 à 16:49:00    

chrisbk a écrit :

elle est la, l'erreur, tab[i] tape un cran trop loin


 
 [:petrus75] j'avais pas fait gaffe, j'avais juste tilté "c'est pas le comportement qu'on veut"  [:petrus75]  
 
 
De fait, comportement indéfini, ça fonctionne aléatoirement. D'où l'erreur.

Reply

Marsh Posté le 09-10-2005 à 16:50:00    

MAX vaut 40, sinon j'ai mis le test de tab[i] dans la boucle et maintenant il ne m'affiche plus d'erreur... je vais isoler les fonctions du reste du programme pour voir.
 
EDIT : quel gland je suis  :pfff:  j'avais même pas vu i vaut taille donc il est en dehors du tableau
 
merci  ;)


Message édité par D-Jey le 09-10-2005 à 16:51:49
Reply

Marsh Posté le 09-10-2005 à 16:50:43    

non mais c'est bon, c'etait ca l'erreur

Reply

Marsh Posté le 09-10-2005 à 17:26:15    

D-Jey a écrit :

Salut  :hello:  
 
J'ai commencé un genre de ptit pacman pour apprendre à bien maitriser les tableaux 2D mais voila lors de l'allocation de mon tableau j'ai une erreur de segmentation (je suis sous linux) alors que le même code fonctionne très bien sous win  :heink:  
 
vla l'code  de mon allocation :
<...>


En dehors des erreurs signalées, un peu rustique. Je te conseille ça :  


/* -ed- manquait... */
#include <stdlib.h>
 
/* -ed- ajoute verification du code */
#include <assert.h>
 
liberer_tab(int** tab, int taille)
{
    size_t i;
     
    for(i=0;i<taille;i++)
    {
        free(tab[i]), tab[i] = NULL;
        assert(tab[i]==NULL);
    }
    free (tab),tab=NULL;
    assert(tab==NULL);
}
 
int** allouer_tab(size_t taille)
{
 
    int**tab = malloc (taille*sizeof*tab);
     
    if(tab != NULL)
    {
        size_t i;
         
        for(i=0;i<taille;i++)
        {
            tab[i] = NULL;
        }
         
        for(i=0;i<taille;i++)
        {
            tab[i] = malloc (taille*sizeof*tab[i]);
             
            if(tab[i] == NULL)
            {
                printf("erreur2\n" );
                liberer_tab(tab, taille);
                tab=NULL;
                break;
            }
        }
    }
    else
    {
        /* -ed- 'printw()' inconnu... */
        printf("erreur1\n" );
    }
    return tab;
}
 
 
int main (void)
{
    size_t MAX = 10;
    int** tab = allouer_tab(MAX);
 
    if (tab!=NULL)
    {
        liberer_tab(tab, MAX),tab=NULL;
    }
    assert (tab == NULL);
 
    return 0;
}


Pose des questions si tu ne comprends pas.


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-10-2005 à 17:29:15    

quitte a tout remettre a NULL a la main, autant faire un calloc non ?

Reply

Marsh Posté le 09-10-2005 à 17:37:25    

chrisbk a écrit :

quitte a tout remettre a NULL a la main, autant faire un calloc non ?


On en a déjà parlé ici (je crois). calloc() appelle memset() et met donc tous les bits à 0. Ce n'est pas forcément la représentation correcte de NULL pour toutes les plateformes


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-10-2005 à 17:39:21    

mouais [:dawao]

Reply

Marsh Posté le 09-10-2005 à 17:39:21   

Reply

Marsh Posté le 09-10-2005 à 23:27:49    

Je continue mes questions ici, voir premier post ;)

Reply

Marsh Posté le 10-10-2005 à 18:04:45    

:bounce:

Reply

Marsh Posté le 10-10-2005 à 20:18:09    

D-Jey a écrit :

Je continue mes questions ici, voir premier post ;)


 
Euh... personnellement, j'ai la flemme de suivre ce qui s'est passé, tu devrais mettre à la suite.
C'est un peu fouilli là :o


Message édité par Elmoricq le 10-10-2005 à 20:19:23
Reply

Marsh Posté le 10-10-2005 à 21:56:04    

Je continue mes questions sur le même topic.
 
Bon pour mon petit pacman j'ai biensur été confronté au problème du kbhit()  :pfff:  et j'ai donc utilisé la méthode de Taz qui fonctionne très bien  :jap:.
 
Le problème c'est qu'avec la boucle while le programme bouffe méchament les ressources CPU, donc je me suis dis : tu va mettre un ptit sleep()! enfin la j'utilise un napms(), c'est mieux mais pas encore ca... puis en fonction du temps que je met ca ralentit l'affichage (logique).
 
Avez vous une idée/astuce pour améliorer le schmilblick ?
 
voila ma boucle while qui chope les entrées clavier :

Code :
  1. while(key!='p')
  2.   {
  3.     key = getcarac();
  4.     switch(key)
  5.       {
  6.         case 'z' :
  7.           move_UP(tab, MAX, &x_P, &y_P);
  8.           afficher_tab(tab, MAX);
  9.           break;         
  10.         case 's' :
  11.           move_DOWN(tab, MAX, &x_P, &y_P);
  12.           afficher_tab(tab, MAX);     
  13.           break;   
  14.         case 'd' :
  15.           move_RIGHT(tab, MAX, &x_P, &y_P);
  16.           afficher_tab(tab, MAX);     
  17.           break;   
  18.         case 'q' :
  19.           move_LEFT(tab, MAX, &x_P, &y_P);
  20.           afficher_tab(tab, MAX);     
  21.           break;
  22.         default :
  23.           break;           
  24.       }
  25.   napms(5);     
  26.   }


Je précise : linux/gcc/pacman sous shell
 
 :bounce:

Reply

Marsh Posté le 11-10-2005 à 09:16:07    

euh salut
 
Il est vrai que le topic est pas très clair, j'avais compris que cette question avait été résolu.
Pour les grosses boucle qui tourne bcp et souvent dans le vent :) tu as une fonction qui te permet de faire un "stand by" pour ton CPU.
 
Je l'ai utilisé sous Unix sa devrai marcher ==> man pause
                                              edit : ==> man pause(2)
bon courage ++ sLiZeR
(redemande si tu trouve pas)


Message édité par sLiZeR le 11-10-2005 à 09:18:49
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed