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 :

Référencement / déréférencement, tableaux et fonctions


Sujet :

Langage Perl

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut Référencement / déréférencement, tableaux et fonctions
    Salut à tous,

    J'ai une fonction auquel je passe plusieurs tableaux et une variable et qui me retourne plusieurs tableaux et une variable.
    Pour se faire, je référence et déréférence mes tableaux. La fonction appelé me permet de modifier les tableaux (enfin ça dépend) et de renvoyé cette modification ... le seul problème c'est que ca marche pas

    Voilà le bout de code qui lance la fonction (qui est lui même dans une fonction) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    my $exit;
    		my $aid_name_mod;
    		my $aid_mod;
    		my $encoder_quality_mod;
    		my $encoder_mod;
    		($aid_name_mod, $aid_mod, $encoder_quality_mod, $encoder_mod, $exit) = (&AUDIO_MENU(\@aid_name, \@aid, \@encoder_quality, \@encoder, "file"));
    		my @aid_mod = @$aid_mod;
    		my @aid_name_mod = @$aid_name_mod;
    		my @encoder_quality_mod = @$encoder_quality_mod;
    		my @encoder_mod = @$encoder_mod;
    Et voici la fonction (qui en appel d'autres aussi, mais ça, ça marche ) :

    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    	sub AUDIO_MENU {
    		my ($aid_name, $aid, $encoder_quality, $encoder, $encoder_var) = @_;
    		#	Déférencement des variables
    		my @aid_name = @$aid_name;
    		my @aid = @$aid;
    		my @encoder_quality = @$encoder_quality;
    		my @encoder = @$encoder;
    		my $cancel;
     
    		#	On demande si il faut démarrer le rip
    		print "       Voulez-vous démarrer le transcodage ?\n";
    		print "INFO : Si vous répondez par la négative (N) alors vous avez la possibilité\n";
    		print "       de changer les paramètres enregistrer pour l'encodage audio.\n";
    		print "       Votre Choix [O/N] : ";
    		my $out1;
    		do {
    			my $choice = <STDIN>; chomp $choice;
     
    			#	Si la réponse est positive 
    			if ( $choice eq "O" ) {
    				$out1 = "10";
    			}
     
    			#	Si la réponse est négative, alors on lance le "menu"
    			elsif ( $choice eq "N" ) {
    				$out1 = "10";
    				my $out2;
    				do {
    					print "       Que voulez-vous faire ? \n";
    					print "           [1] Revoir la / le(s) piste(s) audio(s) disponible(s).\n";
    					print "           [2] Séléctionner une / des autres(s) pistes(s) audio(s).\n";
    					print "           [3] Editer le nom de la / des piste(s) audio(s).\n";
    					print "           [4] Séléctionner un autre encodeur pour la / les pistes(s) audio(s).\n";
    					print "           [5] Editer la qualité / bitrate de chaque(s) piste(s) audio(s).\n";
    					print "           [6] Voir les modifications (résumé).\n";
    					print "           [7] Lancer l'encodage (sans confirmation).\n";
    					print "           [8] Annuler l'encodage de l'audio.\n";
    					print "           [9] Sortir du programme.\n";
    					print "       Choix (1, 2, 3, 4, 5, 6, 7, 8 ou 9) : ";
    					my $choice = <STDIN>; chomp $choice;
    					switch ( $choice ) {
    						case ("1") {
    							&AUDIO_FILE_EVO_DISPLAY;
    							$out2 = "20";
    						}
    						case ("2") {
    							#	On vide le tableau @aid 
    							@aid = ();
    							#	Relancer la detection des pistes audios ? (Non pour l'instant)
    							@aid = split (/\s/, &AUDIO_AID_CHOICE() );
    							$out2 = "20";
    						}
    						case ("3") {
    							#	On vide le tableau @aid_name
    							@aid_name = ();
    							#	On relance la fonction AUDIO_AID_CHOICE
    							my $i = 0;
    							foreach my $lvar (@aid) {
    								print "       Nom de la piste $aid[$i] : ";
    								push (@aid_name, &AUDIO_NAME_ASK());
    								$i++;
    							}
    							$out2 = "20";
    						}
    						case ("4") {
    							#	On vide le tableau @encoder 
    							@encoder = ();
    							#	On relance la fonction pour montrer le choix des encodeurs
    							&AUDIO_ENCODER_SHOW("$encoder_var");
    							my $i = 0;
    							foreach my $lvar (@aid) {
    								print "       Encodeur audio pour la piste $aid[$i] : ";
    								push (@encoder, &AUDIO_ENCODER_CHOICE("$encoder_var"));
    								$i++;
    							}
    							$out2 = "20";
    						}						
    						case ("5") {
    							#	On vide le tableau @encoder_quality
    							@encoder_quality = ();
    							#	On relance la fonction AUDIO_QUALITY
    							my $i = 0;
    							foreach my $lvar (@aid) {
    								push (@encoder_quality, &AUDIO_QUALITY("$encoder[$i]", "$aid[$i]"));
    								$i++;
    							}
    							$out2 = "20";
    						}
    						case ("6") {
    							my $i = 0;
    							my $j = 1;
    							my $number_aid = @aid;
    							print "INFO : Nombre de piste(s) audio(s) à ripper : $number_aid :\n";
    							foreach my $lvar (@aid) {
    								&AUDIO_INFO("$j", "$aid[$i]", "$encoder[$i]", "$aid_name[$i]", "$encoder_quality[$i]");
    								$i++;
    								$j++;
    							}						
    							$out2 = "20";
    						}						
    						case ("7") {
    							$out2 = "10";
    							$cancel = "no";
    						}
    						case ("8") {
    							$out2 = "10";
    							$cancel = "yes";
    						}
    						case ("9") {
    							exit 0;
    						}
    						else {
    							print "WARN : Vous devez taper 1, 2, 3, 4, 5, 6, 7 ou 8 !\n";
    							$out2 = "20";
    						}
    					}
    				} until ( $out2 eq "10" );
    			}
    			else {
    				print "WARN : Vous devez taper O(ui) ou N(on), choix : ";
    				$out1 = "20";
    			}
    		} until ( $out1 eq "10" );
    		return (\@aid_name, \@aid, \@encoder_quality, \@encoder, $cancel);
    	}
    J'ai bien essayer de triffouiller le bidule mais ça marche pas, les valeurs retournées par ma fonction semble être modifiées, mais la suite me prouve le contraire et pourtant les tableaux sont bel et bien modifiés dans la fonction ...

    A noter que cette fonction et l'appel de la fonction est dans une fonction aussi (qui englobe les deux ... enfin beaucoup plus que ça)

    Jjeje007

  2. #2
    Expert confirmé
    Avatar de Jedai
    Homme Profil pro
    Enseignant
    Inscrit en
    Avril 2003
    Messages
    6 245
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Avril 2003
    Messages : 6 245
    Par défaut
    C'est illisible sur le forum parce que tu utilises des tabulations... C'est l'une des raisons pour lesquelles je n'utilises que des espaces pour mes indentations personnellement, au moins les espaces ont la même taille partout !

    Par ailleurs tu utilises un switch..case.. , c'est une très mauvaise idée, le module Switch est un "filtre de source" qui peut avoir des conséquences très désagréables pour le débuggage par la suite. Utilise plutôt un hash de références de fonctions, ça sera plus robuste et flexible.

    --
    Jedaï

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Ok merci pour le conseil sur switch .. case.
    C'était bien lui le fautif !

    Par ailleur, je suis désolé pour les tab, mais il se trouve que j'ai juste copier / coller a partir de mon editeur (SciTE) et que je trouve ça propre (enfin pas sur le forum cela dit ).

    Par ailleur, je serais intéresser si tu pouvais me donner un petit exemple par ce que tu appelles : "hash de références de fonctions"

    Enfin, maintenant que ça marche, si cela pouvait résoudre mon prochain problème qui est le suivant :
    Si l'utilisateur modifie par exemple l'encodeur, alors il faut aussi modifier le choix du bitrate / qualité et si ce "hash de références de fonctions" permet de faire des test facile la dessus, je suis preneur (ou sinon va falloir que je passe par un do if/elsif until (et j'en ai déjà bien assez dans cette fonction).

    Bref, dans tous les cas, merci !
    Et je vais regarder ce que pourrais bien être ce : "hash de références de fonctions" et comment le mettre en place et surtout si ça convient à ce que je veux faire (enfin si vous avez compris ce que je veux faire aussi hein )

    Jjeje007

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2006
    Messages : 1 076
    Par défaut
    Bonjour,

    Un hash de référence de fonction est juste un hash... qui contient des références vers des fonctions

    Un petit exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    my %hash = (1 => sub {print "choix 1\n"}, 
                2 => sub {print "Choix 2, paramètre passé : $_[0]\n"});
     
    &{$hash{1}}();
    &{$hash{2}}("toto");
    A toi de modifier ton code et d'y intégrer ça

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    50
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 50
    Par défaut
    Salut,

    Merci pour la précision, je vais mettre ça en place.
    Mon problème est donc résolu

    Jjeje007

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

Discussions similaires

  1. [Tableaux] Des fonctions SVG
    Par atito dans le forum Langage
    Réponses: 2
    Dernier message: 16/07/2007, 19h11
  2. Réponses: 8
    Dernier message: 12/03/2007, 16h56
  3. [Tableaux] Similitude fonctions de fichiers et de tableaux
    Par beejeridou dans le forum Langage
    Réponses: 2
    Dernier message: 04/02/2007, 15h46
  4. [Tableaux] simplifier fonction str_replace
    Par nicerico dans le forum Langage
    Réponses: 7
    Dernier message: 04/12/2006, 15h45
  5. Réponses: 11
    Dernier message: 04/07/2006, 14h33

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