Et ma solution ne te plaît pas ? Tu as regardé un peu le code.
Version imprimable
Et ma solution ne te plaît pas ? Tu as regardé un peu le code.
je suis en train de l'étudier.
Mais je l'écris comment (je débute en C ;) )
Ecrire quoi ?
Tu as la définition d'un Point, une allocation , une initialisation et une fonction d'affichage.
oui, mais j'ai des erreurs de compilation :
'point' undeclared
syntac error before 'point'
Essaie :
Point.h
Code:
1
2
3
4
5
6
7
8
9
10 #ifndef H_POINT_AL #define H_POINT_AL typedef struct { int x,y,v; }Point; void affiche (Point *pPoints, unsigned int pnbPoint); #endif
main.c
Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38 #include <stdlib.h> #include <stdio.h> #include "Point.h" int main (int argc,char**argv) { Point points [2] ; points[0].x=5;points[0].y=5;points[0].v=5; points[1].x=15;points[1].y=50;points[1].v=5; affiche(points,2); return EXIT_SUCCESS; } void affiche (Point *pPoints, unsigned int pnbPoint) { int i; while (42){ for(i=0;i<pnbPoint;i++) { //affichage du point printf("\033[%ld;%ldH*",pPoints[i].x,pPoints[i].y); //déplacement du point pPoints[i].x+=pPoints[i].v; pPoints[i].y+=pPoints[i].v; //controle depassemet ecran if(pPoints[i].x<1||pPoints[i].x>100) { pPoints[i].x-=pPoints[i].v; } if(pPoints[i].y<1||pPoints[i].y>30) { pPoints[i].y-=pPoints[i].v; } } printf("\033[H\033[2J"); } }
Par contre pour l'affichage ca donne des trucs bizarre chez moi...Pas portable les commandes printf ?
Un bonne solution à ce problème serait un mélange entre du code de hegros (abstraction d'un Point) avec celui de souviron34 (abstraction de Deplace_Point, Affiche_Point, Ajuste_Delta, etc).
Sinon, le code de hegros compile, avec quelques avertissements.
En ce qui concerne la portabilité du code, celui-ci ne fonctionne que si la console supporte les séquences d'échappement ANSI.
Thierry
Absolument milles excusesCitation:
Envoyé par mujigka
Pour ce qui est du code, cela fait tellement longtemps que je n'ai pas regardé les séquences d'échappement que je ne sais absolument pas ce que fait :
Mais si tu voulais faire un truc portable, il y a 2 choses :Code:
1
2
3
4 printf("\033[%d;%dH*",y,x); printf("\033[H\033[2J");
1) remplacer les séquences d'affichage par un affichage d'une chaine (en mettant des blancs)
2) je ne comprends pas trop le but :
as-tu un affichage console que tu veux en 200*60 fixe (un rectangle fixe dans lequel tes points se déplacent) ?
ou bien (ce que faisait ton code de départ il me semble) un déplacement ligne à ligne et point à point sans "limites" graphiques ?
Pour faire ce genre de programmes de manière un peu plus portable, j'utilise la bibliothèque pdcurses http://pdcurses.sourceforge.net/ qui permet d'écrire des programmes en mode console sous *nix (compilent également avec curses.h), win32, dos, etc.
Cela me semble en tout cas plus portable et plus facile à manipuler que les séquences d'échappement ANSI. Pour rappel:
ThierryCode:
1
2
3
4 \033[%d;%dH /* déplace le curseur à la position spécifiée*/ \033[H /* replacé le curseur à l'origine */ \033[2J /* efface l'écran */
Tu as quelles options de compilation ?Citation:
Envoyé par mujigka
j'ai des warning sur les 2 printf.
Point.h reste inchangé.Code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36 #include <stdlib.h> #include <stdio.h> #include "Point.h" int main (int argc,char**argv) { Point points [2] ; points[0].x=5;points[0].y=5;points[0].v=5; points[1].x=15;points[1].y=50;points[1].v=5; affiche(points,sizeof points/sizeof points[0]); return EXIT_SUCCESS; } void affiche (Point *pPoints,unsigned int pnbPoint) { int i; while (42){ for(i=0;i<pnbPoint;i++) { //affichage du point printf("\033[%ld;%ldH*",pPoints[i].x,pPoints[i].y); //déplacement du point pPoints[i].x+=pPoints[i].v; pPoints[i].y+=pPoints[i].v; //controle depassemet ecran if(pPoints[i].x<1||pPoints[i].x>100) { pPoints[i].x-=pPoints[i].v; } if(pPoints[i].y<1||pPoints[i].y>30) { pPoints[i].y-=pPoints[i].v; } } printf("\033[H\033[2J"); } }
Citation:
Envoyé par hegros
Pour les avertissements qui concernent les printf(), le spécificateur de format %ld est utilisé avec des valeurs de type int (remplacer avec %d).Code:gcc -Wall -Wextra -W -ansi -pedantic -o test main.c
Sinon, comparaison entre un entier signé et un entier non signé:
Et bien entendu, les paramètres argc et argv ne sont pas utilisés. Pas grave.Code:for(i=0;i<pnbPoint;i++) {
A part ça, pourquoi while(42)? Puis, sans la temporisation avec usleep(), on ne voit rien du tout.
Thierry
OK c'est corrigé.J'ai changé le prototype de la fonction affiche en remplacant le second paramétre par un int à la place d'un unsigned int.
while(42) c'est équivalent à while(1) ca m'amuse de l'écrire comme cela rien de particulier.
usleep n'existe pas sous windows.Il faudrait dans l'absolu ajouter des instructions pour pré-processeur.
Pour disposer d'une fonction de temporisation (millisecondes), sous windows et Posix:
ThierryCode:
1
2
3
4
5
6
7
8
9 #ifdef WIN32 #include <windows.h> #define ms_sleep(s) Sleep(s) #else #include <unistd.h> #define ms_sleep(s) usleep((s)*1000) #endif
euh ça te donne pas à la seconde ça ??
Sleep() sous win32 n'est pas en millisecondes? Je vérifie...
EDIT: verifié! sleep(), déclarée dans unistd.h te donne la seconde, mais la fonction Sleep(), faisant partie de l'API Win32, reçoit des millisecondes. Et millisecondes * 1000 = microsecondes passées à usleep(). Non?
Thierry
si c'est bien cela.
1 milliseconde = 1000 microsecondes
oops oui j'avais compris en sens inverse :oops: