Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

  1. #1
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 978
    Points : 11 366
    Points
    11 366

    Par défaut Erreurs de calcul de niveau élémentaire

    Bonsoir,

    dans un prog (trouvé je ne sais pas trop où, Codes-source je pense) que j'étudie en pas-à-pas parce que je ne comprends pas pourquoi il plante, j'arrive sur ce bloc, dans lequel les variables sont de type integer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    for m := -1 to 2 do
      ii := i_in + m;
    J'ai mis un point d'arrêt sur la ligne suivante, j'exécute et, une fois arrêté,
    je mets la souris sur m, l'infobulle me dit -1 puis
    je mets la souris sur i_in, l'infobulle me dit aussi -1 (c'est une variable qui vient de plus haut)
    Mais quand je mets la souris sur ii l'infobulle me dit 0 et là je tombe par terre (pendant que le programme plante)
    Comment faire pour avoir -2 ?

    L'unité a {$mode objfpc}{$H+}.

    +++
    Entre-temps, j'ai trouvé la réponse à ma question, il faut mettre des parenthèses partout, genre (ii) := (i_in) + (m); mais ça ne me rassure qu'à moitié car c'est un coup à se tromper, en oublier ou que sais-je.
    N'y aurait-il pas un flag disant au compilo de gérer ça correctement ?

    Car s'il faut passer en revue tous les codes qui sont stockés dans ma machine, ligne à ligne, une vie entière n'y suffira pas...
    Merci,

    EDIT :
    Tant pis, je vais passer pour le dernier des imbéciles, mais j'ai voulu en avoir le cœur net et dans un autre projet tout simple, j'ai mis un bouton et dans le bouton ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    procedure TForm1.Button2Click(Sender: TObject);
    var
      a,b,m: integer;
    begin
      b := -1;
      for m := -1 to 2 do begin
        a := b + m;
        ShowMessage(IntToStr(a)); // -2 -1 0 1
      end;
    end;
    En commentaire les résultats, corrects.

    Qu'est-ce qui peut bien clocher dans l'autre projet ?
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  2. #2
    Membre expert
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 602
    Points : 3 994
    Points
    3 994

    Par défaut

    hello,
    Jipété tu ne nous as pas dit avec quelle version de lazarus tu as ton problème ? Avec une version 1.8.2 je n'ai pas ton problème :

    Nom : Add_Jipete.gif
Affichages : 114
Taille : 23,0 Ko


    Ami calmant, J.P (sans T)
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  3. #3
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 978
    Points : 11 366
    Points
    11 366

    Par défaut

    Citation Envoyé par jurassic pork Voir le message
    hello,
    Jipété tu ne nous as pas dit avec quelle version de lazarus tu as ton problème ? Avec une version 1.8.2 je n'ai pas ton problème :
    Ami calmant, J.P (sans T)
    Ah coucou J.P, pendant que tu postais je faisais des tests, et j'ai bêtement édité le premier post, que je t'invite à relire et ou tu constateras que j'ai fait les mêmes tests que toi, avec le mêmes résultats que toi, donc ça ne doit pas être lié à ma vieille rougne de 1.4 (mais pour ce que je fais c'est suffisant), puisqu'avec mes 3 nouvelles petites lignes c'est bon...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  4. #4
    Membre expert
    Avatar de jurassic pork
    Homme Profil pro
    Bidouilleur
    Inscrit en
    décembre 2008
    Messages
    1 602
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Bidouilleur
    Secteur : Industrie

    Informations forums :
    Inscription : décembre 2008
    Messages : 1 602
    Points : 3 994
    Points
    3 994

    Par défaut

    c'est peut-être que sur ton premier exemple tu as un for sans begin end et que le debugger de ta version de Lazarus a un souci pour visualiser la ligne sous le for. L'opération n'a peut être pas été encore effectuée ou alors tu as fait un step into au lieu d'un step over.
    Jurassic computer : Sinclair ZX81 - Zilog Z80A à 3,25 MHz - RAM 1 Ko - ROM 8 Ko

  5. #5
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 978
    Points : 11 366
    Points
    11 366

    Par défaut

    Bonjour,

    Écoute, je ne sais pas quoi te dire : ce matin j'essaye de reproduire le problème et je n'y arrive pas...

    J'ai enlevé les parenthèses, j'ai mis le point d'arrêt sous les lignes suspectes et ce matin elles ne le sont plus, les valeurs sont bonnes.

    Nom : moinsdeux.png
