Accueil Ti-Gen Foire Aux Questions Chat sur le chan #tigcc sur IRC
Liste des membres Rechercher Aide
Bienvenue Invité !   Se connecter             Mes sujets   
Administrer
0 membre(s) et 1 visiteur(s) actif(s) durant les 5 dernières minutes Utilisateurs actifs : Aucun membre + 1 visiteur
Avant de poster sur le forum, il y a des régles de bases à respecter pour une bonne entente et un respect de tous.
Veuillez lire la charte du forum.
  :: Index » Forum Ti68K » Programmation C » Illegale instrucution (19 réponse(s))
./POST DE DEPART (post n°0)   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 10:47 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


pourquoi ais je un illegale instruction a la fin de l'exectution de ce code????
#include <tigcclib.h>

BITMAP *dimimage(char *nom) 
{   
short size=((MULTI_EXPR*)HeapDeref(SymFindPtr(SYMSTR (nom),0)->handle))->Size; 
void *buffer=malloc(size); 
FILE *f=fopen(nom,"rb"); 
fread(buffer,1,size,f);
fclose(f);
BITMAP *image = (BITMAP *)buffer; 
free(buffer);
return image;
}

void _main(void)
{
  SCR_RECT screen = {{0, 0, 160, 100}};
  BITMAP *bat;
  clrscr();
  short a=0,x=0,y=0,key=0;
  char lst_bat[9][12];
  strcpy(lst_bat[0],"portavio");strcpy(lst_bat[1],"deux");strcpy(lst_bat[2],"curasse");strcpy(lst_bat[3],"trois");strcpy(lst_bat[4],"curasse");strcpy(lst_bat[5],"deux");strcpy(lst_bat[6],"portvert");strcpy(lst_bat[7],"deuxvert");strcpy(lst_bat[8],"curevert");strcpy(lst_bat[9],"troivert");strcpy(lst_bat[10],"curevert");strcpy(lst_bat[11],"deuxvert");
  for (a=0 ; a<10 ; a++)
  {
    DrawLine(8*a+1, 21, 8*a+1, 93, A_NORMAL);
    DrawLine(1 ,21+8*a ,72 ,21+8*a ,A_NORMAL);
    DrawLine(8*a+85 ,21 ,8*a+85 ,93 ,A_NORMAL);
    DrawLine(85 ,21+8*a ,156 ,21+8*a,A_NORMAL);
  }
  bat=dimimage(lst_bat[0]);
  while(key!=13)
  {
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  key=ngetchx();
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  if (key==344) x+=1;
  else if (key==338) x-=1;
  else if (key==340) y=1+y;
  else if (key==337) y=y-1;
  }
return;
}


EDIT : désactivature des smileys
-Edité le Vendredi 25 juin 2004 à 11:52 par serioussam-
Le langage C y'a pas mieux!!!
    
./Post n°1   Marquer comme non lu.
Lionel Debroux Ecrit le: Vendredi 25 juin 2004 à 12:16 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

BITMAP *image = (BITMAP *)buffer;
free(buffer);
return image;

Tu utilises des blocs de mémoire après les avoir libérés ??!
Sinon, ça manque de vérifications au milieu (size, etc.)...

Pour le style: utilise les pseudo constantes de compat.h !
Lionel Debroux - membre de TICT.
    
./Post n°2   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 12:28 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


ben non ils sont creer a cahque foit que la fonction est lancée!!!!!!! donc je n'utilise pas d bloc de memeoire liberé!!!!!!!
Le langage C y'a pas mieux!!!
    
./Post n°3   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 17:41 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


svp aidez moi merci
Le langage C y'a pas mieux!!!
    
./Post n°4   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 juin 2004 à 17:49 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


cerede2000 :
ben non ils sont creer a cahque foit que la fonction est lancée!!!!!!! donc je n'utilise pas d bloc de memeoire liberé!!!!!!!

Si:
BITMAP *image = (BITMAP *)buffer; 
free(buffer);
return image;

Cela retourne un pointeur vers un buffer déjà libéré!!!!!!
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°5   Marquer comme non lu.
Lionel Debroux Ecrit le: Vendredi 25 juin 2004 à 18:06 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

Bah oui... Il est fou ("insane") d'utiliser de la mémoire après l'avoir libérée. Corrige ça, et après, si ça ne marche toujours pas, on regardera plus loin.
Lionel Debroux - membre de TICT.
    
