PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Eigenartiger Fehler bei der Konkatenation in meinem Perl-Programm



RAHUL
06-07-2006, 10:52
Hallo,

leider kann ich kein vollwertiges Minibeispiel reinschreiben,
aber es geht um folgende Subroutine...

Es sollen bei Aufruf der Subroutine drei Argumente übergeben werden,
ein String mit lauter Integer($_[0])
ein Textarray, der manipuliert werden soll($_[2]..$_[-1])
und eine Kennzeile des Textarray, ab der manipuliert wird($_[1], bzw $_[1]+2)

Viele der Print-Optionen sollen nur zum Debuggen helfen...



79sub PrintNum{
80 $_[0]=~ s/^\s*(\d{1,3}[\s\d]+\d{1,3})\s*$/$1/;
81 my @numbers =split /\s+/,$_[0];
82 my $NumofNum = @numbers;
83 my $StdNum = $_[1]+2;
84
85 for (my $ctr1=0; $ctr1 < $NumofNum; $ctr1++){
86 my $line=" " if (($ctr1+1)%15==0||$ctr1==0);
87 print "Restart line\n" if (($ctr1+1)%15==0||$ctr1==0);
88 for (my $ctr2=&TestDigits($numbers[$ctr1]); $ctr2 < 2; $ctr2++){
89 $line.=" ";
90 }
91 $line.="$numbers[$ctr1] ";
92 print $line;
93 print "|$ctr1: $numbers[$ctr1]\n";
94 if ((($ctr1+1)%15==0)||($ctr1+1==$NumofNum)){
95 $line.="\n";
96 if($ctr1<15){
97 $_[$StdNum]=$line;
98 print "\nIn Overwrite-line\n";
99 print $line;
100 }
101 else{
102 splice(@$_, $StdNum, 0, $line);
103 print "\nIn splice-line\n";
104 print $line;
105 }
106 $StdNum++;
107 }
108 }
109 }


Nun sollen die Zahlen immer in 15-Packs in den Textarray hineingeschrieben werden,
soweit bin ich aber noch nicht, habe meine Tests bisher unter 15 Zahlen gehalten.
So ist eine Beispielausgabe für 11 Zahlen zwischen 59 und 70 z.B folgende,


Restart line
59 |0: 59
60 |1: 60
60 61 |2: 61
60 61 62 |3: 62
60 61 62 63 |4: 63
60 61 62 63 64 |5: 64
60 61 62 63 64 65 |6: 65
60 61 62 63 64 65 66 |7: 66
60 61 62 63 64 65 66 67 |8: 67
60 61 62 63 64 65 66 67 68 |9: 68
60 61 62 63 64 65 66 67 68 70 |10: 70

In Overwrite-line
60 61 62 63 64 65 66 67 68 70



Um den hervorgehobenen Bereich geht es, der eigentliche String geht immer bis zu dem senkrechten Strich(wie nennt man das Zeichen überhaupt, nicht wirklich senkrechter Strich?),

Dabei ist mir nicht klar, warum die 59 von $ctr1=0 nach $ctr1=1 geschluckt wird,
denn ein Fehler in der logik bezüglich der einzigen nicht-konkatenierenden Zuweisung habe ich ja mit dem Aufruf "Restart line\n" ausgeschlossen, oder nicht?

bin dankbar für jeden Hinweis...

Mfg
Rahul

RAHUL
07-07-2006, 10:33
Hallo,
ich weiß zwar nicht, warum aber das Programm löscht einfach nach dem ersten Durchlauf $line,
wenn ich $line vor der Konkatenierung ausgeben lasse, erhalte ich eine Fehlermeldung
nach dem ersten Durchlauf(also ist jetzt $ctr=1)

Use of uninitialized value in print at ./Create_Statistical_Positions.pl line 89, <COMBINATION> line 12.
<COMBINATION> ist das Textfile, bzw das Filehandle des Textfiles, aus dem immer die Zahlenreihen gelesen werden, also jeweils $_[0].

Ich habe das jetzt erstmal gelöst, mit unshift und einfach eine 0 in das erste Element des Array gesetzt, ist auch sehr unsauber, ob das noch Probleme bei längeren Zahlenreihen macht, werde ich dann sehen.

Bin also weiterhin für Anregungen dankbar...

MfG
Rahul

RAHUL
10-07-2006, 10:08
So ich habe immer noch das Problem, wahrscheinlich habe ich nicht genau genug hingeschaut, als ich meinte "Problem gelöst",
deswegen schicke ich mal alle Teile des Programms...

Vielleicht hat ja jemand Zeit und Interesse sich damit auseinanderzusetzen, weil
ich blick den Fehler nicht...:(

Ich schick drei Anhangsdateien, den Quellcode "Kombination.cpp" der C++-Datei "Kombination.out" (muß noch kompiliert werden")
, die Perl-Datei "CreateStatisticalPositions.pl"(hier noch Pfad von "Kombination.out" anpassen" Z.37) und eine Inputdatei eines Quantenchemie-Programms "Mayenite.d12", die als Argument von "CreateStatisticalPositions.pl" übergeben wird.

Ich versteh halt nicht, dass die erste Zahl des Arrays vernichtet wird. Daran ändert auch nichts, wenn ich etwas vor den array shifte.
Kann es was mit dem Format der Ausgabe-Datei von "Kombination.out" zu tun haben?

MfG
Rahul