Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1276 connectés 

  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Probleme de splice avec un tableau a 2 dimensions

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PERL] Probleme de splice avec un tableau a 2 dimensions

n°2039641
dreamkille​r
Posté le 02-12-2010 à 13:57:54  profilanswer
 

Bonjour, j'ai un soucis avec une insertion de ligne dans un tableau a 2 dimension.
 
Je m'explique, jutilise ce code pour faire mon insertion (qui est en faite une duplication de la ligne dans le tableau)
 

Code :
  1. my $replacement = $tab_temp[$nb_ligne];
  2. $nb_ligne++;
  3. splice @tab_temp,$nb_ligne, 0, $replacement;


 
le soucis arrive quand je souhaite faire une modification sur une des lignes 2 lignes précédentes, la modification est répercuté sur les deux lignes en meme temps...
 
Je pense qu'il y a un soucis avec l'adressage lors de la définition de la variable $replacement mais je ne voie pas comment procéder autrement.
 
 
je ne sais pas si je suis bien clair   :heink:  
 
En vous remerciant d'avance


Message édité par dreamkiller le 02-12-2010 à 14:35:29
mood
Publicité
Posté le 02-12-2010 à 13:57:54  profilanswer
 

n°2039657
dreamkille​r
Posté le 02-12-2010 à 14:26:06  profilanswer
 

Le soucis viens clairement de la ligne  

Code :
  1. my $replacement = $tab_temp[$nb_ligne];


 
la variable $replacement contient a chaque fois un truc comme ca:
ARRAY(0x40087cf8)
 
Elle devrait avoir une liste de valeur a la place

n°2039731
gilou
Modérateur
Modzilla
Posté le 02-12-2010 à 19:01:41  profilanswer
 

Si on pouvait voir le reste du code: définitions de @tab_temp, $nb_ligne, contenu de $tab_temp, on pourrait avoir une idée de la cause du pb.
A priori, si je pige bien, les éléments de @tab_temp sont des arrays? auquel cas, une réponse comme ARRAY(0x40087cf8) est tout à fait normale, $replacement étant défini comme un scalaire.
A+,


Message édité par gilou le 03-12-2010 à 03:36:20

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --
n°2039815
dreamkille​r
Posté le 03-12-2010 à 10:38:31  profilanswer
 

Salut merci pour ton aide.
 
Je pense que le code est loin d'etre propre (mes cours de dev sont loin...)
 
 

Code :
  1. sub creloctac (){
  2. my $add_line=0;
  3. my $nb_ligne=0;
  4. my @tab_temp;
  5. $tab_temp[0]=$tab_valeur[0];              ###entete
  6. for (my $j=1;$j<=$tab_index_ligne;$j++)
  7. {
  8.  my $tache_creloctac=$tab_valeur[$j][2];
  9.  $nb_ligne++;
  10.  $tab_temp[$nb_ligne]=$tab_valeur[$j];
  11.  my $deuxieme_passage=0;
  12.  open(my $handle_list_tache_creloctac,  "<", $list_tache)  or die "Can't open $list_tache: $!"; #####Ouverture du fichier TACHES en mode lecture
  13.  while (<$handle_list_tache_creloctac> ) ####Parcourt du fichier en mode ligne a ligne
  14.  {
  15.   $add_line=0;
  16.   my $ligne=$_;
  17.   if ($ligne=~ /CRELOCTAC,/)   ####Si la ligne commence par CRELOCTAC, alors
  18.   {
  19.    if ($ligne=~/TACHE=$tache_creloctac,/) ###Si la ligne contient TACHE=matache, alors
  20.    {
  21.     if ($ligne=~ /LOC=(\w+),/)
  22.     {
  23.      $loc=$1;
  24.      $add_line=1;
  25.     }
  26.     if ($ligne=~ /DEFACT=(\w+),/) #### Si la ligne contient DEFACT=N, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  27.     {
  28.      $defact=$1;
  29.      $add_line=1;
  30.     }
  31.     if ($ligne=~ /CONDACT=(\w+),/) #### Si la ligne contient CONDACT=macond, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  32.     {
  33.      $condact=$1;
  34.      $add_line=1;
  35.     }
  36.     if ($ligne=~ /DEFPRO=(\w+),/) #### Si la ligne contient DEFPRO=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  37.     {
  38.      $defpro=$1;
  39.      $add_line=1;
  40.     }
  41.     if ($ligne=~ /,DEFEXT=(\w+|\*?),/) #### Si la ligne contient DEFEXT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  42.     {
  43.      $defext=$1;
  44.      $add_line=1;
  45.     }
  46.     if ($ligne=~ /DEFSNB=(\w+),/) #### Si la ligne contient DEFSNB=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  47.     {
  48.      $defsnb=$1;
  49.      $add_line=1;
  50.     }
  51.     if ($ligne=~ /DEFSWT=(\w+),/) #### Si la ligne contient DEFSWT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  52.     {
  53.      $defswt=$1;
  54.      $add_line=1;
  55.     }
  56.     if ($ligne=~ /DEFLBL=(\w+),/) #### Si la ligne contient DEFLBL=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  57.     {
  58.      $deflbl=$1;
  59.      $add_line=1;
  60.     }
  61.     if ($ligne=~ /DEFCYC=(\w+),/) #### Si la ligne contient DEFCYC=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  62.     {
  63.      $defcyc=$1;
  64.      $add_line=1;
  65.     }
  66.     if ($ligne=~ /DEFCPT=(\w+),/) #### Si la ligne contient DEFCPT=O, alors on recupere dans la variable $1 le contenue de ce qui se trouve entre le = et la ,
  67.     {
  68.      $defcpt=$1;
  69.      $add_line=1;
  70.     }
  71.     if ($add_line != 0)
  72.     {
  73.      if ($deuxieme_passage==0)
  74.      {
  75.       $tab_temp[$nb_ligne][12]=$loc;
  76.       $tab_temp[$nb_ligne][13]=$defpla;
  77.       $tab_temp[$nb_ligne][14]=$defact;
  78.       $tab_temp[$nb_ligne][15]=$condact;
  79.       $tab_temp[$nb_ligne][16]=$defpro;
  80.       $tab_temp[$nb_ligne][17]=$defext;
  81.       $tab_temp[$nb_ligne][18]=$defsnb;
  82.       $tab_temp[$nb_ligne][19]=$defswt;
  83.       $tab_temp[$nb_ligne][20]=$deflbl;
  84.       $tab_temp[$nb_ligne][21]=$defcyc;
  85.       $tab_temp[$nb_ligne][22]=$defcpt;
  86.       &ecriture_fichier($loc,$defpla,$defact,$condact,$defpro,$defext,$defsnb,$defswt,$deflbl,$defcyc,$defcpt,"\n" );
  87.       $deuxieme_passage=1;
  88.      }
  89.      else
  90.      {
  91.       my @replacement;
  92.       for(my $k=0;$k<$tab_index_champs;$k++)
  93.       {
  94.        push (@replacement,$tab_temp[$nb_ligne][$k]);
  95.       }
  96.       #print "@replacement\n";
  97.       $nb_ligne++;
  98.       splice @tab_temp,$nb_ligne, 0, @replacement;
  99.       # $tab_temp[$nb_ligne][12]=$loc;
  100.       # $tab_temp[$nb_ligne][13]=$defpla;
  101.       # $tab_temp[$nb_ligne][14]=$defact;
  102.       # $tab_temp[$nb_ligne][15]=$condact;
  103.       # $tab_temp[$nb_ligne][16]=$defpro;
  104.       # $tab_temp[$nb_ligne][17]=$defext;
  105.       # $tab_temp[$nb_ligne][18]=$defsnb;
  106.       # $tab_temp[$nb_ligne][19]=$defswt;
  107.       # $tab_temp[$nb_ligne][20]=$deflbl;
  108.       # $tab_temp[$nb_ligne][21]=$defcyc;
  109.       # $tab_temp[$nb_ligne][22]=$defcpt;
  110.      }
  111.     }
  112.    }
  113.   }
  114.  }
  115.  close $handle_list_tache_creloctac or die "Can't close $list_tache: $!";  ### Fermeture du fichier TACHE2
  116. }


 
 
