1

Bonjour
j' essaye de faire un petit programme en C avec TIGCC (pour des opérations sur les vecteurs). Pour pouvoir entrer les coordonnés des vecteurs j' ai la fonction suivante:

float getint(void)
{
  short size =   1 * sizeof(char); 
  short k = 0; 
  char *buf = malloc(size); 
  memset(buf, ' ', size); 
 
  short i = 0; 
  while(k != 13 && k != 264) 
    { 
      k = ngetchx(); 
      if(k != 13 && k != 264) 
	{ 
	  buf[i] = k; 
	  printf("%c", k); 
	  size = size + sizeof(char); 
	  buf = realloc(buf, size); 
	  i++; 
	} 
    } 
	 
  buf[size] = '\0';
  return atof(buf);
}


je fais ensuite dessus des calculs dessus (notamment pow() ), et affiche ensuite le resultat. Je compile le code sans problème, et tout marche impecablement sous TI-emu. Mais le hic c' est que quand j' execute le programme sur ma ti 89 (titanium), le programme affiche alos "une variable sur deux", et pour d' autre variables mets à la place "*undef"... Le code source est disponible ici: http://dnanar.no-ip.org/index.php?act=show&subdir=TI89_vec&sortby=name&file=mian.c

merci


ps: on ne sait jamais, j' utilise comme option de compilation: tigcc -O3 -W -Wall mian.c -o vec

2

Elle fait quoi cette fonction?
float frc(float x) 
{ 
  //fait maison...
  float result = 0;

  if(x != 0)
  {
    while(1 == 1)
    {
      result += 0.01;
      if(result*result >= x)
      {
        return result;
      }
    }
  }

  return 0.00;
}

Elle calcule une racine c'est ca? pourquoi tu n'utilise pas la fonction sqrt?
Ca serait quand même un peu plus propre et plus précis par la même occasion et plus rapide aussi. (surtout pour les grands nombres)


printf("\t 1: Coordonné d' un vecteur (point) \n");

Pourquoi tu mets des tab ?


  static short tt = 0;

  if(tt == 0)
    {
      tt = 1;
    }else
    {
      ngetchx();
    }
Fais attention les variables statiques sont stockées dans le corps du programme, c'est a dire qu'à la prochaine exécution du programme (s'il n'a pas été archivé) la variable tt vaudra 1.


(x1-x)/2
comme les variables x1 et x sont des float tu devrais plutot écrire (x1-x)/2.0f : ici 2.0f est un float (2.0 est un double). Dans ce cas on est sur que c'est une division de float et pas une division entière qui est réalisée.


pow(x, 2)
bien que la vitesse ne soit pas un point crucial dans ton programme, il est plus optimisé décrire x*x.


Tu alloues de la mémoire sur le tas à l'aide de malloc/realloc/... mais tu ne libère jamais la mémoire allouée, elle ne sera récupérée qu'après un reset de la calculatrice. Tu dois la libérer à l'aide de la fonction free
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

3

Twindruff :
Elle calcule une racine c'est ca? pourquoi tu n'utilise pas la fonction sqrt? Ca serait quand même un peu plus propre et plus précis par la même occasion et plus rapide aussi. (surtout pour les grands nombres)

Violent sa façon de calculer une racine ^^
comme les variables x1 et x sont des float tu devrais plutot écrire (x1-x)/2.0f
: ici 2.0f est un float (2.0 est un double). Dans ce cas on est sur que c'est une division de float et pas une division entière qui est réalisée.

Si je ne me plante pas, le 2 est typecasté implicitement en float, puisque c'est un type plus "grand" qu'un int.
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

4


Si je ne me plante pas, le 2 est typecasté implicitement en float, puisque c'est un type plus "grand" qu'un int.

en fait je sais jamais ça donc je mets toujours en float pour être sur tongue
avatar
Combien de tas de bois une marmotte pourrait couper si une marmotte pouvait couper du bois ?

5

normalement dans une expression, les opérandes sont toutes converties dans le plus grand type que comporte l'expression (char < short < long < float par exemple)
avatar
All right. Keep doing whatever it is you think you're doing.
------------------------------------------
Besoin d'aide sur le site ? Essayez par ici :)

6

Ok merci pout tous vos conseils smile

Donc:

-mes \t sont pour améliorer le "graphisme"
-pour remplacer les static, j' ai mis une variable globale
-j' ai modifier mes divisions vers 2.0f
-et pour les pointeur jai rajouté le free necessaire.

Pour la racine je reconnais que c' est extremement violent pam, mais lorsque j' essaye de faire la racine carré de 9 par sqrt(9), j' obtient 0.945etc ! triso
Par souci, j' ai fais ce test sous ma calculette et le resultat affiché est 3 ! couic

Mais tous ca n' a malheureusement pas resolu le problème initial: *undef reste bien ! Personne ne sait à quoi c' est du ?


