1

Salut à tous,

J'étais un gros programmeur de TI89. Ben ouais, faut bien occuper les cours de maths ou de français trop longs ... Après avoir écrit une bonne centaine de prog sur TI89, je me suis dit : tient, si je reprogrammais une TI89 sur mon PC ?

Alors j'ai pris un bouquin de C, un autre de C++, et une tablette de chocolat. Résultat, un an plus et demis plus tard, je suis abouti à ça :
http://www.haypocalc.com/

C'est une calcuatrice qui fait du calcul symbolique ou numérique selon l'option choisie. Je me suis basé que la TI89 pour les noms de fonctions, après j'ai françisé, et pour la syntaxe c'est pas mal de C (mais vous vous y retrouverez). C'est gratos et sous license GPL ;-)

Exemple du "script" : teste si le nombre x est premier par divisions :
--------------
EstPremier(x) =
{
// Inférieur à 2 : pas premier
Si (x<2) Retourne(FAUX);

// Egal 2 : premier
Si (x == 2) Retourne(VRAI);

// Nombre pair autre que 2 : n'est pas premier
Si (Mod(x,2) == 0) Retourne(FAUX);

// Teste tous les diviseur inférieur au nombre (de 2 à x-1)
i = 3;
TantQue(i*i <= x)
{
// Si on peut diviser ce nombre : il n'est pas premier
Si (Mod(x, i) == 0) Retourne(FAUX);

// Passe au prochain diviseur
i += 2;
};

// Aucun nombre compris entre 2 et Racine(x)
// ne le divise : il est premier
Retourne(VRAI);
};
--------------

Tout n'est pas encore développé:
- Manque un mode graphique : Faut que je trouve du temps pour écrire la GUI avec la librairie wxWindows (http://www.wxwindows.org)
- Manque pas mal de calcul symbolique (intégrale, matrice, limite, ...). Mais y'a quand même la dérivé et la fonction "Part" ;-)

Le plus simple étant, à mon avis, de lire la doc :
http://www.haypocalc.com/manuel/1.5/index.php

Donc si vous êtes curieux, faites un tour sur mon site pour me dire ce que vous pensez de la calto. Si vous êtes intéressé par le développement d'un calto, il faut savoir que HaypoCALC est écrit en C++ principalement.

@+ Haypo
http://www.haypocalc.com/ : Calculatrice scientifique

2

je compile et je teste ...

3

Ca a l'air génial ! C'est dommage que ce soit écrit en C++ et pas en C, car ça aurait pu être la partie maths d'un potentiel nouvel OS de calto (même si je pense que tes algos propres aux maths doivent être proches du C std).
En tous cas, bonne continuation et bravo ! (surtout pour la gestion de calcul symbolique)
avatar

4

ca doit pas etre tres dur de le faire en C.
je test égallement

5

Nil: HaypoCALC ne pourrait pas tenir dans une TI89, il est trop gros (bcp de messages d'erreur différents) et n'est pas fait pour un clavier TI89 ... quoique?

HaypoCALC n'utilise pas beaucoup de C++, mais ça simplifit énormément le code! Exemple: pour accéder au 2 élément d'une expression, on tape "a(1)", et pour lire la 2uème sous-expression, on tape "a[1]". Il y a également une classe de détection des débordements sur les calculs entiers. Au final, pour faire a+b (entiers), on tape a+b.

Dans le futur, je pense utiliser de plus en plus de C++ :
- Librairie STD C++ qui optimiserait et simplifirait le code
- wxWindows : librairie graphique

@+ Haypo
http://www.haypocalc.com/ : Calculatrice scientifique

6

tu le programmes avec quel compilo ? visual c++ ?

7

Je n'ai pas vérifié, mais si tu veux le compiler, http://www.mingw.org devrait marcher normalement (vu que c'est du cross-platform Windows/Linux).
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é

8

en tout cas c'est assez interessant, meme si ce n'est pas assez poussé: il manque tout ce qui touche à l'algebre linéaire ...

> pour l'intégration, des polynomes (j'ai vu dans ta doc que tu voulais le faire), si tu ne sais pas trop comment faire, passe par une liste chainée ... c'est assez simple à faire.

9

Disons que quand je programme un truc, je le fais proprement. Alors faut d'abord que l'algo soit bien écrit dans la tête avant de passer à la prog. Pour les polynômes par exemple il existe plusieurs représentations : coefficients pour les x de degré 0 à n, ou alors des couple (coeff, degré), ou autre. Pareil pour l'intégration : primitive de sin(x), facile, mais x*ln(x) ou n'importe quelle autre fonction ... C'est super balèze !

