1

Voilà je suis sur un problème dont avec beaucoup de tentatives je n'arrive pas à résoudre.

Je possède une fonction et dans celle-ci j'incrémente un compteur mais à la fin de cette fonction le compteur doit toujours possèder la dernière valeur ou il a été incrémenté.

void ma_fonction (void)
{
short compteur;
....
compteur++;
}

A la fin de cette fonction, la variable compteur est effacé et donc 'vide'.
Donc j'ai pensé à faire ceci:

void ma_fonction (void)
{
const short compteur;
...
compteur++;
}

Impossible d'affceter une valeur car il n'ai possible que de lire le contenu de cette variable, donc je doit passer avec un pointeur mais quel genre de pointeur? De plus est-ce que const est bien utilisé ici?

Un dernier problème, j'ai une fonction qui trafique un texte mais ce texte est un paramètre de la fonction, comment réellement modifier un paramètre d'une fonction sans être obligé de renvoyer un argument?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

2

C'est "static" et non "const" dont tu as besoin. Et c'est vraiment du code de porc (© mon prog d'algo).
Passer par un pointeur est déjà plus joli, en effet.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

3

Voici ce que je viens de réaliser:
short SetPosBall (unsigned char angle,BOOL direction,short pos)
{
	static unsigned short _counterpos;
	void *counterpos=&_counterpos;
	
	unsigned short value=(angle/90)*16384;
	
	*(unsigned short*)(counterpos)+=value;
	if (*(unsigned short*)(counterpos)>value)
	{
		counterpos-=16384;
		return pos+direction;
	}
	
	return pos;
}


Mais reste un problème, il faut que j'initialise le contenu de cette variable _counterpos à l'execution de mon programme. Comment je dois faire?
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

4

Pourquoi pas simplement dans _main() ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

5

static unsigned short _counterpos = 42;

gol
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

6

Je sais que ça serait plus simple, mais je cherche à perfectionner mon niveau dans ce genre de fonction, je n'utilise jamais static et encore moins const, en bref j'essaye de trouver une méthode 'propre' pour réaliser ce genre de choses.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

7

Vark :
static unsigned short _counterpos = 42;

gol


Pas vu, corrigé.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

8

Et en quoi est-ce impropre ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

9

Ah je ne parlais pas de déclarer _counterpos dans main.
En fait j'essaye de moins déclarer des variables qui sont utilisé dans des fonctions dans _main ou en globale, je veux que la fonction soit autonome.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

10

geogeo> ba tu lui assigne une valeur à la déclaration, elle sera initialisée avec cette valeur lors de la première execution de la fonction uniquement
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

11

OK, je vais faire ça, donc ajouter un nouveau paramètre du genre boolean. Si True initialiser cette variable ou sinon continuer l'execution du programme. smile
J'y avais pensé, mais y a pas d'autres solutions? Du genre accéder à cette variable dans _main???
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

12

Les variables statiques locales c'est la même chose que les variables globales (mis à part le domaine de définition), donc pourquoi tu la mets pas en global ?
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

13

atta tu veux faire quoi exactement là ?

si tu mets

"static unsigned short _counterpos = 42;"

_counterpos = 42 aura lieu uniquement au premier appel de la fct, après _counterpos gardera sa valeur sans jamais être remis à 42, pas besoin de booleen
*** Ne sous-estimez pas la puissance de la Marmotte ***
© Marmotte Team : LaMarmotte, sBibi, Vark & sabrina

14

atta tu veux faire quoi exactement là ?

si tu mets

"static unsigned short _counterpos = 42;"
_counterpos = 42 aura lieu uniquement au premier appel de la fct, après _counterpos gardera sa valeur sans jamais être remis à 42, pas besoin de booleen


Ah je ne savais pas, mais j'aurais besoin au cours du programme de l'initialiser. smile
Les variables statiques locales c'est la même chose que les variables globales (mis à part le domaine de définition), donc pourquoi tu la mets pas en global ?


Je vais vite faire un tour dans la documentation, et regarder plus en détails ses instructions.

Merci pour toutes ses infos.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

15

Vark
: _counterpos = 42 aura lieu uniquement au premier appel de la fct, après _counterpos gardera sa valeur sans jamais être remis à 42, pas besoin de booleen
T'es sûr qu'à chaque appel il ne sera pas remis à 42 ?
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

16

Si c'est une variable statique, il n'y a pas à se poser la question lolpaf
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

17

Ben je pensais qu'il aurait été possible qu'au début de la fonction, on lui réaffecte la valeur 42...
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

18

En effet, ce n'est pas le cas.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

19

En fait, la valeur des variables statiques est codée dans le programme comme pour les variables globales (c un peu différent si leur valeur est 0), donc le '=' n'est pas efféctué par le programme, mais par le compilateur.
EDIT: post croisé
avatar
Le scénario de notre univers a été rédigée par un bataillon de singes savants. Tout s'explique enfin.
T'as un problème ? Tu veux un bonbon ?
[CrystalMPQ] C# MPQ Library/Tools - [CrystalBoy] C# GB Emulator - [Monoxide] C# OSX library - M68k Opcodes

20

Ca fonctionne niquel maintenant. smile

Un autre problème qui n'as rien à voir:
unsigned short value=(((angle*100)/90)*16384)/100;
printf_xy (0,0,"%u",value);


La valeur de value est de 65209 au lieu de 8192 pourquoi? Lorsque je multiplie par 16384... est-ce que je dois spécifier sur quel nombre de bits je dois travailler?

En remplaçant unsigned short par unsigned long j'obtient 4 milliards. sad
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

21

Tu as écrit 6834 au lieu de 16384 das ton pre, vérifie que tu ne t'es pas trompé dans ton code...
Tu dois caster en long je crois parce que sinon, les opérations sont faites sur un short.
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

22

Oui je viens de corriger, dans mon programme c'était bien 16384.
Comment ça caster sur un long? Je définis unsigned long value et j'obtiens 4 milliards.
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

23

Essaie : unsigned short value=((long)((angle*100)/90)*16384)/100;
Je n'ai jamais été doué pour manipuler les transtypages, peut-être que Kevin te donnera une meilleure solution
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

24

Ah d'accord, merci Sasume, ça fonctionne bien, je vois maintenant comment réaliser correctement ce genre de chose. smile
avatar
la Nature nous montre seulement la queue du lion. Mais je suis certain que le lion a qui elle appartient pense qu'il ne peut pas se révéler en une fois en raison de son immense taille.

- Fondateur de Ti-Gen -: http://www.tigen.org

- Membre du Groupe Orage Studio -: http://oragestudio.free.fr/

- Mon site perso -: http://tisofts.free.fr

Projets TI68K en cours:
GFA-Basic = http://www.tigen.org/gfabasic
Arkanoid.
PolySnd 3.0.

25

Attention, en mettant static unsigned short _counterpos=42; (d'ailleurs arrêtez d'utiliser des underscores en début de noms de variable dans vos programmes, ces noms sont faits pour être utilisées par le compilateur ou le linker, pas par vous), la variable gardera sa valeur entre 2 exécutions du programme! (C'est une des limitations de la plateforme difficiles à résoudre. La seule solution est de demander la génération d'un fichier de données externe et la copie systématique de ce fichier (même si le fichier n'est pas archivé), ce qui est possible avec TIGCC 0.95 bêta 1.) Et le void *counterpos=&_counterpos; dans la fonction est totalement stupide et inutile. Ce qu'on voulait présumablement te dire par l'utilisation de pointeurs est:
short SetPosBall (unsigned char angle,BOOL direction,short pos, unsigned short *counterpos)
{
	unsigned short value=(angle/90)*16384;
	
	*counterpos+=value;
	if (*counterpos>value)
	{
		*counterpos-=16384;
		return pos+direction;
	}
	
	return pos;
}

void _main(void)
{
unsigned short counterpos=42;
...
SetPosBall(angle,direction,pos,&counterpos);
...
}

Ça, c'est une solution propre à ton problème.

Pour le deuxième problème:
unsigned short value=((((unsigned long)angle*100ul)/90ul)*16384ul)/100ul;
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

26

... ou encore le mettre en variable globale, ce qui évite le passage de paramètres inutile (et inefficace). Et s'il y a conflit de noms, on peut toujours rajouter en préfixe le nom de la fonction.
présumablement

hum...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

27

Kevin Kofler :
Pour le deuxième problème:
unsigned short value=((((unsigned long)angle*100ul)/90ul)*16384ul)/100ul;
Le 100ul de la fin est indispensable ? Parce que si on le laisse en unsigned short, ça permet d'utiliser divu smile
avatar
« Quand le dernier arbre sera abattu, la dernière rivière empoisonnée, le dernier poisson capturé, alors vous découvrirez que l'argent ne se mange pas. »

28

A mon avis le compilo est assez intelligent pour utiliser divu. Et de toutes façons avec les règles de promotion du C, s'il ne compile pas 100ul avec divu, il ne le fera pas pour 100 non plus.

En fait il suffit d'écrire : unsigned short value = (unsigned long)angle*100/90*16384/100; et ça devrait donner exactement le même résultat. Pour plus de clarté ça peut être une bonne idée de rajouter des parenthèses, mais les ul sont totalement inutiles. De manière générale, je me demande même à quoi servent réellement les suffixes UL à part à supporter les programmes K&R sans prototype des paramètres...

« The biggest civil liberty of all is not to be killed by a terrorist. » (Geoff Hoon, ministre des transports anglais)

29

Sasume
:
Kevin Kofler :
Pour le deuxième problème:
unsigned short value=((((unsigned long)angle*100ul)/90ul)*16384ul)/100ul;
Le 100ul de la fin est indispensable ?

Non, mais...
Parce que si on le laisse en unsigned short, ça permet d'utiliser divu smile

... ça ne devrait rien changer. Le C spécifie que si on divise un unsigned long par un unsigned short, l'unsigned short est d'abord promu en un unsigned long, donc on a forcément une division 32-bits. GCC pourrait utiliser une division 32-16-16 ici (je ne pense pas qu'il le fasse) parce que le diviseur est une constante qui rentre dans 16 bits et le résultat n'est demandé que sur 16 bits, mais en général, le standard C demande une division 32-32-32 dès qu'une des opérandes est sur 32 bits.
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité

30

Pollux
: A mon avis le compilo est assez intelligent pour utiliser divu. Et de toutes façons avec les règles de promotion du C, s'il ne compile pas 100ul avec divu, il ne le fera pas pour 100 non plus.

Voilà une autre manière de le dire, probablement plus claire que la mienne. smile
En fait il suffit d'écrire : unsigned short value = (unsigned long)angle*100/90*16384/100; et ça devrait donner exactement le même résultat. Pour plus de clarté ça peut être une bonne idée de rajouter des parenthèses, mais les ul sont totalement inutiles. De manière générale, je me demande même à quoi servent réellement les suffixes UL à part à supporter les programmes K&R sans prototype des paramètres...

short i;
unsigned long j=i*123ul
avatar
Mes news pour calculatrices TI: Ti-Gen
Mes projets PC pour calculatrices TI: TIGCC, CalcForge (CalcForgeLP, Emu-TIGCC)
Mes chans IRC: #tigcc et #inspired sur irc.freequest.net (UTF-8)

Liberté, Égalité, Fraternité