Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2546 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Pacman / kbhit() / linux

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Pacman / kbhit() / linux

n°1218862
D-Jey
Dinw !
Posté le 09-10-2005 à 16:38:25  profilanswer
 

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
mood
Publicité
Posté le 09-10-2005 à 16:38:25  profilanswer
 

n°1218866
Elmoricq
Modérateur
Posté le 09-10-2005 à 16:44:38  profilanswer
 

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é ?

n°1218869
chrisbk
-
Posté le 09-10-2005 à 16:46:40  profilanswer
 

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

n°1218871
Elmoricq
Modérateur
Posté le 09-10-2005 à 16:49:00  profilanswer
 

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.

n°1218872
D-Jey
Dinw !
Posté le 09-10-2005 à 16:50:00  profilanswer
 

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
n°1218873
chrisbk
-
Posté le 09-10-2005 à 16:50:43  profilanswer
 

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

n°1218903
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-10-2005 à 17:26:15  profilanswer
 

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/
n°1218906
chrisbk
-
Posté le 09-10-2005 à 17:29:15  profilanswer
 

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

n°1218914
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-10-2005 à 17:37:25  profilanswer
 

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/
n°1218916
chrisbk
-
Posté le 09-10-2005 à 17:39:21  profilanswer
 

mouais [:dawao]

mood
Publicité
Posté le 09-10-2005 à 17:39:21  profilanswer
 

n°1219127
D-Jey
Dinw !
Posté le 09-10-2005 à 23:27:49  profilanswer
 

Je continue mes questions ici, voir premier post ;)

n°1219801
D-Jey
Dinw !
Posté le 10-10-2005 à 18:04:45  profilanswer
 

:bounce:

n°1219896
Elmoricq
Modérateur
Posté le 10-10-2005 à 20:18:09  profilanswer
 

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
n°1220004
D-Jey
Dinw !
Posté le 10-10-2005 à 21:56:04  profilanswer
 

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:

n°1220141
sLiZeR
Posté le 11-10-2005 à 09:16:07  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Pacman / kbhit() / linux

 

Sujets relatifs
Java sous linuxPb Java/linux
[C][linux] msgget : problème d'allocationconnection internet sous linux
Convertir un prog Linux en prog Windows[RESOLU] probleme compil opengl / glut sous linux
Un script VBS sous linux?"explorer" une bibliothèque sous linux
problème hibernate - linux - encodingException Windows mais pas Linux...
Plus de sujets relatifs à : Pacman / kbhit() / linux


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR