1

comment peut-on définir une liste qui risque d'augmenter au cours de l'utilisation d'un prog.
Par exemple en basic:
valeur -> ma_list[dim(ma_list)+1]

je penser faire un truc du genre
int *ma_list;
int nb_elements = 1;
ma_list = malloc(nb_elements * sizeof(int));

puis au moment d'augmenter la liste de 1 éléments faire
free(ma_list);
ma_list = malloc((nb_elements++) * sizeof(int));

mais ça plante à chaque foismad

2

redimensionne avec realloc() peut-être

int *ma_list;
int nb_elements = 1;
ma_list = calloc(nb_elements, sizeof(int));

redimensionneement :

if((ma_list = realloc(ma_list, (nb_elements++) * sizeof(int))) == NULL)
exit(0);


met aussi des tests pour savoir si le calloc/realloc à fonctionné wink
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

3

Voilà; comme ça ça marche:

int *ma_list;
int nb_elements = 1;
ma_list = malloc(nb_elements * sizeof(int));

puis:

if((ma_list = realloc(ma_list, (nb_elements++) * sizeof(int))) == NULL)
exit(0);


pas besoin de calloc on dirait.

Merci pour ton aide!

4

calloc ou malloc, on fait comme on veut.
je préfère juste calloc car il remet les octets de l'espace alloué à 0 je crois smile
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

5

j'ai un autre petit problème!
j'ai défini une structure comme ceci:

typedef struct
{
char nom[8];
int x, y;
int actif;
} OBJET;

OBJET *obj;

obj= (OBJET *)malloc(10 * sizeof(OBJET));

Losque je veux faire obj[0].nom = "Objet 1"; j'ai une erreur (Incompatible types in assignement)?!!?!?

ma structure est pourtant bien définie non? y'aurai pas une histoire de pointeur la dessous?

6

