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 Discussion :

[C][Gestion d'erreur], remplacer Goto par une fonction ?


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Profil pro
    Inscrit en
    Juin 2011
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2011
    Messages : 1
    Par défaut [C][Gestion d'erreur], remplacer Goto par une fonction ?
    Bonjour,

    Je me balade assez souvent sur le site pour trouver des solutions à mes divers problèmes de programmation (surtout en C++ en fait) Mais j'avoue que là, bien que j'ai trouvé 2 ou 3 pistes, je n'arrive pas à faire ce que je voudrais et devrais faire... j'ai une super gestion d'erreur, sauf que celle-ci passe par un "goto", ce qui, dans ma section, nous est interdit du à la rupture de séquence... du coup j'ai essayé de remplacer cette gestion d'erreur par une fonction, mais, je sais pas pourquoi, j'arrive pas à trouver comment faire, ça change ma logique, ou ça appelle des fonctions qui ne me viennent pas à l'esprit... j'en sais rien. Si vous avez des idées elles sont les bienvenues...
    Voici mon extrait de code le plus simple (j'ai une bonne vingtaine de sources dans le même genre si ça vous intéresse , il faut que je les corriges tous...).

    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
    #include <stdio.h>
    #include <NIDAQmx.h>
     
    #define DAQmxErrChk(functionCall) if( DAQmxFailed(error=(functionCall)) ) goto Error; else
     
    int main(void)
    {
        int32       error=0;
        TaskHandle  taskHandle=0;
        int32       read;
        float64     data[10];
        char        errBuff[2048]={'\0'};
        int         i=0;
     
        /*********************************************/
        // DAQmx Configure Code
        /*********************************************/
        DAQmxErrChk (DAQmxCreateTask("",&taskHandle));
        DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev3/ai1","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
        DAQmxErrChk (DAQmxCfgSampClkTiming(taskHandle,"",10,DAQmx_Val_Rising,DAQmx_Val_FiniteSamps,10));
     
        /*********************************************/
        // DAQmx Start Code
        /*********************************************/
        DAQmxErrChk (DAQmxStartTask(taskHandle));
     
        /*********************************************/
        // DAQmx Read Code
        /*********************************************/
        DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,10,10.0,DAQmx_Val_GroupByChannel,data,10,&read,NULL));
     
        printf("Acquired %d points\n",read);
     
        for(i=0;i<10;i++)
        {
            printf("TEST %f points\n", data[i]);
        };
     
    Error:
        if( DAQmxFailed(error) )
            DAQmxGetExtendedErrorInfo(errBuff,2048);
        if( taskHandle!=0 )  {
            /*********************************************/
            // DAQmx Stop Code
            /*********************************************/
            DAQmxStopTask(taskHandle);
            DAQmxClearTask(taskHandle);
        }
        if( DAQmxFailed(error) )
            printf("DAQmx Error: %s\n",errBuff);
        printf("End of program, press Enter key to quit\n");
        getchar();
        return 0;
    }
    Donc vous l'aurez compris, à chaque ligne je test ce que me renvoie la fonction, et je trouverai idiot de recopier entièrement tout mon code de gestion d'erreur à chaque ligne...
    Merci d'avance !
    (j'espère que je passerai pas trop pour un idiot, mais ça fait 4jours et nuits que je code non-stop, je commence à saturer... je passe à coté de trucs évident à la longue... )

  2. #2
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    Peut être de cette façon :
    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
    #define DAQmxErrChk(functionCall) error ? error : DAQmxFailed(functionCall) 
     
    ....
    error = DAQmxErrChk (DAQmxCreateTask("",&taskHandle)) ;
    error = DAQmxErrChk (DAQmxCreateAIVoltageChan(taskHandle,"Dev3/ai1","",DAQmx_Val_Cfg_Default,-10.0,10.0,DAQmx_Val_Volts,NULL));
    ....
    error = DAQmxErrChk (DAQmxReadAnalogF64(taskHandle,10,10.0,DAQmx_Val_GroupByChannel,data,10,&read,NULL));
    if(!error)
    {
        printf("Acquired %d points\n",read);   
        for(i=0;i<10;i++)printf("TEST %f points\n", data[i]);
    }
    else
    {
      DAQmxGetExtendedErrorInfo(errBuff,2048);
      printf("DAQmx Error: %s\n",errBuff);
    }
    if( taskHandle!=0 )
    {
      DAQmxStopTask(taskHandle);
      DAQmxClearTask(taskHandle);
    }
    printf("End of program, press Enter key to quit\n");
    ....
    le error = en dehors de la macro permet de voir clairement qui modifie cette variable.

  3. #3
    Inactif  
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    123
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2002
    Messages : 123
    Par défaut the best solution
    Eh, bien elle n'est pas de moi
    mais elle vient du C : une variable globale que tu crée toi-même, appelle là comme tu veux. Celle du C s'appelle errno.
    Après tu peux déclarer une MACRO du genre:
    #define CHECKIFNOERROR() (if (noerror) ...)
    C'est à creuser

Discussions similaires

  1. Probleme pour remplacer une goto par une getURL!
    Par romeoverso dans le forum Flash
    Réponses: 2
    Dernier message: 16/04/2008, 06h16
  2. Probleme pour remplacer une goto par une getURL!
    Par romeoverso dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 15/04/2008, 09h38
  3. SELECT / Remplacer le "." par une ","
    Par cluis dans le forum Requêtes
    Réponses: 2
    Dernier message: 27/09/2006, 15h31
  4. Remplacer Dlookup par une requete SQL
    Par nbouseem dans le forum IHM
    Réponses: 9
    Dernier message: 09/06/2006, 16h45
  5. gestion d'erreur resume next sur une portion de code
    Par aarlock dans le forum Access
    Réponses: 2
    Dernier message: 02/06/2006, 15h28

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