Le code que j'ai donné au depart a quelque peu changé du coup maintenant j'ai une erreur d'un autre type
 

Code :
  1. Can't use string ("V2_XCH_CHJ_1_JOURNALIER" ) as an ARRAY ref while "strict refs" in use at ./concatenation_extraction_vega3.pl line 243.


 
Pour le contenu de tab_val et tab_temp se sont des tableaux de tableaux donc oui j'ai compris que ARRAY 0x ..... c'etait normal.

n°2039840
dreamkille​r
Posté le 03-12-2010 à 12:07:18  profilanswer
 

je pense avoir solutionné le probleme  
 
splice (@tab_temp,$nb_ligne, 0, \@replacement);
 
un tableau a 2 dimensions, c'est un tableau de pointeur donc il faut lui passé une adresse de tableau et non des valeurs.
 
Reste a confirmer que tout fonctionne correctement

n°2039866
gilou
Modérateur
Modzilla
Posté le 03-12-2010 à 14:37:24  profilanswer
 

Citation :

un tableau a 2 dimensions, c'est un tableau de pointeur donc il faut lui passé une adresse de tableau et non des valeurs.

Perl 5 n'a pas de telle structure de données.
Il ne connait que les tableaux simples, dont les éléments sont des scalaires.
Si ces scalaires sont les adresses d'autres tableaux, on peut simuler la notion de tableau à 2 dimensions, mais cela n'a rien d'un type de données intrinsèque à Perl.
En perl 6, la notion de tableau multi dimensionnel a été ajoutée, et bien plus: http://perlcabal.org/syn/S09.html .
A+,


Message édité par gilou le 03-12-2010 à 14:41:53

---------------
There's more than what can be linked! --    Iyashikei Anime Forever!    --  AngularJS c'est un framework d'engulé!  --

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Perl

  [PERL] Probleme de splice avec un tableau a 2 dimensions

 

Sujets relatifs
Problème fonction strlen /ubuntu[JAVA] Probleme de generation de classes avec PowerAMC
[Résolu] Probleme d'unicité dans un HashSetGros problème d'antislash et quote
Problème balise metaProblème MACRO filtre auto passage v2007 - v2003
Structure + Tableau dynamique en langage C[CSS] Problème avec .class et id
[Python 2.7]Py2exe - probleme de dépendancesPassage de tableau lors d'un changement de page.
Plus de sujets relatifs à : [PERL] Probleme de splice avec un tableau a 2 dimensions


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR