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

  FORUM HardWare.fr
  Programmation
  C

  erreur dans un programme graphique

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

erreur dans un programme graphique

n°1471334
transister​ix
mais non
Posté le 06-11-2006 à 19:10:41  profilanswer
 

salut
 
voila mon code (mon premier vrais programme graphique depuis que j'ai découvert TurboC ilya quelques jours), c'ets un effet plasma sous VGA, comme en qbasic
Code : C
Code:
 

Code :
  1. #include <stdlib.h>
  2. #include <stdio.h>
  3. #include <dos.h>
  4. #include <io.h>
  5. static char Palette[4*3] = {0,0,0,0,0,63,0,63,0,63,0,0};
  6. union REGS regset;
  7. struct SREGS sregs;
  8. void load13h()
  9. {
  10. regset.x.ax = 0x0013;
  11. int86(0x10, &regset, &regset);
  12. }
  13. void exit13h()
  14. {
  15. getch();
  16. regset.x.ax = 0x0003;
  17. int86(0x10, &regset, &regset);
  18. }
  19. void drawpx(int x, int y, int coul)
  20. {
  21. int ptr = (320*y+x);
  22. pokeb(0xA000,ptr,coul);
  23. }
  24. int getpx(int x, int y)
  25. {
  26. int ptr = (320*y+x);
  27. return peekb(0xA000,ptr);
  28. }
  29. void pal( unsigned char i, unsigned char r, unsigned char v, unsigned char b)
  30. {
  31. outp(0x3c8, i);
  32. outp(0x3c9, r);
  33. outp(0x3c9, v);
  34. outp(0x3c9, b);
  35. }
  36. int main()
  37. {
  38. int color;
  39. int CA,CB,CC,CD,CE,CF,CG,CH,CI;
  40. long ptr;
  41. load13h();
  42. for(ptr=0; ptr<=64000;ptr++)
  43. {
  44.  color=rand()%255;
  45.  pokeb(0xA000,ptr,color);
  46. }
  47. for(ptr=321; ptr<=63677;ptr++)
  48. {
  49.  CA=peekb(0xA000,ptr+321);
  50.  CB=peekb(0xA000,ptr+320);
  51.  CC=peekb(0xA000,ptr-321);
  52.  CD=peekb(0xA000,ptr-320);
  53.  CE=peekb(0xA000,ptr+319);
  54.  CF=peekb(0xA000,ptr-319);
  55.  CG=peekb(0xA000,ptr+1);
  56.  CH=peekb(0xA000,ptr-1);
  57.  CI=peekb(0xA000,ptr);
  58.  color = (CA+CB+CC+CD+CE+CF+CG+CH+CI)/9;
  59.  pokeb(0xA000,ptr,color);
  60. }
  61. exit13h();
  62. }


 
mais voila, il me plante windows avec une opération non conforme.
 
voyez vous une erreur ?
 
 
[EDIT] voila, ce programme fonctionne maintenant, la source a étée modifiée.[/edit]
merci, ++ Tix.
__________________


Message édité par transisterix le 09-11-2006 à 08:43:53
mood
Publicité
Posté le 06-11-2006 à 19:10:41  profilanswer
 

n°1471378
matafan
Posté le 06-11-2006 à 22:15:25  profilanswer
 

On est en 2006 cammarade ;)

n°1471387
transister​ix
mais non
Posté le 06-11-2006 à 22:33:23  profilanswer
 

certe, et en 2006, mon 386 tourne toujours, et 386 != windows != sdl/glu ... donc VGA inside seulement ;)
 
si vous avez des idées quant a mon probleme , je serai ravis, je le serai aussi en cosant air du temps mais bon ,ca aidera pas mon darxhigher d'amuuuuuur ^3^
 
enfin voila, ++ Tix.

n°1471392
IrmatDen
Posté le 06-11-2006 à 22:49:26  profilanswer
 

Le mode 13h fonctionne en 8 bit non? Dans drawpx, la couleur est un int, du coup ça ne se comporte pas comme il faut, et à la fin de la mémoire vidéo, crash, il écrit ailleurs.
Enfin, je crois :)
 
Edit: je viens de relire, et en fait tu l'appelles nul part :/
Ceci dit c'est peut-être lié; plutôt que peek et poke, tu devrais utiliser peekb et pokeb. Ou alors, modifier ton code de façon à écrire 2 pixels à la fois (mais je sais pas si c'est trop possible avec cet effet).


