2013-05-17 1 views
3

En C# je pouvais faire quelque chose comme çaVecteurs multidimensionnels dans la rouille, segfaulting?

class Map {  
    public Tile[, ,] Location = new Tile[6, 256, 256]; 
} 

et accéder à plus tard tout élément de tuile avec quelque chose comme Location[2, 40, 20]

Je suis en train de faire le même type de structure dans la rouille, mais je trouve la syntaxe un peu bizarre. Je suis venu avec, mais il crashait avec de grandes tailles de vecteur (couru hors de la pile?):

use tile::Tile // Simple struct with a few Point properties 

pub struct Map { 
    location: [[[Tile, ..256], ..256], ..6], 
} 

pub impl Map { 
    fn new() -> Map { 
     Map { 
      // assuming empty_tile is a Tile I've just created 
      location: [[[empty_tile, ..256], ..256], ..6] 
     } 
    } 
} 

Vais-je sur ce mal? Il a couru très lentement et de grandes tailles segfaulted. Peut-être y a-t-il une meilleure façon de stocker un espace en trois dimensions de carreaux (couche, largeur, hauteur)?

edit: c'est avant même essayer et faire les carreaux mutables

+0

Avez-vous essayé un petit MD-vector, pour voir si le problème est qu'il est trop grand? –

+0

Êtes-vous segfaulting dans rustc, ou lorsque vous essayez d'exécuter l'exécutable produit? –

+0

Corey: Lorsque j'essaie d'exécuter l'exécutable. –

Répondre

4

[[[Tile, ..256], ..256], ..6] est alloué stack, et il va probablement ~ 60Mo grande. Essayez ~[~[~[Tile, ..256], ..256], ..6], qui est un pointeur possédé (alloué sur le tas d'envoi, les pointeurs possédés peuvent être envoyés à travers les tâches)

+0

Comment puis-je initialiser le vecteur? Carte { emplacement: ~ [~ [~ [fichier_table, ..256], ..256], ..6] } –

+2

@boden, 'vec :: from_elem (6, vec :: from_elem (256, vec :: from_elem (256, empty_tile))) ' – huon

+0

ça devrait quand même être bien de mettre un gros vecteur sur la pile, bien que ce ne soit probablement pas une bonne idée dans la plupart des cas en termes de performances – strcat

Questions connexes