1

何が起こっているのか非常にわかりません。のさまざまな長さに対して@depths、コードは一般的に機能します。ただし、出力全体を通して、特定の時点で、プログラムは初期化されていない値の使用について苦情を申し立てます。

エラーは行 20 を非難します。print $chars[$depths[$y]];

明らかなことである場合は事前にお詫び申し上げますが、問題を見逃していることは間違いありません。私は運がないので約1時間グーグルで検索しましたので、正しい方向へのナッジは非常に高く評価されます!

完全なコード:

#! /usr/bin/perl -w

use strict;
use warnings;

#my @chars  = ("0" .. "9");
#my @depths = (0) x 4;
my @chars   = ("0" .. "1");
my @depths  = (0) x 3;

my ($i, $x, $y);

for ($i = 0; $i < @chars ** @depths; $i++) {

    for ($y = 0; $y < @depths; $y++) {

        print $chars[$depths[$y]];
    }
    print"\n";

    $depths[$#depths]++;
    for($x = 0; $x < @depths; $x++) {

        if($depths[$x] == @chars) {

            $depths[$x-1]++;
            while($x < @depths) {

                $depths[$x++] = 0;
            }
        }
    }
}

出力:

000
001
010
011
Use of uninitialized value in print at a.pl line 15.
00
100
101
110
4

2 に答える 2

1

コードに print ステートメントをいくつか追加したところ、問題が明らかになりました。

#! /usr/bin/perl -w

use strict;
use warnings;

my @chars = ("0".."1");
my @depths = (0) x 3;

my $i;
my $x;
my $y;
for ($i = 0; $i < @chars**@depths; $i++)
{
        printf "m = %d\n", scalar(@depths);
        for ($y = 0; $y < @depths; $y++)
        {
            print "y:$y; d[y] = $depths[$y]\n";
            print " :$chars[$depths[$y]]:\n";
        }
        print"\n";

        printf "b[%d] ", $depths[$#depths];
        $depths[$#depths]++;
        printf "a[%d]\n", $depths[$#depths];
        for($x = 0; $x < @depths; $x++){
                if($depths[$x] == @chars){
                        $depths[$x-1]++;
                        while($x < @depths){
                                $depths[$x++] = 0;
                        }
                }
        }
}

出力は次のとおりです。

m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 0
 :0:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 0
 :0:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 1
 :1:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 1
 :1:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 0
 :0:
y:1; d[y] = 2
Use of uninitialized value within @chars in concatenation (.) or string at perm.pl line 18.
 ::
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 0
 :0:
y:2; d[y] = 0
 :0:

b[0] a[1]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 0
 :0:
y:2; d[y] = 1
 :1:

b[1] a[2]
m = 3
y:0; d[y] = 1
 :1:
y:1; d[y] = 1
 :1:
y:2; d[y] = 0
 :0:

b[0] a[1]

エラー レポートの直前の行に$depths[$y]は 2 が示されていますが、配列@charsにはインデックス 0 と 1 の要素しか含まれていないため、警告は正確です。

于 2012-09-15T04:13:16.960 に答える
1

@depthsN 基数 (N は の数) と考えてください。 の@chars各要素@depthsは数字です。その数に 1 を追加しようとしていますが、失敗しています。

キャリーは最下位桁から最上位桁に伝播するため、キャリーが最下位桁から最上位桁にループする必要があるハンドルよりもループになる必要がありますが、逆の順序で実行しています。$xで開始し$#depth、ループが進むにつれて減少する必要があります。

例を見てみましょう。10 個の記号 ( @chars == 10) があるとします。

 456999   <- @depth
+     1
-------
 457000

したがって、 に等しくない右端の桁をインクリメントし、 に等しい$#chars右端のすべての桁をゼロに設定します$#chars。これが私がそれをどのようにコーディングしたかです:

#!/usr/bin/perl -w

use strict;
use warnings;

my @chars = ("0".."2");
my @depths = (0) x 3;

OUTER: while (1) {
   print @chars[@depths], "\n";

   my $x = $#depths;
   while ($depths[$x] == $#chars) {
      $depths[$x] = 0;
      last OUTER if $x == 0;
      --$x;
   }

   ++$depths[$x];
}
于 2012-09-15T04:13:45.200 に答える