Message édité par IrmatDen le 06-11-2006 à 23:32:33

---------------
.
n°1471420
bjone
Insert booze to continue
Posté le 07-11-2006 à 03:49:10  profilanswer
 

tout est sous quoi comme Windows ?
pourquoi ne pas rester sous DOS ? (c'est bien un binaire DOS que tu fais au moins ? :D)
 
j'ai jamais aimé les peek/poke (ça sert à rien avec un langage comme le C, c'était bon pour le basic ça)
 
par contre si tu veux aller vite, il vaux mieux actualiser le plasma dans un buffer en mémoire système et copier ce buffer vers la ram vidéo ensuite. (rester en cache tout ça, adressage non continu rendement PCI/AGP merdique tout ça)

n°1471771
transister​ix
mais non
Posté le 07-11-2006 à 18:43:11  profilanswer
 

oui, c'est pour un PC sous dos, un 386 exactement :) j'essay peekb t pokeb, mais quelle est la différence avec peek et poke ?
 
merci, ++ Tix. ;)

n°1471796
IrmatDen
Posté le 07-11-2006 à 19:43:53  profilanswer
 

Le b à la fin laisse à penser qu'il agit en byte ;)
 
Par contre, si tu veux travailler ton effet suis les conseils de bjone (et d'harko s'il passe par là) ;)

n°1471801
transister​ix
mais non
Posté le 07-11-2006 à 20:05:27  profilanswer
 

haha, j'azi pensé a l'histoire du buffer, mais je m'y suis pas encor attelé, je prévois une fonction qui affiche le contenu de 5 buffers avec leurs mask 1/0 , si quelq'un a une idée pour la transparence partielle ...
 
je teste, ++ Tix.

n°1471941
bjone
Insert booze to continue
Posté le 07-11-2006 à 23:04:12  profilanswer
 

transisterix a écrit :

oui, c'est pour un PC sous dos, un 386 exactement :) j'essay peekb t pokeb, mais quelle est la différence avec peek et poke ?
 
merci, ++ Tix. ;)


 
on est en C, en C y'a pas besoin de peek et poke pour écrire un octet laisse ça au basic.

n°1471943
bjone
Insert booze to continue
Posté le 07-11-2006 à 23:05:18  profilanswer
 

sous quel Windows est-tu ?

mood
Publicité
Posté le 07-11-2006 à 23:05:18  profilanswer
 

n°1471986
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2006 à 00:07:03  profilanswer
 

bjone a écrit :

sous quel Windows est-tu ?


Citation :

oui, c'est pour un PC sous dos, un 386 exactement



---------------
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°1471987
bjone
Insert booze to continue
Posté le 08-11-2006 à 00:14:01  profilanswer
 

Citation :


mais voila, il me plante windows avec une opération non conforme


 
 [:spamafote]

Message cité 1 fois
Message édité par bjone le 08-11-2006 à 00:14:10
n°1471990
Emmanuel D​elahaye
C is a sharp tool
Posté le 08-11-2006 à 00:34:14  profilanswer
 

bjone a écrit :

Citation :


mais voila, il me plante windows avec une opération non conforme


 
 [:spamafote]


C'est vrai que ce n'est pas clair. Je suppose qu'il essaye de développer son bazar sur un PC Windows récent, genre XP et évidemment, ça banane dur...
 
L'objectif étant de le faire tourner sur son 386/DOS, probablement pour un musée de l'informatique...


---------------
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°1471992
red factio​n
Posté le 08-11-2006 à 00:43:27  profilanswer
 

bjone a écrit :

tout est sous quoi comme Windows ?
pourquoi ne pas rester sous DOS ? (c'est bien un binaire DOS que tu fais au moins ? :D)
 
j'ai jamais aimé les peek/poke (ça sert à rien avec un langage comme le C, c'était bon pour le basic ça)
 
par contre si tu veux aller vite, il vaux mieux actualiser le plasma dans un buffer en mémoire système et copier ce buffer vers la ram vidéo ensuite. (rester en cache tout ça, adressage non continu rendement PCI/AGP merdique tout ça)


 
vu le code qu'il nous balance et l'age de sa becanne je dirais Windows 95/98 ....  
je le vois mal compiler sous win puis rebooter sous dos a chaque fois, et ce genre de fantaisies sous XP => :S

