120

C'est que t trop fort...

121

et encore un truc comment on peut rechercher un variable par exmple nommer "bat" dans tout les repertoirs de la TI merci

122

Tu fais une boucle avec SymFindFirst et SymFindNext.
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é

123

Kevin Kofler :
C'est moi qui ai pondu ce code "illisible". smile (Je reconnais tout de suite le style integer[array]. grin)

Il n'y a rien à dire tout de même, c'est bien débile d'utiliser ce genre de tricks.
Ca a été utilisé il y a pas mal de temps pour certaines raisons (que j'ai déjà évoqué dans un topic en donnant cette synthaxe il y a pas mal de temps) mais actuellement roll

[edit squale92] Suppression de ce qui aurait pu causer un flame.

124

eu je galere je rame j'ai meme plus de ram la aider moi s'il vous plait j'arrive pas a faire la recherche de ma var voila ce que j'ai peniblement reussi a faire merci de m'aider
#include <tigcclib.h>

void _main(void)
{
clrscr();
char *dossier=calloc(20*9,sizeof(char)),buffer[20];
short i=0;

SYM_ENTRY *psym = SymFindFirst(NULL, 4);
while (psym!= NULL && i<20 )
{
strcpy(&dossier[9*i++],psym->name);
psym = SymFindNext();
}

short j = 0;
i=0;
SYM_ENTRY *SymPtr = SymFindFirst (SYMSTR (&dossier[9*i]), 2);
while (SymPtr)
{
strcpy(buffer,&dossier[9*j++]);
strcat(buffer,"\");
strcat (buffer, SymPtr->name);
strcpy(&dossier[9*j++],buffer);
SymPtr = SymFindNext ();
}
printf("%s\n",&dossier[9*0]);
printf("%s\n",&dossier[9*1]);
printf("%s\n",&dossier[9*2]);
printf("%s\n",&dossier[9*3]);
ngetchx(); }

125

han !

126

qu'est ce qu'il ya nEUrOO??

127

rien.
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

128

strcpy(&dossier[9*j++],buffer);

trinon buffer overflow ^^

Et sinon, tu ferais mieux de ne jamais utiliser de constantes style 9, 4 ou 2 dans le code : utilise plutôt #define TAILLE_DOSSIER 9 , ou encore SF_MACHIN à la place de ce qu'il faut, parce que sinon c moyennement lisible et surtout tu risques de te planter si tu veux changer par exemple la taille de ton buffer ^^

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

129

Euh c'est violent comme c'est le bazarre ton code. Bon, je vais pas prétendre que le mien est plus propre, vu que ce n'est pas à moi de juger.
/** Recherche une variable par nom
 * @param name Le nom de la variable (pas un chemin complet).
 * @param continued 0 pour entamer une nouvelle recherchen 1 pour
 *    poursuivre une recherche en cours.
 * @return 0 si la variable n'a pas été trouvée, un pointeur sur
 *	  l'entrée correspondance si la variable a été trouvée.
 * @note On peut utiliser SymFindFolderName pour récupérer le nom du
 *	  répertoire contenant la variable.
 * @warning Il n'est pas possible de continuer une recherche si une
 *	  compression du tas a eu lieu depuis le dernier appel.
 */
SYM_ENTRY * FindVariable(const char * name, bool_t continued)
{
	SYM_ENTRY * entry;

	if (continued)
		entry = SymFindNext();
	else
		entry = SymFindFirst(0, FO_RECURSE);
	
	do {
		if (strncmp(name, entry->name, 8) == 0)
			return entry;
	} while(entry = SymFindNext());
	return 0;
}
Non testé, hein.

130

bon alors voila j'ai reussi a un truc pres
short chevar(char *name,char *chemin)
{
char var[9];
char dos[9];
char chem[25];

SYM_ENTRY * entry;
entry = SymFindFirst(0, 2);
while(entry)
{
if(strncmp(name, entry->name, 8) == 0)
{
strcpy(var, entry->name);
break;
}
entry = SymFindNext();
}
strcpy(dos, SymFindFolderName());

strcpy(chem,dos);
strcat(chem,"\");
strcat (chem, var);
strcpy(&chemin[25],chem);
return 1;
}

void _main(void)
{
clrscr();
char *chemin=calloc(25,sizeof(char));
chevar((char *)"bateaux",chemin);
printf("%s",&chemin[25]);
ngetchx();
free(chemin); }

cela m'affiche bien ma var sous la forme desire rep\var mais le probleme c'est qu'a la fin du prog j'ai internall error et gros plantage pourquoi s'il vous plait merci

131

Ton problème vient du &chemin[25]. Les fonctions travaillant sur des chaînes prennent l'adresse du premier octet, pas du dernier (contrairement aux symstr). Du coup au lieu d'écrire dans le buffer chemin, tu écris après, et donc tu écrases plein d'informations importantes (en l'occurence tu écrases l'adresse de retour du main dans la pile).

Sinon, 2-3 détails :
- remplace printf("%s", x) par puts(x) ça fait pareil mais beaucoup plus vite.
- tu peux travailler directement sur tes paramètres dans la fonction, ça évite de faire 18 copies.
- quand tu ne modifies pas un paramètre (je pense au char* name), marque const devant. Ca permet au compilateur de faire certaines optimisations, et à toi de voir immédiatement si tu le modifies par mégarde (le compilateur va raler).
- Un tableau temporaire pas trop gros et de taille fixe tu peux le créer directement sans t'embèter avec calloc et free.

ngetchx(); }
Teste avec ça ?short chevar(const char *name, char *chemin)
{
	char var;
	char dos;
	char chem[25];

	SYM_ENTRY * entry;
	entry = SymFindFirst(0, FO_RECURSE);
	while(entry)
	{
		if(strncmp(name, entry->name, 8) == 0)
			break;
		entry = SymFindNext();
	}
	if (!entry) return 0;
	
	strcpy(chemin, SymFindFolderName());
	strcat(chemin,"\");
	strncat(chemin, entry->name, 8);
	return 1;
}

void _main(void)
{
	char chemin[25];

	clrscr();
	if (chevar("bateaux", chemin) != 0)
		puts(chemin);
	

132

merci ca marche!!