Ces 6 derniers mois, j'étais plus axé sur la programmation. C'est super intéressant d'écrire son propre langage. J'ai introduit les listes et les chaînes de caractères.

Je programme avec Borland C++ Builder 5/6, mais ça se compile sous Linux avec GCC. Ca devrait donc passer avec MinGW (= GCC pour Windows). Les makefile existent, fait p'têtre les adapter pour Windows ...

@+ Haypo
http://www.haypocalc.com/ : Calculatrice scientifique

10

voué, le calcul de fonctions non polynomiales est pour moi très compliqué ... je n'ai aucune idée de comment faire cela ... peut-etre de la reconnaissance de forme de la fonction, mais c'est assez lourd !

11

Quelques corrections pour la compilabilité avec MinGW:
--- commun/HConsole.old Wed Dec  4 09:50:26 2002
+++ commun/HConsole.cpp Mon Jan 13 17:12:50 2003
@@ -51,8 +51,8 @@
    HANDLE HdlConsole;
 #endif
 
-// Utilise la librairie "conio.h" des compilateurs Borland ?
-#if defined(__BORLANDC__)
+// Utilise la librairie "conio.h" des compilateurs Borland et MinGW?
+#if defined(__BORLANDC__) || defined(__MINGW32__)
 #  define UTILISE_CONIO_H
 #  include <conio.h>
 #endif


--- commun/HFichier.h.old       Wed Dec  4 22:49:42 2002
+++ commun/HFichier.h   Mon Jan 13 17:18:34 2003
@@ -54,7 +54,7 @@
 
 //---------------------------------------------------------------------------
 
-#if defined(_Windows) && !defined(__MINGW32_VERSION)
+#if defined(_Windows)
 // Lit le chemine courant
 char *CheminCourant ();


--- commun/HFichier.old Wed Dec  4 22:49:40 2002
+++ commun/HFichier.cpp Mon Jan 13 17:29:06 2003
@@ -77,7 +77,13 @@
 
 //---------------------------------------------------------------------------
 
-#if defined(_Windows) && !defined(__MINGW32_VERSION)
+#if defined(_Windows)
+#if defined(__MINGW32__)
+#include <windows.h>
+#define MAXDIR MAX_PATH
+#define getcurdir GetCurrentDirectoryA
+#endif
+
 // Lit le chemine courant
 char *CheminCourant ()
 {
@@ -97,6 +103,12 @@
       TxtErreurFichier(errno));
   }
 
+#if defined(__MINGW32__)
+  // Créer la chaîne finale
+  txt = (char *)malloc (strlen(courant)+1); // 3 = "C:\"
+  strcpy (txt,courant);
+  return txt;
+#else
   // Lit le disque courant
   lecteur = getdisk();
 
@@ -108,12 +120,13 @@
   txt[3] = '\0';
   strcat (txt,courant);
   return txt;
+#endif
 }
 #endif
 
 //---------------------------------------------------------------------------
 
-#if defined(_Windows) && !defined(__MINGW32_VERSION)
+#if defined(_Windows)
 // Complète le chemin d'un fichier : 'test\fichier.txt'
 // -> '<REP_COURANT>\test\ficher.txt'
 char *CompleteChemin (const char *nomfich)

(attention Le changement à HFichier.cpp est suffisant pour que ça compile, mais ne marche pas correctement. Il faudra voir la documentation de GetCurrentDirectoryA pour avoir quelque chose de portable (entre compilateurs pour Win32) et qui fonctionne.)

Avec ces changements-là, ça compile avec:
make CXXFLAGS='-Os -s -Wno-deprecated' LIBS=
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é

12

Encore une correction. On ne peut pas passer NULL à GetConsoleOutputCharacter sous Windows Me. Ça fait tout planter. Patch (qui contient aussi l'autre patch au même fichier, déjà posté dans le message d'avant):
--- commun/HConsole.old Wed Dec  4 09:50:26 2002
+++ commun/HConsole.cpp Mon Jan 13 17:48:18 2003
@@ -51,8 +51,8 @@
    HANDLE HdlConsole;
 #endif
 
-// Utilise la librairie "conio.h" des compilateurs Borland ?
-#if defined(__BORLANDC__)
+// Utilise la librairie "conio.h" des compilateurs Borland et MinGW?
+#if defined(__BORLANDC__) || defined(__MINGW32__)
 #  define UTILISE_CONIO_H
 #  include <conio.h>
 #endif
