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 :

Je reviens dans la fonction appelante alors que je n'ai pas terminé la fonction appel


Sujet :

C

  1. #1
    Membre éprouvé
    Avatar de beegees
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mars 2004
    Messages
    3 610
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2004
    Messages : 3 610
    Points : 1 277
    Points
    1 277
    Par défaut Je reviens dans la fonction appelante alors que je n'ai pas terminé la fonction appel
    Bonjour tout le monde,

    J'ai un problème que je n'arrive pas à réparer.

    J'appelle cette fonction :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    TraiterOenologue(Tab,Vin,Doc,VinTrouve);
    Je lui envoie donc une structure (Tab) un Vin, un document (xml) et un nom de vin que j'ai trouvé.

    Á un certain moment, je vais comparer le nom du vin envoyé à la fonction TraiterOenologie avec le nom d'un vin trouvé dans mon fichier xml.

    Ce qu'il devrait faire si le nom envoyé à la fonction n'est pas exactement le même que celui trouvé dans le fichier xml, s'est de revenir sur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    char* VinTrouve = NULL;
    et refaire ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    for (nA=0; (nA < Doc.Attributs.Nombre) && (Doc.Attributs.Tableau[nA].IndiceElement < nE3); nA++);
    for (; (nA < Doc.Attributs.Nombre) && (Doc.Attributs.Tableau[nA].IndiceElement == nE3); nA++)
    {
    								TXmlAttribut& A = Doc.Attributs.Tableau[nA];
    								if (strcmp(A.Nom,"nom_du_vin") == 0) VinTrouve = A.Valeur;
    								else if(strcmp(A.Nom,"appreciation")==0) AppreciationAAjouter = A.Valeur;
    }
    Le problème est qu'il revient ici :

    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
    					for (nE3=nE2+1; (nE3 < Doc.Elements.Nombre) && (Doc.Elements.Tableau[nE3].IndiceParent >= nE2); nE3++)
    						{
    							TXmlElement& E3 = Doc.Elements.Tableau[nE3];
    							if ( (E3.IndiceParent == nE2) && (strcmp(E3.Nom,"vin") == 0) )
    							{
    								char* VinTrouve = NULL;
    								//!!!!Attention!!!! le prix est un char* qui transformera ensuite en double avec un atol
    								char* PrixVin = 0;
    								for (nA=0; (nA < Doc.Attributs.Nombre) && (Doc.Attributs.Tableau[nA].IndiceElement < nE3); nA++);
    								//il va revenir à chaque fois ici jusqu'à temps que nA soit inférieur à Doc.Attributs.Nombre
    								for (; (nA < Doc.Attributs.Nombre) && (Doc.Attributs.Tableau[nA].IndiceElement == nE3); nA++)
    {
    									TXmlAttribut& A = Doc.Attributs.Tableau[nA];
    									if (strcmp(A.Nom,"nom") == 0) VinTrouve = A.Valeur;
    									else if (strcmp(A.Nom,"prix_bouteille")==0)PrixVin = A.Valeur ;
    }
    								//je dois ajouter dans la "fiche" d'un vin son nom et son prix je
    								//vais donc envoyer ses deux infos + le tableau des vins à la fonction d'ajout
    								if ( (VinTrouve != NULL) && (PrixVin != NULL));
     
    									if (TabVin_Ajouter(Tab,VinTrouve,atof(PrixVin)))
    									{
    										TVin& Vin = Tab.Tableau[TabVins_Rechercher(Tab,VinTrouve)];
    							//j'appelle une fonction nommée TraiterVin et je lui passe 3 paramètres
    										TraiterOenologue(Tab,Vin,Doc,VinTrouve);
    									}
     
     
    							}
    						}
    					}
    				}
    	}	}
    et il ajoute donc un nouveau nom à la structure car TraiterOenologue(Tab,Vin,Doc,VinTrouve); appartient à un if qui contient ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    if (TabVin_Ajouter(Tab,VinTrouve,atof(PrixVin)))
    									{
    										TVin& Vin = Tab.Tableau[TabVins_Rechercher(Tab,VinTrouve)];
    										//j'appelle une fonction nommée TraiterVin et je lui passe 3 paramètres
    										TraiterOenologue(Tab,Vin,Doc,VinTrouve);
    									}
    Sauriez-vous me dire comment je dois faire ?

    Je vous en remercie d'avance.

    beegees

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 66
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Points : 17 916
    Points
    17 916
    Billets dans le blog
    2
    Par défaut
    plusieurs choses..

    D'abord ton indentation... Rends ton code lisible stp..

    Secondo, quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	TXmlAttribut& A = Doc.Attributs.Tableau[nA];
    J'espère que tu te rends compte que cette écriture n'a aucun sens....

    Si tu veux l'adresse d'un TXmlAttribut, la déclaration serait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	TXmlAttribut *A = Doc.Attributs.Tableau[nA];
    si Tableau[i] est un pointeur vers un TXmlAttribut, ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	TXmlAttribut *A = &Doc.Attributs.Tableau[nA];
    Si Tableau[i] est un TXmlAttibut...



    D'autre part, quand tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	if (strcmp(A.Nom,"nom_du_vin") == 0) VinTrouve = A.Valeur;
    suivant les lignes au dessus, bien entendu à ce coimpte la ce serait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	if (strcmp(A->Nom,"nom_du_vin") == 0) VinTrouve = A->Valeur;
    Et enfin il serait bon que si tu le trouves tu mettes une variable pour pouvoir sortir des boucles...

    Du style :

    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
    int Trouve=0 ;
    
    for ( .... )
       {
           for ( ..... )
             {
                  for ( .... )
                     {
                          if ( strcmp (......) == 0 )
                             {
                                 .....
                                 Trouve = 1 ;
                                 break ;
     
                            }
                     }
    
                 if ( Trouve )
                      break ;
              }
    
          if ( Trouve )
             break ;
      }

  3. #3
    Rédacteur
    Avatar de Vincent Rogier
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 373
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 373
    Points : 5 306
    Points
    5 306
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XmlAttribut& A = Doc.Attributs.Tableau[nA];
    C'est du C++ pas du C car cela ne pourrait pas compiler en C

  4. #4
    Expert éminent sénior
    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
    Points : 13 926
    Points
    13 926
    Par défaut
    Notre ami beegees fait un cocktail C /C+ mais préfère le forum C. Chacun a ses petites manies

    beegees : Cette manière de faire n'est malgré tout pas saine à terme et finira par te causer préjudice. Il te faut choisir, pour un programme, si tu préfères l'écrire en C ou en C++. Ecris-le comme un beau programme C ou un beau programme C++, pas comme un hybride bancal.

Discussions similaires

  1. Une seule ligne dans output après tMap alors que plus attendus
    Par spopoff dans le forum Développement de jobs
    Réponses: 7
    Dernier message: 07/06/2013, 10h06
  2. [PHP 4] résultat en retour de ma fonction vide alors que ..
    Par erox44 dans le forum Langage
    Réponses: 1
    Dernier message: 11/05/2012, 15h22
  3. Réponses: 8
    Dernier message: 09/07/2010, 16h02
  4. [AC-2002] Me.OpenArgs Null alors que ce n'est pas vrai
    Par jaffael dans le forum VBA Access
    Réponses: 3
    Dernier message: 08/06/2009, 17h32
  5. le code entre dans un If alors que cela ne devrai pas être le cas
    Par Zorgloub dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 28/02/2008, 12h07

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