0

次のコードの

#!/usr/bin/ruby -w

nums = File::read("euler18nums.txt");   #opens file with number array inside.
parts = nums.split(' ');                #save it into instance of an array.
t = []                                  #dimension one of the array of arrays.
s = []                                  #dimension two.
j=0                                     #iteration variable.
k=0                                     #iteration variable.
n=1                                     #iteration variable.
parts.collect do |i|                    #itterates through the array that i have my data in.
    s[k] = i.to_i                       #converts strings to int and save into 2nd dimension.
    k+=1
    if k == n                           #number of itterations increase by one every time function is called.
        t[j] = s                        
        n+=1                            #saves second dimension of array into the first,-
        k=0                             #-and this is  where my problem is because it saves into and overwrites-
        test=0                          #-of the array that i have saved.
        while test != n                 #this is a test statement to print out the array so far-
            print t[test], "\n"         #-every time a new array is saved into it
            test+=1
        end
        j+=1
    end
end
print t                                 #prints out at the end, this is always just the last-
                                        #-array printed out fifteen times

s を t[j] に保存すると、これまでに作成された t のすべてのインスタンスが保存され、上書きされます。Ruby 配列を誤解しているt[5] = sのでしょうt[4]t[3]。Rubyが特定のインスタンスの配列のみを保存する方法はありますか、それとも戻る必要がありますC++か? このためのtxtファイルは

75
95 64
17 47 82
18 35 87 10
20 04 82 47 65
19 01 23 75 03 34
88 02 77 73 07 63 67
99 65 04 28 06 16 70 92
41 41 26 56 83 40 80 70 33
41 48 72 33 47 32 37 16 94 29
53 71 44 65 25 43 91 52 97 51 14
70 11 33 28 77 73 17 78 39 68 17 57
91 71 52 38 17 14 91 43 58 50 27 29 48
63 66 04 68 89 53 67 30 73 16 69 87 40 31
04 62 98 27 23 09 70 98 73 93 38 53 60 04 23

http://projecteuler.net/problem=18にもあります

4

2 に答える 2

1

のすべての要素tがまったく同じs配列になるように見えますが、最終的tには次のようになります。

t[0] ---\
t[1] ----+--> s
t[2] ---/

これを行う場合:

t[j] = s

配列への参照を に割り当てるだけt[j]で、配列のコピーを作成するのではなく、配列へsの別の参照を作成するだけです。s配列またはポインターの場合、動作は C または C++ とまったく同じです。

何を達成しようとしているのかはわかりませんt[j] = sが、おそらく のコピーを に割り当てたいと思うでしょst[j]:

t[j] = s.dup
于 2013-04-03T20:31:48.047 に答える
0

問題は「上書き」ではなく、2 次元配列 (指している) を 1 つだけ作成することですs。したがって、同じオブジェクトへのポインターをそれぞれに書き込んでいますt[j]

s = []新しい 2 次元配列を開始するコード内のポイントに移動します。

これまでの配列に既存の数値を保持したい場合は、次のようにします

s = s.clone

. . . 配列の既存の内容を新しいものに(浅く)コピーし、sそれを指します。

于 2013-04-03T20:31:17.967 に答える