Affichages : 106
Taille : 4,9 Ko

    Y a des jours où je me dis qu'il serait peut-être temps que je me recycle dans autre chose...

    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  6. #6
    Membre émérite
    Avatar de BeanzMaster
    Homme Profil pro
    Amateur Passionné
    Inscrit en
    septembre 2015
    Messages
    1 011
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Amateur Passionné
    Secteur : Tourisme - Loisirs

    Informations forums :
    Inscription : septembre 2015
    Messages : 1 011
    Points : 2 686
    Points
    2 686
    Billets dans le blog
    2

    Par défaut

    Salut

    J'ai déja eu ce genre de mésaventures. Cela vient souvent, qu'il est préférable d'initialiser les variables

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Procedure truc;
    var
      i,j : integer;
    begin
      i := 0;
      j := 0;
      .....
    Sans savoir pourquoi il y as des erreurs lors de l'initialisations des variables par le compilateur et qui se produisent anarchiquement. En plus pour éviter ce genre de tracasseries, pour les boucles For, while, et autres bloc de code, je les encadre systématiquement avec Begin et End. Le compilateur se tord moins les pattes et c'est plus facile pour le débogage.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    For i := -1 to 2 do
    begin
      For j:= -1 to 2 do
      begin
         ...
       end;
    end;
    A+
    • "L'Homme devrait mettre autant d'ardeur à simplifier sa vie qu'il met à la compliquer" - Henri Bergson
    • "Bien des livres auraient été plus clairs s'ils n'avaient pas voulu être si clairs" - Emmanuel Kant
    • "La simplicité est la sophistication suprême" - Léonard De Vinci
    • "Ce qui est facile à comprendre ou à faire pour toi, ne l'est pas forcément pour l'autre." - Mon pèrei

    Mes projets sur Github - Blog - Site DVP

  7. #7
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 978
    Points : 11 366
    Points
    11 366

    Par défaut

    Citation Envoyé par BeanzMaster Voir le message
    Sans savoir pourquoi il y a des erreurs lors de l'initialisation des variables par le compilateur et qui se produisent anarchiquement.
    Je hais l'informatique aléatoire Nom : furax.gif
Affichages : 79
Taille : 1,9 Ko
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

  8. #8
    Responsable Delphi

    Avatar de gvasseur58
    Homme Profil pro
    Cultivateur de code (bio)
    Inscrit en
    février 2013
    Messages
    1 383
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Cultivateur de code (bio)
    Secteur : Enseignement

    Informations forums :
    Inscription : février 2013
    Messages : 1 383
    Points : 19 598
    Points
    19 598
    Billets dans le blog
    84

    Par défaut

    Citation Envoyé par Jipété Voir le message
    Je hais l'informatique aléatoire Nom : furax.gif