oué, calloc revient à faire un malloc, puis un meset à 0 dessus.
(c'est une fonction qui fait ça)

qd y'a pas besoin de tout mettre à 0, autant faire un malloc tout court : c plus rapide, je penses
avatar
Tutorial C (TI-89/92+/v200) - Articles Développement Web (PHP, Javascript, ...)
« What is the sound of Perl? Is it not the sound of a wall that people have stopped banging their heads against? » - Larry Wall

7

Evidemment que c'est plus rapide smile

IroS : un tableau est assimilable à un pointeur constant. On ne peut pas faire tableau= qqch.
Tu veux copier ta chaîne (tableau) de caractères dans le tableau (de caractères) nom. "Copier" veut sire ce qu'il veut dire... On utilise la fonction de copie de chaînes strcpy(obj[0].nom, "Objet 1")
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

8

"obj[0].nom" confus
Les pointeurs de structure c'est pas plutôt "obj[0]->nom" ?

9

Non, obj[0] n'est pas un pointeur. C'est obj tout court qui l'est. obj[0] c'est l'élément 0 du tableau obj, qui est une structure. On accède aux champs de cette structure avec l'opérateur '.'
Le '->' s'utilise pour les pointeurs sur les structures.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

10

nmatrice a écrit :
"obj[0].nom" confus Les pointeurs de structure c'est pas plutôt "obj[0]->nom" ?


non, mais je vais apporter complément à la réponse de Thibaut, il a plusieurs moyens de faire référence à un tableau de structures avec un pointeur dessus (pointeur "obj")

Pointeur vers un tableau de structure, on accède aux elements de la x_ième structure par :

obj[x].element

ou

(obj + x)->element

sachant que obj est ds les 2 cas de type "ta structure" wink
Non-Webmaster et non-programmeur du site. .Pour tout probleme ou question ,débrouillez vous avec les Webmasters .

«- Pas Moo ! ^^

11

Autre problème (en fait cela se rapporte au premier)
voilà ce que je défini:
typedef struct
{
  char nom[16];
  int actif;
  void *V_SCR;
} CALQUE;

CALQUE *Calque;
int NB_CAL = 1;


Il s'agit d'une structure qui va contenir le nom du calque, savoir s'il est actif ou non et un pointeur sur un écran virtuel

Comme au début il n'y a qu'un seul calque je mets
	Calque = (CALQUE *)malloc(NB_CAL * sizeof(CALQUE));
	Calque[0].V_SCR = malloc(3840);
	strcpy(Calque[0].nom, "Calque 1")
	Calque[0].actif = 1;
	PortSet(Calque[0].V_SCR, 239, 127);


Si je travail dans ce calque je n'ai aucun problème par contre si j'en cré un autre:
int Nouv_Calque(void)
{
	if((Calque = (CALQUE *)realloc(Calque, (NB_CAL++) * sizeof(CALQUE))) == NULL) 
		{
			return 0;
		}
	return 1;
}


je n'arrive ni a modifier les infos de la structure
strcpy(Calque[1].nom, "Calque 2"),

ni à écrire dessus
PortSet(Calque[1].V_SCR, 239, 127);
DrawStr (60, 60, "Test", A_NORMAL);


J'ai autant d'ADRESS ERROR que d'ILLEGAL INSTRUCTIONsad

12

>>if((Calque = (CALQUE *)realloc(Calque, (NB_CAL++) * sizeof(CALQUE))) == NULL)
Je pense que ce que tu veux faire est:
if((Calque = (CALQUE *)realloc(Calque, (++NB_CAL) * sizeof(CALQUE))) == NULL).
Sinon, il n'y aura qu'un CALQUE. Essaie ça.
Aussi:
typedef struct
{
char nom[16];
int actif;
void *V_SCR;
} CALQUE;
Je le changerais à
typedef struct
{
char *nom;
short actif;
void *V_SCR;
} CALQUE;
D'abord, tu ferais mieux d'utiliser short au lieu d'int, parce que, avec -mno-short, int deviendra long. Aussi, avec char* nom, tu peux faire:
Calque[0].nom = "Calque 1";
au lieu de
strcpy(Calque[0].nom, "Calque 1")

13

joelt49>
merci pour ton aide je n'avais pas vus mon erreur (++NB_CAL)
pour ce qui est du char j'ai laissé la méthode avec strcpy, TIGCC me renvoie un warning sinon donc pour le moment je n'y touche pas

Sinon comment fait-on pour superposer des écrans virtuels et les mettre dans LCD_MEM?
J'ai essayé ça
	int cptr;
	
	for (cptr = 0; cptr < NB_CAL; cptr++)
		{
			if (Calque[cptr].actif)
				{
						memcpy (LCD_MEM, Calque[cptr].V_SCR, LCD_SIZE);

				}


mais ca efface l'écran virtuel actif précédent au lieu de le superposer

14

bah ouai roll

Il faut effectuer un OU entre les deux.
Ca donne donc :
  short cptr;
  
  for (cptr= 0; cptr<NB_CAL; cptr++)
    if (Calque[cptr].actif)
    {
      short compteur_long= LCD_SIZE/4;
      long *src= (long *)Calque[cptr].V_SCR,
           *dst= LCD_MEM;
      
      while (compteur_long--) *dst++ |= *src++;
    }
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

15

> D'abord, tu ferais mieux d'utiliser short au lieu d'int, parce que, avec -mno-short, int deviendra long.
Ca n'est valable que pour les libs qui doivent marcher indépendamment de la config.
-mno-short n'est là que pour pouvoir compiler des progs prévus pour des int de 32 bits, mais si ton prog est prévu pour TI, tu peux supposer que les int font 16 bits smile

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

16

de toute façon maintenant ce n'est plus défini ni en int, ni en short; cette valeur doit prendre soit 0 soit 1.
merci quand même!

sinon je doit dire que mon prog avance assez bien (entre mes heures de boulot, dodo et autre) donc dès que j'aurais fini une première version stable j'aurais besoin de testeurs et de conseillés (histoire d'avoir d'autres idées ou point de vue). Alors si certains, parmis ceux qui m'ont aidé, le veulent je leur enverrai une bêta

17

> de toute façon maintenant ce n'est plus défini ni en int, ni en short; cette valeur doit prendre soit 0 soit 1.

Eh si, si tu fais un enum c en fait un int (et même si tu fais un bitfield ta valeur sera convertie en int smile)

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

18

Thibaut> en rapport avec le post #13:

cela permet de supperposer mes calques mais seulement en noir et blanc. Comment fait-on pour faire la même chose mais en niveau de gris sachant que Calque[cptr].plan est un int avec soit 0 (LIGHT), 1 (DARK) et 2 (BLACK)?

19

Change format !!!!!
t1 la mémoire que tu dois bouffer avec ce format (en plus de la copie super-lente) fou
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

20

Comment ça "Change format"?
et puis la vitesse n'est pas primordial

21

Là tu bouffes 128*240 = 30 ko !

Avec le format "standard" des NDG on ne bouffe que 3,8 ko smile
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

22

c ça sauf qu'il faut multiplier tout par 2 smile

60 ko par plan pour la méthode de IroS et 7.6 ko pour les gray normaux

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

23

et c koi la methode "standard"?
moi j'ai besoin de plusieurs écrans virtuels (pas 10 non plussick). le programme que je fais est un prog de dessin avec calques et je n'ai pas trouvé mieux que de faire des écrans virtuels pour chaque calques avec une structure regroupant les pointeurs et autres infos sur le calque

24

Eh bien tu fais 3 écrans type LCD_MEM par calque, l'un étant le plan Dark, le 2è le Light et le 3è le masque : s'il est à 1, le pixel est transparent, s'il est à 0, le pixel est opaque...

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

25

#21 : non sa méthode ne demande "que" 30ko. Par contre tu as raison pour le format "standard", j'ai oublié de doubler.
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

26

A priori les int font 2 octets, pas 1. Ceci dit il aurait pu utiliser des char sans pb smile

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

27

Bravo tu m'as eu !

Putain je suis con sick
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.

28

autrement dit je fais 3 unsigned char *screen = LCD_MEM; par calque plutôt que des Calque[cptr].V_SCR = malloc(LCD_SIZE); c'et bien ça?

29

???

calque[x].plan est un int, pas un tableau de int?

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

30

IroS : non. Il faut faire 3 Calque[cptr].planX= malloc(LCD_SIZE);
avatar
Un site complet sur lequel vous trouverez des programmes et des jeux pour votre calculatrice TI 89 / Titanium / 92+ / Voyage 200 : www.ti-fr.com.
Quelques idées personnelles ici.