Idée de concours : Optimisation de code

A l'aide d'une carte Arduino, afficher la température d'une sonde DS18B20 toutes les 5 seconds dans le moniteur série

Le possibilités d'optimisation sont pratiquement inexistantes dans un cas aussi simple.

@+

Ajoutez le stockage et l'affichage des valeurs sur un serveur, voire un peu de traitement

hbachetti:
Le possibilités d'optimisation sont pratiquement inexistantes dans un cas aussi simple.

@+

Même en utilisant différentes librairies ?

BrUnO14200:
Même en utilisant différentes librairies ?

:grin:

Pour faire un choix entre les # lib , il faut regarder comment chacune est.. optimisée 8)

Artouste:
:grin:

Pour faire un choix entre les # lib , il faut regarder comment chacune est.. optimisée 8)

D'où ma proposition de concours ... :smiley: !

Même en utilisant différentes librairies ?

Y compris sans librairie en utilisant directement Wire/I2C. Trop simple.

Je propose un nouveau tuto en annexe du concours :

Comment mettre le feu au forum.....

:grin:

Du moment qu'il n'y a pas de prosélytisme pourquoi pas s'il y a des volontaires.
Mais pourquoi s’arrêter au seul logiciel ?
L'optimisation du microcontrôleur est au minimum aussi importante.

De plus pour tout concours il faut un jury ... impartial.

:smiling_imp:

Mon idée de base était de comparer la taille de ...nos programmes :smiley: .

C'était le seul critère "objectif" à mon sens ..

Le but était aussi de proposer une autre façon d'apprendre que les éternels copies de tutos ...

C'était le seul critère "objectif" à mon sens ..

Pas vraiment d'accord. Privilégier la taille au détriment de la lisibilité n'est pas une solution.
Cela conduit généralement à du code du genre gros pâté monolithique.

+1 avec hbachetti... la maintenabilité du code et le respect des types par exemple sont 2 points importants qu’un hack qui fonctionne aujourd’hui est un bug difficile à trouver demain...

Cf bug de l’an 2000 parce qu’on avait voulu économiser 2 octets par date (et pris une représentation ascii)

Cf le bug d’un booléen b auquel on pouvait faire b++ par le passé pour le faire alterner entre true et false

Cf du code en assembleur qui vous laisse coincé dans le passé

La taille de n’est pas tout....

J-M-L:
La taille de n’est pas tout....

Oui, l'important c'est la manière de s'en servir, d'où l'idée initiale...

Peut-être le mot de "concours" était-il mal choisi, car il laisse penser à une comparaison, voire une récompense. Je ne pense pas que c'était inclus dans son idée.

Oui peu importe le nom , ce que j'imaginais c'était une sorte de comparaison de code "propre" pour un sujet donné .

Débrouillez vous avec le sens de "code propre" :smiley: .

Dans l'idée, ca permettait à chacun, du noob au grand crack de participer et de confronter sa fàçon de faire à celles des autres et donc de progresser ..

On pourrait parler de "recueil d'idées de programmation" ... :wink:

Mon idée de base était de comparer la taille de ...nos programmes

Et la rapidité d'exécution peut être intéressante aussi.

Des discussions précédentes je retiens :

  • compacité du code et de l'occupation de l'espace mémoire par les variables.
  • lisibilité du code.
  • et j'ajoute rapidité d’exécution parce que il n'y a pas que le programme qui compte, derrière le micro il y a de l'électronique qui peut être rapide à commander.

Il me semble que la lisibilité du code peut aller à l'encontre de la compacité (Flash et Ram) et de la vitesse d'exécution surtout pour un petit microcontrôleur.
Or on voit plus souvent la RAM saturée que la Flash, ce point a son importance.

Autre point à définir : faut-il obliger à utiliser les bibliothèques existantes ou bien inciter à en écrire de mieux fichues (code optimisé et suppression de trucs tordus comme les yards, les fahrenheits ou le mode AM/PM par exemple)

Comme proposition je pondérerais l'effort à fournir de la façon suivante :

  • compacité du code en flash : 25%
  • compacité de l'espace mémoire en RAM : 40%
  • rapidité d'exécution : 25 %
  • lisibilité : 10%

Si c'est trop compliqué : compacité Flash+ Ram = 100%

Je pense qu'il faut que tu suives ton idée. Ce ne pourra pas être parfait mais au moins cela existera.
Si tu écoutes tout le monde, en 2020 il n'y aura toujours rien de concret.

