Et ma solution ne te plaît pas ? Tu as regardé un peu le code.
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Absolument milles excusesEnvoyé 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 : Sélectionner tout - Visualiser dans une fenêtre à part
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:
Thierry
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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 */
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
Tu as quelles options de compilation ?Envoyé par mujigka
j'ai des warning sur les 2 printf.
Point.h reste inchangé.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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"); } }
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 : Sélectionner tout - Visualiser dans une fenêtre à part 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 : Sélectionner tout - Visualiser dans une fenêtre à part 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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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:
Thierry
Code : Sélectionner tout - Visualiser dans une fenêtre à part
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
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
"The most important thing in the kitchen is the waste paper basket and it needs to be centrally located.", Donald Knuth
"If the only tool you have is a hammer, every problem looks like a nail.", probably Abraham Maslow
FAQ-Python FAQ-C FAQ-C++
+
si c'est bien cela.
1 milliseconde = 1000 microsecondes
oops oui j'avais compris en sens inverse![]()
Partager