(code source modifié: http://dnanar.no-ip.org/index.php?act=show&subdir=TI89_vec&sortby=name&file=mian.c

7

impossible de lire le fichier sorry

ah et puis
13:45 Devinez: Dites à legend666 que si sqrt ne marche pas dans son programme TIGCC, c'est parce qu'il n'a pas réglé le bon AMS minimum dans les options du projet. 13:47 Devinez: Ah oui, et aussi de lire les warnings du compilateur parce que "implicit declaration of function 'sqrt'", ce n'est pas marqué pour faire joli!


smile

8

Ok. Mais comment regler le bon AMS ? A preciser que je ne suis pas sous TIGCC IDE mais je compile en console (linux). Donc quel option faut-il rajouter pour modifier l' AMS ? Eh je ne comprends pas trop l' histoire des warning: je compile avec -W -Wall et je n' ai pourtant aucun warning.


edit: j' ai modifier l' url il y avit une parenthèse en trop smile : http://dnanar.no-ip.org/index.php?act=show&subdir=TI89_vec&sortby=name&file=mian.c

9

10

legend666> Ce n'est pas un problème d'utiliser des variables static. C'est même mieux que d'utiliser des variables globales.
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. »

11

Ok. En cherchant pour le problème initial, j' ai trouvé sur internet un tuto sur les boites de dialog. Donc, pour contourner le problème j' ai tout remplacer par des boites de dialogues avec des champs. Mais il me reste un petit problème: lorsque je remplie mes champs de boites de dialogue, je stocke les variable dans un buffer les contenant toutes, puis je les sépare en utilisant strcat() et les converties en float grâce à sscanf(). Et bien sur, je fais bien le free() à toutes ces variables.

Néanmoins quand je réutilise la fonction affichant les boites de dialogues (c-à-d celle utilisant les variables cités precedemment), j' observe non suelement qu' elles ne sont pas detruites, mais en plus lorsque je fais les opérations cité precedemment, la ti concatène la valeur du champ à la precedente valeur...... Comme un bout de code vaut mieux qu' un long discours:

short xyz(float *x, float *y, float *x1, float *y1)
{
  HANDLE dialog = DialogNewSimple(156, 80);
  char *buffer = malloc(24*sizeof(char));
  short result;
  
  DialogAddTitle(dialog, "Coordonne vecteur", BT_OK, BT_CANCEL);
  
  DialogAddRequest (dialog, 5, 20,  "Ax:", 0, 5, 9); 
  DialogAddRequest (dialog, 5, 30, "Ay:", 6, 5, 9); 
  DialogAddRequest (dialog, 5, 40, "Bx:", 12, 5, 9); 
  DialogAddRequest (dialog, 5, 50, "By:", 18, 5, 9); 
  
  short i;
  i = DialogDo(dialog, CENTER, CENTER, buffer, NULL); 
  
  if(i == KEY_ENTER)
    {
      char *presult  = malloc(6*sizeof(char));
      char *p2result = malloc(6*sizeof(char));
      char *p3result = malloc(6*sizeof(char));
      char *p4result = malloc(6*sizeof(char));

      strcat(presult,  buffer);
      strcat(p2result, buffer+6);
      strcat(p3result, buffer+12);
      strcat(p4result, buffer+18);
      
      sscanf(presult,  "%f", x);
      sscanf(p2result, "%f", y);
      sscanf(p3result, "%f", x1);
      sscanf(p4result, "%f", y1);
      
      
      free(presult);
      free(p2result);
      free(p3result);
      free(p4result);

      result = 0;
    }else
    {
      *x  = 0;
      *y  = 0;
      *x1 = 0;
      *y1 = 0; 

      result = 1;
    }


  free(buffer);
  HeapFree(dialog);
  printf("\nA(%f;%f)\tB(%f;%f)\n\n", ((double)*x), ((double)*y), ((double)*x1), ((double)*y1));
  return result;
}


Le code entier est disponible ici: http://dnanar.no-ip.org/index.php?act=show&subdir=TI89_vec&sortby=name&file=mian.c

12

Tu sais, tu n'es pas obligé d'allouer tous tes tableaux sur le tas. Tu peux très bien utiliser la pile smile
le premier buffer :char buffer[24];Par exemple pour
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. »

13

J' ai essayé de faire ainsi, mais cela n' arrange pas mon programme et me rajoute un "protected memory" fou En effet, pour la première utilisation (du moins sur TIEMU), aucun problème, mais dès que j' essaye de relancer ladite fonction, protected memory, sans même voir le dialogue s' afficher...Pour implementer ce que tu m' a dis:

short xy(float *x, float *y)
{
  HANDLE dialog = DialogNewSimple(156, 60);
  char buffer[12];
  short result;
  
  DialogAddTitle(dialog, "Coordonne vecteur", BT_OK, BT_CANCEL);
  
  DialogAddRequest (dialog, 5, 15, "ABx:", 0, 5, 9); 
  DialogAddRequest (dialog, 5, 30, "ABy:", 6, 5, 9); 
  
  short i;
  i = DialogDo(dialog, CENTER, CENTER, buffer, NULL); 

  if(i == KEY_ENTER)
    {
      char res[2][6];

      short j;
      for(j=0;j<6;j++)
	{
	  res[0][j] = buffer[j];
	  res[1][j] = buffer[j+6];
	}

      sscanf(res[0],  "%f", x);
      sscanf(res[1], "%f", y);

      result = 0;
    }else
    {
      *x = 0;
      *y = 0;
      
      result = 1;
    }

  HeapFree(dialog);
  printf("\nAB(%f;%f)\n\n", ((double)*x), ((double)*y));
  return result;
}


Le code source complet: http://dnanar.no-ip.org/index.php?act=show&subdir=TI89_vec&sortby=name&file=mian.c