@@ -456,6 +456,7 @@
 #if defined(_Windows)
   // Lit la coordonnée Y du curseur
   CONSOLE_SCREEN_BUFFER_INFO Info;
+  DWORD dummy;
   GetConsoleScreenBufferInfo (HdlConsole,&Info);
 
   // Ecrit la coordonnée X du curseur : 1
@@ -463,8 +464,8 @@
 
   // Aucun contrôle : il faudrait vérifie que la fonction retourne TRUE
   // et que le nombre de caractère écrit vale bien 80 (avec "DWORD Nombre;" et
-  // &Nombre à la place de NULL)
-  FillConsoleOutputCharacter(HdlConsole,' ',80,Info.dwCursorPosition,NULL);
+  // &Nombre à la place de &dummy)
+  FillConsoleOutputCharacter(HdlConsole,' ',80,Info.dwCursorPosition,&dummy);
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é

13

Et je rajoute: pour que ça marche bien, il faut utiliser MSYS et rxvt pour la compilation (pour que les codes de formattage VT100 du make passent), mais une fenêtre DOS normale pour l'exécution (pour que les caractères CP 437/850 et les fonctions de manipulation de console fonctionnent).
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é

14

Merci énomément Kevin Kofler pour les corrections de bugs. J'ai eu un peu de mal à "lire" les fichiers patch, mais j'ai compris ce qui n'allait pas. Pour lire le répertoire courant, j'utilise désormais GetCurrentDirectory. Il nécessite en paramètre la taille du tampon, et un tampon de caractère. Il renvoie la longueur du tampon. L'aventage est qu'il ajoute directement le disque courant ("C:\" par exemple).

Je suis en train de télécharger MinGW 2.0 (12 Mo par modem, ça rame !). Je vais pouvoir tester sur le pc de mon père. Sur mon PC, j'ai installé Cygwin, c'est pas mal non plus. Je me base un peu là-dessus pour la compilation sous Linux. Pb: Ca ne fait pas la différence entre les minuscules et les majuscules pour les noms de fichiers.

Dernières news de HaypoCALC :
- L'opérateur a%b remplace la fonction modulo 'Mod(a,b)'
- Obligation d'utiliser les parenthèses pour appeler une fonction. C'est un peu gênant, mais ça permet d'utiliser des variables et fonctions ayant le même nom ;-)
- Plein de corrections de bugs
- Découpages des fichiers et des fonctions en plus petites unités
- Nettoyage du code
- etc.
Tout ça pour une version 1.6 bien propre ... en attendant la version 2.0 (version graphique).

@+ Haypo
http://www.haypocalc.com/ : Calculatrice scientifique

15

haypo a écrit :
Merci énomément Kevin Kofler pour les corrections de bugs. J'ai eu un peu de mal à "lire" les fichiers patch, mais j'ai compris ce qui n'allait pas. Pour lire le répertoire courant, j'utilise désormais GetCurrentDirectory. Il nécessite en paramètre la taille du tampon, et un tampon de caractère. Il renvoie la longueur du tampon. L'aventage est qu'il ajoute directement le disque courant ("C:\" par exemple).

En effet.
Je suis en train de télécharger MinGW 2.0 (12 Mo par modem, ça rame !). Je vais pouvoir tester sur le pc de mon père. Sur mon PC, j'ai installé Cygwin, c'est pas mal non plus.

Tu peux compiler avec le flag -mno-cygwin pour compiler pour MinGW sous Cygwin. Mais le mieux est quand-même mieux de tester avec un environnement MinGW+MSYS, qui est l'environnement "officiel" de MinGW.
Je me base un peu là-dessus pour la compilation sous Linux. Pb: Ca ne fait pas la différence entre les minuscules et les majuscules pour les noms de fichiers.

export CYGWIN="check_case:strict"
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é

16

Je cite ta documentation:
Signe(x)^(2n) -> 1

Attention, ce n'est correct que si n est entier!
Support des intervalles : Ce qui permettrait de définir des intervalles de définitions d'une fonction ! Le GROS problème, trouver un symbole pour écrire "x appartient à [0..1]" : x@[0..1] ?

€ ? Le problème est que le signe euro a un code différent selon la page de code (128 sous Windows CP 1252, 164 sous ISO 8859-15, 8364 sous Unicode, donc une combinaison d'octets sous UTF-8, absent sous ISO 8859-1).
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é