n°1472721
transister​ix
mais non
Posté le 09-11-2006 à 08:42:20  profilanswer
 

rhoo;lala, excusez moi
 
j edévellope sur un PC 233Mhz, windows 98, un programme destiné a un 386. voila pour l'environnement
 
mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.
 
ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)
 
voila, merci a vous, ++ Tix. ;)

n°1472739
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-11-2006 à 09:19:02  profilanswer
 

transisterix a écrit :

mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.


C'est dans la doc de Turbo C (F1):  
 
poke()/peek() : accès en mémoire 16-bit sur x86 mode réel
pokeb()/peekb() : accès en mémoire 8-bit sur x86 mode réel


Message édité par Emmanuel Delahaye le 09-11-2006 à 09:21:28

---------------
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°1472848
IrmatDen
Posté le 09-11-2006 à 12:25:01  profilanswer
 

transisterix a écrit :

ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)


ASM roulaize ;)
Des tutoriaux sur le sujet, il y en a des tas; google sur mode 13h. Comme celui-ci par exemple.
Ceci dit, si tu ne comprends pas encore la différence entre un int et un byte, continue d'apprendre le C, et les pointeurs avant de t'attaquer à ça (ça = prog graphique, surtout en asm)...

n°1473170
bjone
Insert booze to continue
Posté le 09-11-2006 à 18:23:23  profilanswer
 

transisterix a écrit :

rhoo;lala, excusez moi
 
j edévellope sur un PC 233Mhz, windows 98, un programme destiné a un 386. voila pour l'environnement
 
mon programme tourne désormais, il suffisait de remplacer poke et peek par pokeb et peekb ^^ mais j ene comprend pas la différence entre les deux.
 
ensuite, je vois mal comment faire mon truc sans poke et peek, je sui snovice en C :)
 
voila, merci a vous, ++ Tix. ;)


 
unsigned char far *ptr=0xA0000000;
 
/* ptr[y*360+x]=.... */
 
unsigned char far *wptr=ptr;
unsigned char far *rptr=ptr;
 
for( int i=0 ; i < 200 ; ++i )
{
    for( int x=1 ; x < 319 ; ++x )
    {
       unsigned int sum=rptr[x-1];
       sum+=rptr[x+1];
       wptr[x]=sum>>1;  
    }          
 
    rptr+=320;
    wptr+=320;
}
 
par exemple je dirais (si je ne m'abuse).
 

n°1473172
bjone
Insert booze to continue
Posté le 09-11-2006 à 18:26:06  profilanswer
 

et prends pas TurboC, prends OpenWatcom ou DJGPP si tu veux un vrai compilateur DOS.

n°1473189
IrmatDen
Posté le 09-11-2006 à 19:39:59  profilanswer
 

@bjone, je n'ai jamais testé en C; il n'y a pas de différence de perf entre une routine C et une asm pour faire ça?

n°1473191
bjone
Insert booze to continue
Posté le 09-11-2006 à 19:45:21  profilanswer
 

ça dépends du compilo, mais dans l'absolu en asm tu produira la boucle la plus imbriquée la plus efficace. (mais bon il faut bien connaitre les règles d'optimisations vis à vis des cpu cibles, moi je me suis arrêté au Pentium 1).
 
de toutes manières, avant l'asm, l'aspect algo et cache-friendly est de loin le plus important.

n°1473194
bjone
Insert booze to continue
Posté le 09-11-2006 à 19:52:02  profilanswer
 

ha oui et en VGA, les composantes RVB de la palette ne sont pas sur 8 bits.

n°1473248
red factio​n
Posté le 09-11-2006 à 22:17:37  profilanswer
 

bjone a écrit :

et prends pas TurboC, prends OpenWatcom ou DJGPP si tu veux un vrai compilateur DOS.


c bizarre comme borland n'a jamais eu la cote, c la mm chose avec Delphi, pourtant je trouve leurs produit tres bien   :o

n°1473252
transister​ix
mais non
Posté le 09-11-2006 à 22:25:39  profilanswer
 

salut
 
merci pour vos réponses, je vais cependant m'en tenir a ca pour l'instant.
 
cependant, voila un nouveau dileme :)
 
est il possible de stoquer une pseudo image de l'écran pour la restituer ? si oui, comment faire cela ?
 
merci, ++ Tix.

n°1473287
IrmatDen
Posté le 10-11-2006 à 02:58:52  profilanswer
 