Affichages : 79
Taille : 1,9 Ko
    Bonjour Jipété !

    Et tu n'es pas le seul, mais tu connais mon point de vue : il n'y a rien de magique en informatique (bis repetita placent)...

    Ton problème ne paraît pas lié au compilateur (encore que tu ne fournisses pas les résultats d'un log par exemple), mais au débogueur : c'est ce dernier qui semble repérer cette valeur farfelue, visiblement dans certaines circonstances seulement mal élucidées pour le moment (mais il y a une ou des raisons à ce comportement, tu peux en être certain !). Si cela provient malgré tout du compilateur, c'est qu'il y a, comme on te l'a suggéré, un problème d'initialisation de variables locales : comme elles ne sont jamais initialisées par défaut, il faut évidemment que la boucle for le fasse, et si elle ne le fait pas, c'est que le compilateur a un couac. Est-ce le cas ? Je n'en sais rien. En tout cas, ça fait deux pistes de recherche. De toute façon, le débogueur ou le compilateur (ou les deux) sont bogués => il faut les corriger ou en changer !

    Citation Envoyé par Jipété Voir le message
    donc ça ne doit pas être lié à ma vieille rougne de 1.4 (mais pour ce que je fais c'est suffisant)
    Je crois qu'il y a là (la partie mise en gras par moi) une confusion dommageable... La version 1.4 n'est pas seulement incomplète par rapport aux versions actuelles (1.8.4 et bientôt 2.0.0), mais elle est surtout pleine de bogues et accompagnée d'outils bogués eux aussi. Elle n'est donc en rien plus facile à utiliser que les versions plus récentes : en quoi serait-elle suffisante ? La confusion tient peut-être à la différence à faire entre complexe/simple et difficile/facile. Lazarus 1.4 est plus simple que Lazarus 1.8.4, mais il est beaucoup plus difficile à utiliser que Lazarus 1.8.4 par exemple. Dans un autre domaine : j'ai eu une 2CV dans ma jeunesse et je roule à présent en Peugeot 206. La conception de la 2V était infiniment plus simple que celle de la 206, mais elle était bien plus difficile à conduire. Autre domaine : E = mc² est une formule simple dans son énoncé, mais difficile à comprendre ! Tu vois ce que je veux dire ?

    Quant au donc, il me paraît très prématuré...

    @jurasic pork : avec quoi fais-tu tes gifs ? Ils sont très réussis !
    Accès à mon site et à mon blog. Actualités, cours et ressources Delphi, Lazarus et Pascal.
    Pensez à la balise - Quelqu'un vous a aidé ou vous appréciez une intervention ? Pensez au

  9. #9
    Expert éminent sénior
    Avatar de Jipété
    Profil pro
    Inscrit en
    juillet 2006
    Messages
    7 978
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : juillet 2006
    Messages : 7 978
    Points : 11 366
    Points
    11 366

    Par défaut

    Citation Envoyé par gvasseur58 Voir le message
    De toute façon, le débogueur ou le compilateur (ou les deux) sont bogués => il faut les corriger ou en changer !
    Quoi ? Mon gdb buggé ? OMG !

    Changer, dis-tu ?
    Bah, tu sais, tant que je ne verrai pas écrit dans les notes de version "Nous avons refait tout le graphisme, vous pouvez y aller", je ne suis pas prêt d'évoluer...

    Quand je pense que j'ai eu le malheur de tomber sur deux progs écrits en Delphi pour trifouiller les bitmaps, ben croyez-le si vous voulez mais après les avoir converti simplement, ça doit bien faire maintenant deux-trois semaines que je suis dessus à essayer de les faire fonctionner correctement et je ne vois aucunement le bout du tunnel...

    Faut dire aussi qu'en étant sous Linux, je pars avec un handicap sévère que les windowsiens ne peuvent même pas imaginer.

    Bon, je ne vais pas m'éterniser, je vous montre juste une petite liste de fichiers en 24 et 32 bits, pratiquement tous générés avec The Gimp, et voilà le résultat de leur affichage :
    il y a deux colonnes que j'ai utilisées pour noter le résultat d'un ShowMessage qui récupère l'information PixelFormat à deux endroits différents
    1- avec H je lis le BitmapInfoHeader du fichier
    2- avec B c'est l'info venant du Bitmap.PixelFormat
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
                                         H    B
      400x240x24_122-gimp_cubique.bmp   24   24  vrac
              400x240x24_54-Cubic.bmp   24   24  vrac
       400x240x24_54-xnview_cubic.bmp   24   24  vrac
           bonbons_640x500x24_122.bmp   24   24  vrac
        -Filename    : 196x128x24.bmp   24   24  vrac
        -Filename    : 196x128x32.bmp   32   24  vrac
      150x100x32_psp_xbr+1flou_54.bmp   32   32  ok
        -Filename    : 397x299x32.bmp   32   24  ok
        -Filename    : 397x299x24.bmp   24   24  ok
    Les noms de fichiers comportent 24 ou 32, indiquant le pixelformat du fichier, et quand vous lisez 54 ou 122 (pas pour tous), c'est la version du header (1 ou 4).

    Et "vrac" indique que l'affichage est en... vrac, bien sûr, genre traits verticaux (pb de scanline, classique).

    Un dernier mot : l'image ci-dessous vous montrera que je ne suis pas le seul à souffrir, le dernier Lazpaint aussi a des soucis avec un fichier qui paradoxalement s'affiche bien dans mon outil.

    Nom : lazpaint641_n_atool.png
Affichages : 41
Taille : 197,6 Ko

    Mon outil (dérivé d'une de mes deux trouvailles, trouvées ailleurs mais écrites par des gens dont j'ai déjà vu passer le pseudo dans le forum Delphi) qui n'est parfois pas fichu d'afficher un bête .bmp en pf24, et si je le recompile pour y arriver, alors c'est ceux qui s'ouvraient bien qui partent en vrac.
    Épuisant...

    Citation Envoyé par gvasseur58 Voir le message
    Dans un autre domaine : j'ai eu une 2CV dans ma jeunesse et je roule à présent en Peugeot 206. La conception de la 2CV était infiniment plus simple que celle de la 206, mais elle était bien plus difficile à conduire.
    Oui, mais qu'est-ce que c'était facile à dépanner, en cas de problème. Tout est toujours affaire de compromis...
    Il a à vivre sa vie comme ça et il est mûr sur ce mur se creusant la tête : peutêtre qu'il peut être sûr, etc.
    Oui, je milite pour l'orthographe et le respect du trait d'union à l'impératif.
    Après avoir posté, relisez-vous ! Et en cas d'erreur ou d'oubli, il existe un bouton « Modifier », à utiliser sans modération
    On a des lois pour protéger les remboursements aux faiseurs d’argent. On n’en a pas pour empêcher un être humain de mourir de misère.
    Mes 2 cts,
    --
    jp

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.0] Erreur de calcul numérique de .net o_O
    Par Smeuuh dans le forum Framework .NET
    Réponses: 8
    Dernier message: 11/11/2006, 17h04
  2. [Tableaux] erreur de calcul
    Par dleu dans le forum Fonctions
    Réponses: 18
    Dernier message: 08/12/2005, 13h28
  3. erreur sur calcul
    Par Sendo dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 09h46
  4. Rotation erreur de calcul
    Par Speed41 dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 09/03/2005, 16h55
  5. C++Builder fait une erreur de calcul
    Par gandf dans le forum C++Builder
    Réponses: 7
    Dernier message: 03/01/2004, 22h27

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo