2014-10-02 2 views
3

Я пишу что-то, что пишет изображения с lodepng-ржавчиной, и я хотел бы работать с пикселями вместо u8. Я создал на структуруСоздать массив с одинаковой длиной

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

и строй массива u8 с из элементов массива. Поскольку я сейчас делаю массив вручную, я в странной ситуации нуждаюсь в том, чтобы сделать другой массив вручную. Есть ли способ создать массив, который в три раза больше длины массива пикселей во время компиляции? Что-то вроде

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

Который не работает, потому что .len() не является константой времени компиляции. В этом случае стоимость исполнения не имеет для меня значения, но если бы у меня были связанные размеры, она бы стала чище (и мне может понадобиться производительность в будущем).

Редактировать: Решение, которое я использую, основано на ответе Леванса. Для людей, не инициализирующих ваш массив вручную, просто следуйте за Леванами. Я инициализирую свой первый массив вручную, но задаю тип, чтобы использовать длину, указанную в pixel_count, так что она поймает неправильный pixel_count во время компиляции. Я создаю второй массив с этой константой, а затем утверждаю, что длины имеют правильное соотношение. Мой минимальный пример выглядит следующим образом:

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