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

MATLAB Discussion :

Lancer une boucle pour repérer une erreur


Sujet :

MATLAB

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut Lancer une boucle pour repérer une erreur
    Bonjour à tous,
    dans le cadre d'un stage de M2 recherche je dois traiter un Modèle Numérique de Terrain présentant les directions d'écoulements des flux (en 8 directions posssibles N(3) NE(2) E(1) SE(8) S(7) SW(6) W(5) NW(4), donc souvent appelé fichierD8) et la fonction utlisée pour cela fonctionne de pixel à pixel (=valeur matrice vers valeur voisine), en répétant par boucle if/else afin de déterminer quelle direction prendre (entre 1 et 8). Le souci c'est que la fonction m'affiche rapidement une erreur très probablement due à une mauvaise valeur dans ma grille. J'aimerais lancer une boucle de vérification juste à l'amont de l'étape d'itération sur mes valeurs afin de savoir à quel moment précisément (quelle itération) ça crash.
    J'espère avoir été assez clair, et surtout me lancer dans quelque chose pouvant être résolu. Mon idée est elle jouable et si oui comment ?

  2. #2
    Invité
    Invité(e)
    Par défaut
    Bonjour,

    Je n'ai pas très bien compris ton principe de 'boucle de vérification', mais pourquoi ne pas afficher les itérations comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    for i = 1:N
        disp(i)
        % traitement
    end
    [EDIT] Une autre solution avec try/catch
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for i = 1:N
       try
           %traitement
       catch
           disp(i)
       end
    end

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 640
    Points : 776
    Points
    776
    Par défaut
    Salut,

    la description du problème n'est pas très clair... Toutefois, si tu as une erreur lors de l'execution de ta fonction, Matlab doit te renvoyer le numéro de la ligne où l'erreur se produit.
    Il te suffit d'aller dans cette fonction et d'utiliser le debugger en mettant une pastille sur la ligne qui plante. Pastille rouge... Relance ton programme. Il devrait s'arrêter sur la pastille. tu auras alors accès à toutes les variables en l'état de ta fonction donc notamment l'indice de boucle qui plante.

    edit : l'importance des mots ^_^, on n'a pas le même raisonnement avec win. Tu as des résultats éronnées en sortie de function (donc il n'y a pas d'erreur de syntaxe) ou tu as une erreur matlab...

  4. #4
    Membre habitué
    Homme Profil pro
    Ingénieur opto-électronique
    Inscrit en
    Avril 2010
    Messages
    129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur opto-électronique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Avril 2010
    Messages : 129
    Points : 157
    Points
    157
    Par défaut
    Ce que je ferais, c'est d'ajouter une ligne dans ta boucle disant "j'en suis à l'étape i". (avec un fprintf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf('J'en suis à la ligne %i',i)
    ). Tu lances ton programme et tu n'as plus qu'à regarder la dernière ligne annoncée.

    Après si tu veux que le débugger t'arrête juste avant le plantage : si ton code plante à la 23eme iteration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if i==23 disp('ça va planter'); end;
    et place le stop sur la ligne 'ça va planter'

  5. #5
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2011
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2011
    Messages : 8
    Points : 3
    Points
    3
    Par défaut
    Merci à vous, je m'y attèle. Désolé pour le manque de clarté, je vais essayer d'éclairer mes propos si la situation évolue

  6. #6
    Expert confirmé
    Avatar de duf42
    Homme Profil pro
    Formateur en informatique
    Inscrit en
    Novembre 2007
    Messages
    3 111
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Formateur en informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2007
    Messages : 3 111
    Points : 4 661
    Points
    4 661
    Par défaut
    Citation Envoyé par Myrne Voir le message
    Ce que je ferais, c'est d'ajouter une ligne dans ta boucle disant "j'en suis à l'étape i". (avec un fprintf:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fprintf('J'en suis à la ligne %i',i)
    ). Tu lances ton programme et tu n'as plus qu'à regarder la dernière ligne annoncée.

    Après si tu veux que le débugger t'arrête juste avant le plantage : si ton code plante à la 23eme iteration:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if i==23 disp('ça va planter'); end;
    et place le stop sur la ligne 'ça va planter'
    Il n'est pas nécessaire de rajouter du code pour debugger ce genre de problème, il y a 2 solutions: utiliser les points d'arrêt conditionnels (clic droit sur un point d'arrêt et Set condition) ou aller dans le menu Debug/Stop if error/warning et régler la propriété pour que le code s'arrête si une erreur apparait.
    Simulink & Embedded Coder

    Au boulot : Windows 7 , MATLAB r2016b
    A la maison : ArchLinux mais pas MATLAB

Discussions similaires

  1. Lien dans un frame d'une cadre pour ouvrir une autre page sur une même fenêtre
    Par maelislah dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 27/06/2015, 20h39
  2. [PDO] Une boucle while dans une boucle while
    Par subran dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 28/02/2015, 19h32
  3. Réponses: 6
    Dernier message: 18/02/2014, 20h39
  4. Une boucle pour faire une repetition infini
    Par saibri dans le forum jQuery
    Réponses: 1
    Dernier message: 11/11/2011, 12h24
  5. [XL-2003] Besoin d'aide pour faire une boucle loop sur une macro
    Par spacesheep dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 14/04/2010, 11h42

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