./Post n°6   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 19:46 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


ben attendez je comprend pas la!!!
BITMAP *image = (BITMAP *)buffer; 
free(buffer);
return image;

ca effectivement le ptr buffer est libere mais il n'est plus utilise c'est le BITMAP image qui est renvoiye!! car en plus si je met ca
BITMAP *image = (BITMAP *)buffer; 
return image;
free(buffer);

il sera pas libere alors comme faire sinon!!
Le langage C y'a pas mieux!!!
    
./Post n°7   Marquer comme non lu.
Lionel Debroux Ecrit le: Vendredi 25 juin 2004 à 20:00 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

Ce qui est renvoyé, c'est un pointeur vers une BITMAP, pas une BITMAP. Ce pointeur pointe vers un endroit de mémoire qui n'existe plus (puisqu'il a été libéré)...

Ici, à quoi sert la fonction dimimage ?
Lionel Debroux - membre de TICT.
    
./Post n°8   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 20:01 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


bon et puis c regler c'est pas ca lol alors que ce que c'est???
#include <tigcclib.h>

BITMAP *dimimage(char *nom) 
{   
short size=((MULTI_EXPR*)HeapDeref(SymFindPtr(SYMSTR (nom),0)->handle))->Size; 
void *buffer=malloc(size); 
FILE *f=fopen(nom,"rb"); 
fread(buffer,1,size,f);
fclose(f);
BITMAP *image = (BITMAP *)buffer; 
return image;
}

void _main(void)
{
  SCR_RECT screen = {{0, 0, 160, 100}};
  BITMAP *bat;
  clrscr();
  short a=0,x=0,y=0,key=0;
  char lst_bat[9][12];
  strcpy(lst_bat[0],"portavio");strcpy(lst_bat[1],"deux");strcpy(lst_bat[2],"curasse");strcpy(lst_bat[3],"trois");strcpy(lst_bat[4],"curasse");strcpy(lst_bat[5],"deux");strcpy(lst_bat[6],"portvert");strcpy(lst_bat[7],"deuxvert");strcpy(lst_bat[8],"curevert");strcpy(lst_bat[9],"troivert");strcpy(lst_bat[10],"curevert");strcpy(lst_bat[11],"deuxvert");
  for (a=0 ; a<10 ; a++)
  {
    DrawLine(8*a+1, 21, 8*a+1, 93, A_NORMAL);
    DrawLine(1 ,21+8*a ,72 ,21+8*a ,A_NORMAL);
    DrawLine(8*a+85 ,21 ,8*a+85 ,93 ,A_NORMAL);
    DrawLine(85 ,21+8*a ,156 ,21+8*a,A_NORMAL);
  }
  bat=dimimage(lst_bat[0]);
  while(key!=13)
  {
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  key=ngetchx();
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  if (key==344) x+=1;
  else if (key==338) x-=1;
  else if (key==340) y=1+y;
  else if (key==337) y=y-1;
  }
return;
}


[EDIT: désactivé les smileys]
-Edité le Vendredi 25 juin 2004 à 20:10 par Lionel Debroux-
Le langage C y'a pas mieux!!!
    
./Post n°9   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 20:01 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


et dimimage sert a obtenir un BITMAP a partir d'un pic
Le langage C y'a pas mieux!!!
    
./Post n°10   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 juin 2004 à 20:05 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


C'est toujours faux, parce que du coup tu ne libères plus du tout ton buffer, et donc ton programme leake de la mémoire.
Il faut un free(bat); dans _main après l'affichage.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°11   Marquer comme non lu.
Lionel Debroux Ecrit le: Vendredi 25 juin 2004 à 20:11 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

> et dimimage sert a obtenir un BITMAP a partir d'un pic
Je me suis mal exprimé. Quel est l'intérêt de cette subroutine ? Est-elle / sera-t-elle appelée par un autre bloc de code ?
Lionel Debroux - membre de TICT.
    
./Post n°12   Marquer comme non lu.
Benjy Ecrit le: Vendredi 25 juin 2004 à 20:16 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


lol c'est bon j'ai trouve d'ou ca vient mais alors pourquoi je voit pas!!! c'est la
char lst_bat[9][12];
strcpy(lst_bat[0],"portavio");
strcpy(lst_bat[1],"deux");
strcpy(lst_bat[2],"curasse");
strcpy(lst_bat[3],"trois");
strcpy(lst_bat[4],"curasse");
strcpy(lst_bat[5],"deux");
strcpy(lst_bat[6],"portvert");
strcpy(lst_bat[7],"deuxvert");
strcpy(lst_bat[8],"curevert");
strcpy(lst_bat[9],"troivert");
strcpy(lst_bat[10],"curevert");
strcpy(lst_bat[11],"deuxvert");

-Edité le Vendredi 25 juin 2004 à 20:42 par cerede2000-
Le langage C y'a pas mieux!!!
    
./Post n°13   Marquer comme non lu.
geogeo Ecrit le: Vendredi 25 juin 2004 à 20:51 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  




#include <tigcclib.h>

BITMAP *dimimage(char *nom) 
{   
  unsigned short size=HeapDeref(SymFindPtr(SYMSTR (nom),0)->handle)->Size; 
  void *buffer=malloc(size); 
  FILE *f=fopen(nom,"rb"); 
  fread(buffer,1,size,f);
  fclose(f);
  BITMAP *image = (BITMAP *)buffer; 
  free(buffer);
  return image;
}

void _main(void)
{
  SCR_RECT screen = {{0, 0, 160, 100}};
  BITMAP *bat;
  clrscr();
  short a=0,x=0,y=0,key=0;
  char *lst_bat[12]={"portavio", "deux", "curasse", "trois", "curasse", "deux", "portvert", "deuxvert", "curvert", "troivert", "curevert", "deuxvert"};
  
  for (a=0 ; a<10 ; a++)
  {
    DrawLine(8*a+1, 21, 8*a+1, 93, A_NORMAL);
    DrawLine(1 ,21+8*a ,72 ,21+8*a ,A_NORMAL);
    DrawLine(8*a+85 ,21 ,8*a+85 ,93 ,A_NORMAL);
    DrawLine(85 ,21+8*a ,156 ,21+8*a,A_NORMAL);
  }
  
  bat=dimimage(lst_bat[0]);
  while(key!=13)
  {
     BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
     key=ngetchx();
     BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
     if (key==344) x+=1;
     else if (key==338) x-=1;
     else if (key==340) y=1+y;
     else if (key==337) y=y-1;
   }
}


Déjà essaye ça.

[EDIT par Kevin Kofler: Désactivé les smileys.]
-Edité le Vendredi 25 juin 2004 à 23:13 par Kevin Kofler-
-Edité le Samedi 26 juin 2004 à 00:30 par geogeo-
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°14   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 juin 2004 à 23:13 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Non, geogeo, ton code est tout aussi incorrect que son premier code.
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°15   Marquer comme non lu.
Kevin Kofler Ecrit le: Vendredi 25 juin 2004 à 23:16 Déconnecté(e)    Voir le profil de Kevin Kofler Envoyer un email à Kevin Kofler Visiter le site WEB de Kevin Kofler Envoyer un message privé à Kevin Kofler  


Et la solution la plus simple est de te passer complètement du buffer, comme ça rien à allouer/désallouer!

#include <tigcclib.h>

BITMAP *dimimage(char *nom) 
{   
SYM_ENTRY *symentry=SymFindPtr(nom,0);
if (!symentry) return NULL;
HANDLE h=symentry->handle;
if (!h) return NULL;
return (BITMAP*)(HeapDeref(h)+2);
}

void _main(void)
{
  SCR_RECT screen = {{0, 0, 160, 100}};
  BITMAP *bat;
  clrscr();
  short a=0,x=0,y=0,key=0;
  char lst_bat[9][12];
  strcpy(lst_bat[0],"portavio");strcpy(lst_bat[1],"deux");strcpy(lst_bat[2],"curasse");strcpy(lst_bat[3],"trois");strcpy(lst_bat[4],"curasse");strcpy(lst_bat[5],"deux");strcpy(lst_bat[6],"portvert");strcpy(lst_bat[7],"deuxvert");strcpy(lst_bat[8],"curevert");strcpy(lst_bat[9],"troivert");strcpy(lst_bat[10],"curevert");strcpy(lst_bat[11],"deuxvert");
  for (a=0 ; a<10 ; a++)
  {
    DrawLine(8*a+1, 21, 8*a+1, 93, A_NORMAL);
    DrawLine(1 ,21+8*a ,72 ,21+8*a ,A_NORMAL);
    DrawLine(8*a+85 ,21 ,8*a+85 ,93 ,A_NORMAL);
    DrawLine(85 ,21+8*a ,156 ,21+8*a,A_NORMAL);
  }
  bat=dimimage(lst_bat[0]);
  while(key!=13)
  {
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  key=ngetchx();
  BitmapPut (8*x+1,8*y+21, bat, &screen, A_XOR); 
  if (key==344) x+=1;
  else if (key==338) x-=1;
  else if (key==340) y=1+y;
  else if (key==337) y=y-1;
  }
return;
}


Franchement, tu devrais m'écouter quand je te dis que vat.h est plus simple même si ça n'en a pas l'air au départ!
Membre de l'équipe de TIGCC: http://tigcc.ticalc.org
Mainteneur du portage Linux/Unix de TIGCC: http://tigcc.ticalc.org/linux/
Membre de l'équipe de CalcForge: http://www.calcforge.org:70/

Participez à la reprise de Ti-Gen!
    
./Post n°16   Marquer comme non lu.
geogeo Ecrit le: Samedi 26 juin 2004 à 00:33 Déconnecté(e)    Voir le profil de geogeo Envoyer un email à geogeo Visiter le site WEB de geogeo Envoyer un message privé à geogeo  


En effet je me doutais bien que le code dans dimimage n'était pas correct aussi.
Mais je pense qu'il est plus judicieux d'utiliser une table avec les chaînes de caractère que de réaliser des opérations avec strcpy...? C'est ça qui est aussi incorrect, je voudrais comprendre aussi. :)
Webmaster du site.
Programmeur sur TI68K. Arkanoid, Nebulus, GFA-Basic.

Plus d'informations sur GFA-Basic (un langage Basic pour TI68K).
http://www.tigen.org/gfabasic
    
./Post n°17   Marquer comme non lu.
Benjy Ecrit le: Samedi 26 juin 2004 à 08:38 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


lol super ca marche pas avec le code de kevin!!!!
alors que celui de geogeo marche tres bien plus d'erreur depuis l'utilisation de la table!!
Le langage C y'a pas mieux!!!
    
./Post n°18   Marquer comme non lu.
Benjy Ecrit le: Samedi 26 juin 2004 à 08:44 Déconnecté(e)    Voir le profil de Benjy Envoyer un email à Benjy Visiter le site WEB de Benjy Envoyer un message privé à Benjy  


il marche mais y'avai une erreur lol
BITMAP *dimimage(char *nom) 
{   
SYM_ENTRY *symentry=SymFindPtr(SYMSTR(nom),0);
if (!symentry) return NULL;
HANDLE h=symentry->handle;
if (!h) return NULL;
return (BITMAP*)(HeapDeref(h)+2);
}
Le langage C y'a pas mieux!!!
    
./Post n°19   Marquer comme non lu.
Lionel Debroux Ecrit le: Samedi 26 juin 2004 à 10:42 Déconnecté(e)    Voir le profil de Lionel Debroux Envoyer un email à Lionel Debroux Visiter le site WEB de Lionel Debroux Envoyer un message privé à Lionel Debroux  

La solution la plus optimisée pour les arrays de strings est un truc fait à la main en assembleur (il y en a dans tthdex, ebook, tictexpl, S1P6...).
C'est plus difficile à utiliser, mais c'est plus petit par construction, et de plus il n'y a plus besoin de relocations. En fait, c'est une optimisation taille assez importante.
Lionel Debroux - membre de TICT.
    
  :: Index » Forum Ti68K » Programmation C » Illegale instrucution (19 réponse(s))
Pages : 1/1     « [1] » »|

.Répondre à ce sujet
Les boutons de code
[B]old[I]talic[U]nderline[S]trikethrough[L]ine Flip Hori[Z]ontallyFlip [V]erticallySha[D]ow[G]low[S]poilerCode [G][C]ite
Bullet [L]istList Item [K] Link [H][E]mail[P]icture SmileysHelp
Couleurs :
Saisissez votre message
Activer les smileys
     

Forum de Ti-Gen v3.0 Copyright ©2004 by Geoffrey ANNEHEIM
Webmaster: Kevin KOFLER, Content Admins: list, Server Admins: Tyler CASSIDY and Kevin KOFLER, DNS Admin: squalyl
Page générée en 64.3ms avec 18 requetes