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

Langage Perl Discussion :

Probleme: mauvais retour de fonction


Sujet :

Langage Perl

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 36
    Points
    36
    Par défaut Probleme: mauvais retour de fonction
    Salut à tous,

    C'est mon premier message sur ce forum... je suis super ému.
    Donc voilà, je ne suis pas expert en Perl, mais j'ai un truc qui me semble bizarre dans le code suivant.
    La fonction getChangelistDescribe doit retourner un tableau $describe. Lorsque j'affiche la 1ere valeur de ce tableau dans la fonction, j'obtiens bien une valeur cohérente:

    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
    sub getChangelistDescribe($$)
    {
    	my $self   = shift;
    	my $chg_no = shift;
    	
    	return if (!defined($chg_no));
    	
    	my $p4 = $self->P4Connect();
    	my $describe = $p4->Run("describe", $chg_no);	
    	print STDOUT "DESCR == @{$describe}[0]";
    	return 0 if (!$self->GetP4Errors($p4, "changelist"));	
    	$p4->Disconnect();
    		
    	return $describe;
    }
    Mais lorsque je demande d'afficher ce que retourne cette fonction, je n'obtiens rien ("DESCRIBE === " s'affiche):

    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
    sub insertReleaseNotes($$$)
    {
    	my $self       = shift;    
    	my $p4profile  = shift;
    	my $changelist = shift;
       
    	return if (!defined($p4profile) ||
    			   !defined($changelist));
    
    	foreach my $change (@{$changelist})
    	{
    		#For each changelist, get a description
    	my $describe = $p4profile->getChangelistDescribe($change);
    
    		my %infos;
    		# If the description exists
    		if (defined($describe))
    		{
    			print STDOUT "\n DESCRIBE === @{$describe}[0]";
    ...
    ...
    Quelqu'un voit il une erreur là-dedans ?
    Merci d'avance

    K.

  2. #2
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    oui : tu appelles getChangelistDescribe avec un seul argument, alors qu'elle est programmée pour sortir si elle n'a pas le second (change_no).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    J'ai remarqué cela également mais la fonction getChangelistDescribe va bien jusqu'au bout car j'arrive à afficher :
    print STDOUT "DESCR == @{$describe}[0]";

    Si j'afficher la valeur de la variable $chg_no, j'obtiens bien la valeur attendue... Donc le fait de ne passer qu'un seul argument à cette fonction ne semble pas poser de probleme.
    Comme je l'ai dit, je ne suis pas expert en Perl, mais il me semble qu'il n'est pas utile de préciser le $self lorsque l'on appelle une fonction, cela est fait implicitement. C'est pourquoi, lorsque j'appelle getChangelistDescribe, je ne passe qu'un seul argument.

    Merci pour ta réponse en tout cas.
    K.

  4. #4
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    je ne connais pas tes histoires de $self... quant à ton DESCR ==, il apparaît au moins à deux endroits dans ton code, ce n'est donc pas un test suffisant. On va voir ce qui se passe vraiment :
    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
    sub getChangelistDescribe($$)
    {
    print "entrée dans getChangelistDescribe\n" ;
    	my $self   = shift;
    	my $chg_no = shift;
    print "avec les arguments |$self| et |$chg_no|\n" ;	
    	return if (!defined($chg_no));
    print "chg_no est défini\n";	
    	my $p4 = $self->P4Connect();
    	my $describe = $p4->Run("describe", $chg_no);	
    print "getChangelistDescribe : DESCR == @{$describe}[0] \n"; 
    	return 0 if (!$self->GetP4Errors($p4, "changelist"));	
    # c'est normal de sortir avant le Disconnect ?
    	$p4->Disconnect();
    print "résultat obtenu : |$describe|\n";			
    	return $describe;
    }
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    Je ne peux pas faire ces tests pour le moment (je les ferai lundi) mais j'ai déjà fait ce genre de test. Je referai le test mais je peux déjà te dire ce que j'obtiendrai, mis à part pour le $self car je ne sais ce qu'elle doit retourner exactement. En tout cas, pour les 2 derniers print, j'aurai ca:

    "getChangelistDescribe : DESCR == commentaire au sujet de..." (j'obtiens ce que je veux.

    ET

    "résultat obtenu : |ARRAY(0xCFF023A2)|" (describe étant un tableau).

  6. #6
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    je suppose que tu veux dire que $describe est une référence à un tableau ?

    tu m'expliquerais ton histoire de $self ? (je n'ai encore jamais utilisé le prototypage des fonctions).
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  7. #7
    Membre éprouvé Avatar de MarneusCalgarXP
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    911
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 911
    Points : 1 118
    Points
    1 118
    Par défaut
    $self n'a rien à voir avec le prototypage, c'est un paramètre automatique rajouté en début de @_ pour les modules objets.

    Voir les explications ici :
    Perl Boot (beginners object oriented tutorial) traduit par enstimac
    Perl TooT (Tutoriel Orienté Objet de Tom) traduit par enstimac

    Je ne répond à aucune question technique par MP.

    Si votre problème est réglé, n'oubliez pas Dans tous les cas

  8. #8
    Rédacteur/Modérateur

    Avatar de Antoun
    Homme Profil pro
    Architecte décisionnel
    Inscrit en
    Octobre 2006
    Messages
    6 281
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Architecte décisionnel
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2006
    Messages : 6 281
    Points : 11 737
    Points
    11 737
    Par défaut
    bon, je n'ai jamais non plus fait d'OO en Perl

    en gros, ça implique que ce n'est pas exactement une fonction, mais plutôt une méthode d'un objet ? ce qui explique que Perl ne plante pas alors que le prototype n'est pas respecté ?
    Antoun
    Expert Essbase, BO, SQL

    La bible d'Essbase, 2ème édition

  9. #9
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Citation Envoyé par Antoun
    bon, je n'ai jamais non plus fait d'OO en Perl

    en gros, ça implique que ce n'est pas exactement une fonction, mais plutôt une méthode d'un objet ? ce qui explique que Perl ne plante pas alors que le prototype n'est pas respecté ?
    Le prototype est respecté ! Le paramètre est passé, implicitement certes mais il l'est !
    Si tu veux plus de renseignement, regarde la FAQ ou mon cours sur le sujet.

    Sinon, vous savez que perl est aussi un débugueur ? C'est plus simple que vos print dans tous les sens
    Renseignez vous sur l'option -d de perl.

    Sinon, tu peux nous dire ce que contientn le premier élement de @{$describe} ? Un tableau (ou plutôt une référence à un tableau) ?
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  10. #10
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    En le tableau $describe doit normalement contenir un commentaire sur plusieurs lignes du genre:
    " Change 5 by Kururin2@Mathieu1 on 2006/02/12 22:04:27
    Correction d'un bug

    Affected files: file1.txt
    ...
    ...
    "

    Donc lorsque j'affiche @{$describe}[0] dans la fonction getChangelistDescribe j'obtient bien la premiere ligne (Change 5.....).

    Mais lorsque je veux afficher la meme chose en sortie de fonction, @{$describe}[0] est vide

    J'avoue être un peu perdu...

    Merci de votre aide

  11. #11
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Si la première ligne de ton tableau @$describe est une chaîne de caractère (donc un scalaire), je ne comprend pas trop pourquoi tu écrits @{$describe}[0] ...
    Ca ne serait pas plutôt $describe->[0] que tu veux afficher en réalité ?


    Est-ce que tu compiles/exécutes avec l'option -w qui active les warnings ?
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

  12. #12
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 63
    Points : 36
    Points
    36
    Par défaut
    Je viens d'essayer avec $describe->[0], je n'obtiens pas plus de résultat malheureusement. Cette chaine est toujours vide

  13. #13
    Membre chevronné
    Avatar de Woufeil
    Profil pro
    Étudiant
    Inscrit en
    Février 2006
    Messages
    1 076
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Points : 2 004
    Points
    2 004
    Par défaut
    Essaye de rajouter use warnings; au début de ton code et dit nous ce que ça donne
    "En essayant continuellement, on finit par réussir. Donc : plus ça rate, plus on a de chances que ça marche" (devise Shadock)
    Application :

    ainsi qu'à regarder la avant de poser une question.

    La rubrique Perl recrute, contactez-moi.

Discussions similaires

  1. Probleme valeur retour fonction
    Par punkydev dans le forum x86 32-bits / 64-bits
    Réponses: 33
    Dernier message: 07/05/2015, 20h20
  2. Réponses: 6
    Dernier message: 16/01/2011, 15h33
  3. Mauvais retour de fonction
    Par scary dans le forum Débuter
    Réponses: 7
    Dernier message: 22/02/2009, 18h40
  4. Probleme de retour avec les fonctions
    Par yorukaze dans le forum Tkinter
    Réponses: 9
    Dernier message: 04/02/2008, 08h49
  5. Réponses: 11
    Dernier message: 07/01/2008, 19h47

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