Propose un sujet, la discussion quittera la sphère philosophique pour entrer dans l'espace concret, et qui veut suivre suivra.
S'il n'y a personne ce ne sera pas une catastrophe.
Si cela donne l'envie à certains d'améliorer ta proposition ce sera super, à condition de ne pas dépasser le mois de janvier/février 2019 (pas 2020).

Ok je vais essayer de lancer ça entre les fêtes et on verra bien comment ça se passe ... :smiley: !

Les fêtes sont passées, et pas de suite...
Alors je vous propose un sujet :

Comment extraire des nombres d'un tableau de caractères ?
Supposons un tableau de caractères contenant des nombres perdus à l'intérieur, aussi bien des entiers que des décimaux, positifs ou négatifs, en nombre quelconque. Construire une fonction qui extrait ces nombres et les mets dans deux tableaux (int et float).

Exemple : la fonction extractNumbers renseigne les tableaux (variables globales) entiers et decimaux (taille limitée à 10 ici mais ce n'est peut-être pas nécessaire). Elle sauve le nombre d'entiers et de décimaux trouvés dans les variables nbEntiers et nbDecimaux.

char message[] = "abc123def-456gh1.2345!*_()-9.8765yz";
int entiers [10] = {0};
floats decimaux[10] = {0};
byte nbEntiers;
byte nbDecimaux;
extractNumbers (message, strlen(message));

Qui veut s'y lancer ? L'objectif serait de respecter certains critères :

  • Fonction facile à comprendre
  • Fonction pas trop longue
  • Programmation "élégante" (je vous laisse décider de ce que ça veut dire)

On rajoute peut être une contrainte sur la taille Max des nombres ?

-> Des int32_t ou des double au sens Arduino Uno (4 octets)

Sinon faut gérer aussi le nombre de dépassement de représentation

Pas de souci, chacun le fait comme il l'entend : je n'ai pas forcément la connaissance permettant de bien border le problème. C'est le type d'application qui peut fournir cette réponse.
L'idée est bien sûr de fournir des fonctions qui soient utilisables par chacun lorsqu'on en a besoin. J'ai proposé celui-ci car je viens d'en faire un plus simple pour un membre du forum US, et j'ai vu que ce n'est pas forcément facile à faire. Mais on peut en avoir besoin si on veut parser des entrées clavier (console) ou des réponses html, ou autres( certains capteurs peuvent renvoyer ce genre de résultat).

Par contre, si on continue sur cet exercice, peut-être faudrait-il en faire un sujet autonome ?

A mon avis si on veux faire un concours, il faut être précis dans la spécification fonctionnelle. Savoir écrire ou savoir lire un cahier des charges c'est la base des compétences nécessaires pour un bon développeur.

Par exemple un nombre flottant peut être représenté en notation scientifique: 123.345e-12 ou un entier peut être gigantesque 123456789123456789123456789123456789123456789123456789123456789123456789123456789123456789. Que doit faire le code ?

Bien sûr ce genre de question s'est déjà posée il y a bien longtemps et l'approche standard en C ou C++ serait d'utiliser errno pour reporter une erreur ERANGE et de retourner le plus petit ou plus grand nombre représentable

de même l'approche standard pour la représentation d'un nombre serait de se rapprocher de ce que fait stdlib.h par exemple pour strtod() ou strtol()

leur définition de la lecture d'un nombre entier dans une certaine base est

The function first discards as many whitespace characters as necessary until the first non-whitespace character is found. Then, starting from this character, takes as many characters as possible that are valid following a syntax that depends on the base parameter, and interprets them as a numerical value. Finally, a pointer to the first character following the integer representation in str is stored in the object pointed by endptr.

If the value of base is zero, the syntax expected is similar to that of integer constants, which is formed by a succession of:
An optional sign character (+ or -)
An optional prefix indicating octal or hexadecimal base ("0" or "0x"/"0X" respectively)
A sequence of decimal digits (if no base prefix was specified) or either octal or hexadecimal digits if a specific prefix is present

If the base value is between 2 and 36, the format expected for the integral number is a succession of any of the valid digits and/or letters needed to represent integers of the specified radix (starting from '0' and up to 'z'/'Z' for radix 36). The sequence may optionally be preceded by a sign (either + or -) and, if base is 16, an optional "0x" or "0X" prefix.

If the first sequence of non-whitespace characters in str is not a valid integral number as defined above, or if no such sequence exists because either str is empty or it contains only whitespace characters, no conversion is performed.

de même pour un nombre décimal:

A valid floating point number for strtod using the "C" locale is formed by an optional sign character (+ or -), followed by a sequence of digits, optionally containing a decimal-point character (.), optionally followed by an exponent part (an e or E character followed by an optional sign and a sequence of digits).