IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

C++Builder Discussion :

vérification des erreurs d'un code C++


Sujet :

C++Builder

  1. #1
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut vérification des erreurs d'un code C++
    Bonjour tous le monde; j'ai un petit code en Matlab extrait d'un programme de segmentation d'image par le modèle de Ron Kimmel)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    % 'Roughly' correct Phi to be a distance map of its zero set
    function u=redistance(Phi);
    u=(sign(Phi)+1)*999999; % set to infinity all positive
    for i=1:2,
        l2=2;
        if i>1 
            u=(1-sign(Phi))*999999; 
        end % set to infinity all negative
        while l2>1,
              v=Update(u,1);
              l2=sum(sum((u-v).^2));
              u=v;;
        end % while
        if i>1 
           u=u-up; 
       else 
           up=u; 
     
       end % if
    end % for
    %-----------------------------------------------------------------------------------------------
    %Solve |grad u|=F(x,y)  parallel version of the FMM
    function res=Update(u,F)
    mx=min(u([2:end end],:), u([1 1:end-1],:));
    my= min(u(:,[2:end end]), u(:,[1 1:end-1]));
    delm=(mx-my);
    mask=(abs(delm)<F);
    res=min(mask.*(mx+my+sqrt(2.*F.^2-delm.^2))./2+...
       (1-mask).*(min(mx,my)+F),u);
    tel que "phi" une matrice carré quelconque.

    j'ai essayer de convertir ce code en C++ Builder (manuellement), mais je ne sais pas si je suis juste ou non, alors s'il y a quelqu'un qui peuvent m'aider je le remercie d'avance.

    voici le code que j'ai écrit:

    pour la fonction "redistance"

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    void __fastcall  TForm1::redistance(float **phi, int H, int W)
     
    {
     
    float**up=new float*[H];  // la heuteur de l'image
    for(int i=0;i<H;i++)
      {
       up[i]=new float[W];   // la largeur de l'image
      }
     
    float**v=new float*[H];
    for(int i=0;i<H;i++)
      {
       v[i]=new float[W];
      }
     
    float l2, l22;
     
    for (int i=0;i<H;i++)
        for (int j=0;j<W;j++)
           {
            phi[i][j]=(fctsign(phi[i][j])+1)*999999; // fixé le tous positif
           }
     
            for (int z=1;z<3;z++)
               { 
                l2=2;
                if (z>1)
                  {
                   for (int i=0;i<H;i++)
                   for (int j=0;j<W;j++)
                      {
                   phi[i][j]=(1-fctsign(phi[i][j]))*999999; //fixé le tous négative
                      }
                  }   // end if
                    while (l2>1)
                        {
                        Updt(phi,v,H,W); // fonction update
                         l22=0;
                        for (int i=1;i<H-1;i++)
                          for (int j=1;j<W-1;j++)
                             {
                             l22=l22+pow((phi[i][j]-v[i][j]),2);
                             }
                        l2=l22;
                        for (int i=1;i<H-1;i++)
                        for (int j=1;j<W-1;j++)
                           {
                            phi[i][j]=v[i][j];
                           }
                        } // end while 
     
                    if (z>1)
                      {
                       for (int i=0;i<H;i++)
                       for (int j=0;j<W;j++)
                           {
                           phi[i][j]=phi[i][j]-up[i][j];
                           }
                       }
                    else
                        {
                         for (int i=0;i<H;i++)
                         for (int j=0;j<W;j++)
                            {
                             up[i][j]=phi[i][j];
                            }
                         }
     
                   }// end for z
     
     
    for (int i=0;i<H;i++)
       delete[]up[i];
       delete[]up;
     
    for (int i=0;i<H;i++)
       delete[]v[i];
       delete[]v;
     
     }
    et pour la fonction "Update ":

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    void __fastcall  TForm1::Updt(float **u,float **v, int H, int W)
     
    {
     
     float mx,my,diff,minimum;
     
    //Résoudre l'équation |grad u|=F(x,y)
     
    //  déclaration de la matrice mask
    float**mask=new float*[H];
    for(int i=0;i<H;i++)
       {
        mask[i]=new float[W];
       }
     
    // déclaration de  la matrice produit
    float**produit=new float*[H];
    for(int i=0;i<H;i++)
       {
        produit[i]=new float[W];
       }
     
    for (int i=1;i<H-1;i++)
      for (int j=1;j<W-1;j++)
         {
         my=min(u[i][j+1],u[i][j-1]);
         mx=min(u[i+1][j],u[i-1][j]);
         minimum=min(mx,my);
         diff=mx-my;
     
         if (abs(diff)<1) // abs(mx-my)<1
           {
            mask[i][j]=1;
            produit[i][j]=mask[i][j]*((mx+my+sqrt(2-(diff*diff)))/(2+((1-mask[i][j])*(minimum+1))));
           }
         else
             {
              mask[i][j]=0;
              produit[i][j]=0;
             }
         }
     
    for (int i=1;i<H-1;i++)
       for (int j=1;j<W-1;j++)
          {
           v[i][j]=min(produit[i][j],u[i][j]);
          }
     
    // Libération de mémoire
     
    for(int i=0;i<H;i++)
       delete[]mask[i];
       delete[]mask;
     
    for(int i=0;i<H;i++)
       delete[]produit[i];
       delete[]produit;
    }
    et s'il y a des fautes merci de bien les signalées.

  2. #2
    Membre expert
    Avatar de Sunchaser
    Homme Profil pro
    OPNI (Objet Programmant Non Identifié)
    Inscrit en
    Décembre 2004
    Messages
    2 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : OPNI (Objet Programmant Non Identifié)
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 059
    Points : 3 204
    Points
    3 204
    Par défaut
    Citation Envoyé par nadjib2007 Voir le message
    et s'il y a des fautes merci de bien les signalées.
    Bonsoir,

    Ben, pour commencer -> ' signalées '
    Cela s'écrit -> ' signaler '

    Voili ... et d'une.



    Lol, désolé, pour le reste, je ne connais pas.

    Aux persévérants aucune route n'est interdite.
    Celui qui ne sait pas se contenter de peu ne sera jamais content de rien.
    Current Status
    Avec 40% de pollinisateurs invertébrés menacés d'extinction selon les Nations Unies, l'homme risque fort de passer de la monoculture à la mono diète...
    Faîtes quelque chose de bien avec vos petits sous: Enfants du Mekong

  3. #3
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    lol...je crois que j'ai poster mon sujet dans le forum de C++ Builder et non pas dans "lecture et écriture"...

    Merci pour la remarque j'ai pas fait attention.

  4. #4
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Salut, j'ai une question qui peut paraitre un peu stupide, est-ce que tu as essayer de mettre des valeurs dans ta fonctions BCB et de comparer les résultats avec ta fonction MatLab? Si les résultats sont les mêmes il y a des chances que tu as fais un bon travail et sa évite aux membres du forum de faire la validation
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  5. #5
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Merci pour la réponse j'ai u cette aider mais comment je pourrais faire ca?!

    pour mettre des valeurs c'est facile mais comment je peut avoir le résultat à la fin, car je doit trouver une matrice !!

    Merci encore une fois

  6. #6
    Membre chevronné
    Avatar de Crayon
    Inscrit en
    Avril 2005
    Messages
    1 811
    Détails du profil
    Informations personnelles :
    Localisation : Autre

    Informations forums :
    Inscription : Avril 2005
    Messages : 1 811
    Points : 2 189
    Points
    2 189
    Par défaut
    Si c'est une matrice 2D tu peux la mettre dans un tableau, sinon tu peux faire la sommes de tout les éléments de la matrice et comparer le résultat. Utilises ton imagination, tu devrais trouver une solution.
    • Plus un ordinateur possède de RAM, plus vite il peut générer un message d'erreur. - Dave Barry
    • Je n'ai pas peur des ordinateurs. J'ai peur qu'ils viennent à nous manquer. - Isaac Asimov
    • Le code source est comme une belle femme, plus on le regarde, plus on trouve des défauts. - Crayon

  7. #7
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    ok je vais essayer ça manuellement ( stylo et papier) et je vous répond ....thnx

  8. #8
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Tu pourrais utiliser un TStringGrid pour afficher tes valeurs.
    A noter que chaque cellule est du type AnsiString (chaîne de caractères).
    Donc pour afficher une valeur numérique du type float (ou double) il te faudra faire une conversion (numérique -> littéral) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    StringGrid1->Cells[x][y] = FloatToStr(Une_de_tes_valeurs);
    A plus !

  9. #9
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup " modérateur ", c'est ça qu'on appel => gagner du temps .

  10. #10
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Tu passe en mode debug et tu testes sur une petite matrice.
    Tu met un point d'arret a la fin de ton algorithme et tu regardes le contenu de ta matrice...ou alors tu sors tout sur une console, ou ou ou....

    Ne connaissant pas bien Matlab je ne m'avancerais pas sur l'exactitude de ta traduction.
    Neilos

  11. #11
    Membre chevronné

    Profil pro
    Inscrit en
    Juin 2002
    Messages
    1 374
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 1 374
    Points : 1 759
    Points
    1 759
    Par défaut
    Salut !

    Citation Envoyé par nadjib2007 Voir le message
    Merci beaucoup " modérateur ", c'est ça qu'on appel => gagner du temps .
    Oui parce que tu te sers de BCB pour vérifier ce qu'il fait (en fait ce que fait ton code) ! Dès que la vérification est faite (comme le dit Neilos avec une matrice de taille réduite comportant des valeurs telles que le résultat soit conforme à ceux attendus), il ne te reste plus qu'à virer le TStringGrid et passer à la suite !

    On gagne aussi beaucoup de temps à étudier ce que BCB nous offre !

    A plus !

  12. #12
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Merci beaucoup les amis j'ai réussi a trouver l'erreur c'était dans les parenthèses

    Merci encore une fois du fond du coeur..

  13. #13
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Un ptit tag alors ?
    Neilos

  14. #14
    Membre à l'essai
    Inscrit en
    Juin 2007
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Juin 2007
    Messages : 52
    Points : 24
    Points
    24
    Par défaut
    Résolu....! Ouiii bien sur avec plaisir; et s'il y a un bouton "résultat satisfaisante" je le préfère..

  15. #15
    Membre éprouvé

    Profil pro
    Inscrit en
    Octobre 2003
    Messages
    1 163
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France

    Informations forums :
    Inscription : Octobre 2003
    Messages : 1 163
    Points : 1 148
    Points
    1 148
    Par défaut
    Merci beaucoup et à bientôt sur le forum.
    Neilos

  16. #16
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 614
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 614
    Points : 30 626
    Points
    30 626
    Par défaut
    Salut,

    Juste une petite remarque au passage...

    Sais tu qu'il n'y a rien de plus proche, du point de vue de l'utilisation de la mémoire, du moins, d'un tableau à deux dimensions... qu'un seul tableau contenant (dim1*dim2) éléments

    La seule chose, c'est qu'au lieu d'accéder aux éléments via
    on y accède avec la formule
    ...

    Mais cela ouvre un max de possibilités...

    D'abord, tu peux envisager de travailler avec un pointeur, au lieu d'avec... un pointeur de pointeur

    Ensuite, cela te permet de faire l'allocation de mémoire d'une seule traite
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    float* tab=new float[imax*jmax];//ou imax est le nombre de lignes et jmax le nombre de colones
    Evidemment, ce qui est vrai pour l'allocation est vrai pour la libération
    Enfin, cela peut t'ouvrir des horizons, telles que, par exemple, utiliser les conteneurs de la STL (les vector, par exemple)...

    Cela n'a l'air de rien, mais cela te libère de l'obligation de gérer la mémoire (allocation/libération), d'autant plus que, tel que tu le fait là, c'est pas sécurisant (que se passerait-il si le système tombait à court de mémoire pour allouer les W derniers float)

    Maintenant, ce que j'en dis, ce n'est que pour écarter un risque de "plantage" qui, d'après la loi de Murphy, apparaîtra le jour de la grande démonstration
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

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

Discussions similaires

  1. [Débutant] vérification des erreurs de code
    Par VirtualSlide dans le forum MATLAB
    Réponses: 3
    Dernier message: 06/07/2013, 18h10
  2. Strtol - Vérification des erreurs ?
    Par Bktero dans le forum C
    Réponses: 7
    Dernier message: 23/11/2010, 21h52
  3. vérification des erreurs
    Par oprian dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 01/12/2007, 14h52
  4. [VBA-E] vérification des erreurs d'arrière plan
    Par WagaSeb dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 12/02/2007, 13h41
  5. Réponses: 22
    Dernier message: 28/01/2007, 21h00

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