2014-10-02 4 views
3

나는 lodepng-rust로 이미지를 쓰고 있는데, u8 대신 픽셀로 작업하고 싶습니다. 나는 구조체동일한 길이의 배열 만들기

struct Pixel {r: u8, g: u8, b: u8} 

을 만든 및 배열의 ​​요소 중 u8의 배열을 구축하고있다. 제가 지금 손으로 배열을 만들고 있기 때문에 저는 다른 배열을 손으로 만들 필요가있는 이상한 상황에 처해 있습니다. 컴파일 할 때 픽셀 배열의 길이의 세 배가되는 배열을 만들 수있는 방법이 있습니까? .len() 때문에 작동하지 않습니다

let data: [u8, ..other_array.len()*3]; 

같은 뭔가 컴파일 시간 상수가 아닙니다. 런타임 비용은이 경우에는별로 중요하지 않지만 관련된 크기를 가질 수 있다면 클리너가 느껴질 것입니다 (그리고 앞으로는 성능이 필요할 수도 있습니다).

편집 : 해결책은 Levans의 답변을 기반으로합니다. 배열을 수동으로 초기화하지 않는 사람들은 Levans를 따르십시오. 첫 번째 배열을 직접 초기화하지만 pixel_count에 지정된 길이를 사용하도록 형식을 설정하면 컴파일시에 pixel_count을 잘못 catch합니다. 그 상수를 가진 두 번째 배열을 만들고 길이가 올바른 비율이라고 주장합니다. 내 최소한의 예는 다음과 같습니다

struct Pixel {r: u8, g: u8, b: u8} 
static pixel_count : uint = 4; 

fn main() { 
    let pixel_data = [Pixel, ..pixel_count] = [ 
         Pixel {r: 255, g: 0, b: 0}, 
         Pixel {r: 0, g: 255, b: 0}, 
         Pixel {r: 0, g: 0, b: 255}, 
         Pixel {r: 0, g: 99, b: 99} 
        ]; 
    let mut data = [0u8, ..pixel_count*3]; 
    assert!(pixel_data.len()*3 == data.len()); 
} 

답변

3

당신이 const 항목으로 초기 크기를 저장하는 것입니다 크기 관련 배열을 생성하는 가장 쉬운 방법 :

const pixel_count: uint = 42; 

struct Pixel { r: u8, g: u8, b: u8 } 

fn main() { 
    let pixels = [Pixel { r: 0, g: 0, b: 0 }, ..pixel_count]; 
    let raw_data = [0u8, ..pixel_count * 3]; 
    assert!(pixels.len() * 3 == raw_data.len()); 
} 
+0

: 그들은 컴파일 타임 상수 'pixel_number'를'pixel_count'에 넣어 일치시킬 수 있습니다. 어쨌든'assert!'를 사용하면 완벽하게 사용하고있는 메서드가됩니다. 감사합니다! – porglezomp

+0

이것은 더 이상 0.12.0에서 작동하지 않습니다. 의도적인지 알아? – DrYap

+0

@DrYap 사실, 그것은 바뀌 었습니다, 키워드는 이제'const'입니다. 감사 ! – Levans

관련 문제