Merci bjone :jap:
J'ai jamais testé sur autre chose qu'un P2, et c'était  que des tests destinés à tourner sur ma machine pour apprendre un peu tout ça. Donc j'étais loin de l'optimisation dont tu parles :D
 

transisterix a écrit :

est il possible de stoquer une pseudo image de l'écran pour la restituer ? si oui, comment faire cela ?


C'est un double buffer. Il faut que tu alloues une zone mémoire de la taille de ton écran et que tu "dessines", c-a-d, la modifie, au lieu de la mémoire VGA que tu utilises actuellement. Après, il ne reste plus quà copier le bloc de ton double buffer vers la mémoire VGA, avec memcpy.


Message édité par IrmatDen le 10-11-2006 à 02:59:30

---------------
.
n°1473289
bjone
Insert booze to continue
Posté le 10-11-2006 à 03:23:27  profilanswer
 

red faction a écrit :

c bizarre comme borland n'a jamais eu la cote, c la mm chose avec Delphi, pourtant je trouve leurs produit tres bien   :o


 
TurboC date de 1989 ou un truc du genre et fait que du mode réel :D
 
c'était bien TurboC, moi j'ai commençé a faire le con avec au tout début, mais pour du dev DOS, Watcom & DJGPP restent les maitres incontestés pour l'éternité (vu que y'aura plus jamais de nouveau compilo de quelque chose pour le DOS).
 
sinon perso j'avais adoré C++ Builder.

Message cité 1 fois
Message édité par bjone le 10-11-2006 à 03:24:52
n°1473541
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-11-2006 à 15:36:19  profilanswer
 

bjone a écrit :

TurboC date de 1989 ou un truc du genre et fait que du mode réel :D


C'est exactement de que fait le P.O. avec ses int 13h


---------------
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°1473559
bjone
Insert booze to continue
Posté le 10-11-2006 à 16:01:48  profilanswer
 

pas compris.
 
mais Watcom et DJGPP, d'une part optimisent le code plus que correctement, et permettent du faire du mode protégé avec un dos-extender fourni.

n°1473607
Emmanuel D​elahaye
C is a sharp tool
Posté le 10-11-2006 à 17:01:02  profilanswer
 

bjone a écrit :

pas compris.
 
mais Watcom et DJGPP, d'une part optimisent le code plus que correctement, et permettent du faire du mode protégé avec un dos-extender fourni.


INT 13h, c'est du mode réel 16-bit (AX, et non EAX, pas de GDT etc.). Je ne vois pas ce qu'un compilateur pour DOS en mode protégé va apporter..
 


---------------
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°1473666
bjone
Insert booze to continue
Posté le 10-11-2006 à 17:56:35  profilanswer
 

bin le dos-extender wrappe de manière transparente les interruptions du dos et bios (tant qu'il y a pas d'adresse segment: offset en paramètre/retour), permet un adressage linéaire jusqu'à 64Mo (il te libère de la construction segment: offset, les pointeurs far...), et permet d'utiliser un cpu moderne a pleine efficacité en 32bits.  
 
ndlr puisque que par exemple un pentium 1 ne peux pairer que des instructions 16bits en mode réel, et que des instructions 32bits en mode protégé (dû à l'octet de préfixe), et que sur tous les cpus modernes c'est pareil ou pire (un P2 est encore plus boeuf si tu fais du 32bits en mode réel ou du 16 en pm).
 
même si il compte cibler du 386, c'est toujours ça de pris.


Message édité par bjone le 10-11-2006 à 18:04:24
n°1473720
transister​ix
mais non
Posté le 10-11-2006 à 20:04:08  profilanswer
 

:) ... j'ai pas tout compris  
 
bon bha j evais déja bosser un peu ma technique, pi on verra apres.
 
merci tous, ++ Tix.

mood
Publicité
Posté le   profilanswer
 


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

  erreur dans un programme graphique

 

Sujets relatifs
Un programme java sur une page HtmlTemps d'execution d'un programme
Erreur dll dans Visual BasicAide programme C++
une erreur que j'arrive pas à corrigererreur lors de branchement
Executer un programme java avec Eclipseaide pour un programme en c++
Créer un petit programme pr archivage msnContrôle formulaire côté serveur / retour sur erreur?
Plus de sujets relatifs à : erreur dans un programme graphique


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