2013-08-08 3 views
1

배열에 이진 데이터를 복사하려고하는데 기대하지 않는 결과가 나타납니다. 나는 그것을 그것을 보여주는이 작은 문제로 축소시켰다.REBOL3 - 바이너리에서 바이너리를 복사하는 방법! 차단! 올바르게

b: #{0102030405060708} 
c: array (length? b) 
repeat num (length? b) [ 
    print [ 
     {Setting location} 
     num 
     {to value of} 
     to-binary reduce [(pick b num)] 
    ] 
    poke c num (to-binary reduce [(pick b num)]) 
] 

이 결과 :

Setting location 1 to value of #{01} 
Setting location 2 to value of #{02} 
Setting location 3 to value of #{03} 
Setting location 4 to value of #{04} 
Setting location 5 to value of #{05} 
Setting location 6 to value of #{06} 
Setting location 7 to value of #{07} 
Setting location 8 to value of #{08} 
== #{08} 

>> c 
== [#{08} #{08} #{08} #{08} #{08} #{08} #{08} #{08}] 

내가 내 반복 블록과 ==#{08}를 반환하고 있음을 볼 수있다, 그러나 그것은 어디에서 오는 나는 konw하지 않습니다. 내가 trace on로 확인하고 그 찌르는 진술은 반복의 모든 단계에서 블록의 모든 요소를 ​​설정하는 것 같습니다. 이것은 포인터 문제 인 것 같아서 copy으로 해결할 수 있습니다. 누군가 나에게 무슨 일이 일어나고 있는지 아이디어를 줄 수 있습니까?

좀 더 테스트 : Ladislavs의 대답

>> to-binary reduce [pick b 1] 
== #{01} 

>> poke c 1 to-binary reduce [pick b 1] 
== #{01} 

>> c 
== [#{01} #{01} #{01} #{01} #{01} #{01} #{01} #{01}] 

>> poke c 2 #{02} 
== #{02} 

>> c 
== [#{01} #{02} #{01} #{01} #{01} #{01} #{01} #{01}] 

>> u: to-binary reduce [pick b 4] 
== #{04} 

>> poke c 4 u 
== #{04} 

>> c 
== [#{04} #{02} #{04} #{04} #{04} #{04} #{04} #{04}] 

응답 :

버그에 대한 답변을 주셔서 감사합니다.

첫 번째 예는 내가 예상 한 것과 다른 결과를 제공합니다. I 길이 1에 관심이있는 반면 진 요소는 길이가 8 각이다 (to-binary의 블록 인수 따라서 용도.)

>> c 
== [#{0000000000000001} #{0000000000000002} #{0000000000000003} #{0000000000000004} #{0000000000000005} #{0000000000000006} #{0000000000000007} #{0000000000000008}] 

제 이뤄지는 발생한 c: copy []

답변

3

으로 c: array (length? b) 대체하여 알려진 버그. AFAIK). 해결 방법은 블록을 바이너리 기능의 인수로 사용하지 않는 것입니다.

b: #{0102030405060708} 
c: array (length? b) 
repeat num (length? b) [ 
    print [ 
     {Setting location} 
     num 
     {to value of} 
     to-binary pick b num 
    ] 
    poke c num to-binary pick b num 
] 

그러나, 전체 코드가 나에게 overcomplicated보고, 차라리 사용하여 목표를 달성하는 것입니다 : 다음 코드는 작동합니다

b: #{0102030405060708} 
c: make block! length? b 
repeat num (length? b) [ 
    print [ 
     {Setting location} 
     num 
     {to value of} 
     copy/part at b num 1 
    ] 
    append c copy/part at b num 1 
] 

당신이 짧은 (길이를 만들려면 1) 이진수를 정수로 사용하는 경우이 수식을 사용할 수 있습니다.

append copy #{} 255 
+0

Ladislav에 대한 설명 주셔서 감사합니다. 귀하의 예제 중 첫 번째와 관련하여 길이가 8보다 짧은 바이너리를 생성하는 다른 방법이 있습니까? 위의 답변을 위와 같이 편집했습니다. 허락하신다면, 나는'append'를 사용하여 조정할 것입니다, 그러나 나는 단지 궁금했습니다. – kealist