2009-12-28 5 views
3

J'ai défini boost::(multi_)array avecInitialiser tableau boost/multi_array

typedef boost::multi_array<unsigned int, 1> uint_1d_vec_t; 
typedef boost::multi_array<unsigned int, 2> uint_2d_vec_t; 

uint_1d_vec_t foo(boost::extents[ num_elements ]   ); 
uint_2d_vec_t boo(boost::extents[ num_elements/2 ][ kappa ]); 

étaient num_elements/2 ist un entier et kappa est un double, mais ne contient que des nombres entiers (par exemple 79).

Comment est-ce que je peux initialiser foo et boo à 0, quand le nombre d'éléments dans les côtés n'est connu qu'à l'exécution?

+1

@Octavian: Merci, mais l'ajout de tags dans les titres est l'opposé du nettoyage. –

+0

@ LightnessRacesinOrbit Cela semble être une question de point de vue personnel. [Comment écrire un bon titre?] (Http://meta.stackexchange.com/questions/10647/how-do-i-write-a-good-title). –

+2

@OctavianDamiean: La vue prédominante sur ce sujet est que les balises dans les titres sont mauvaises. Nous avons déjà un système d'étiquetage cohérent et indexé. Mods m'ont également soutenu sur ces modifications dans le passé. Je ne peux pas plaire à tout le monde, bien sûr. –

Répondre

-1
uint_1d_vec_t foo(boost::extents[ static_cast<uint_1d_vec_t::index>(num_elements ) ]   ); 
uint_2d_vec_t boo(boost::extents[ static_cast<uint_2d_vec_t::index>(num_elements/2) ][ static_cast<uint_2d_vec_t::index>(kappa) ]); 
+0

désolé, mais je ne comprends pas où puis-je définir dans cette solution la valeur d'initialisation? – Eagle

+0

Bien que ce code peut aider à résoudre le problème, fournissant contexte supplémentaire concernant _why_ et/ou _how_ it répond à la question permettrait d'améliorer considérablement sa valeur à long terme . S'il vous plaît [modifier] votre réponse pour ajouter quelques explications . –

-3

i utilisé

std::fill(foo.begin() , foo.end() , 0); 

pour résoudre mon problème (ne sais pas s'il vaut mieux alors boost :: attribuer, depuis que je suis incapable de l'appliquer).

avec boo J'ai toujours un problème, car std :: fill (boo.begin() -> begin(), boo.end() -> end(), 0); compilation passe, mais une fois que je lance mon programme, je reçois l'erreur suivante:

/usr/include/boost/multi_array/base.hpp:178: Reference boost::detail::multi_array::value_accessor_one::access(boost::type, boost::multi_array_types::index, TPtr, const boost::multi_array_types::size_type*, const boost::multi_array_types::index*, const boost::multi_array_types::index*) const [with Reference = unsigned int&, TPtr = unsigned int*, T = unsigned int]: Assertion `size_type(idx - index_bases[0]) < extents[0]' failed.Blockquote

ici est un code court:

#include <iomanip> 
#include "boost/multi_array.hpp" 
#include <iostream> 

namespace vec { 
    typedef boost::multi_array<unsigned int, 1> uint_1d_vec_t; 
    typedef boost::multi_array<unsigned int, 2> uint_2d_vec_t; 
    typedef uint_1d_vec_t::index     index_1d_t; 
    typedef uint_2d_vec_t::index     index_2d_t; 
} 

using namespace std; 

int main() { 

    unsigned int num_elements, num_bits, max_runs, m; 
    num_bits = 12; 
    max_runs = 5000; 
    m  = 2; 

    num_elements = (1 << num_bits); 

    double kappa = 79; 

    vec::uint_1d_vec_t foo(boost::extents[ static_cast<vec::index_1d_t>(num_elements) ]           ); 
    vec::uint_2d_vec_t boo(boost::extents[ static_cast<vec::index_2d_t>(num_elements) ][ static_cast<vec::index_2d_t>(kappa) ]); 

    std::fill(foo.begin()   , foo.end()  , 0); 
    std::fill(boo.begin()->begin() , boo.end()->end() , 0); 

    std::cout << "Done" << std::endl; 

    return EXIT_SUCCESS; 
} 
+2

S'il vous plaît modifier votre question originale au lieu d'ajouter des réponses qui ne répondent pas à la question. –

2

ligne changement

std::fill(boo.begin()->begin() , boo.end()->end() , 0); 

à

std::fill(boo.origin(), boo.origin() + boo.size(), 0); 

résolu mon problème

+1

Vous pouvez utiliser 'boo.data()' à la place. – updogliu

+1

Vous pouvez également utiliser 'boo.num_elements()' au lieu de 'boo.size()'. – wedesoft

+1

De la documentation de '.size()' _ Ceci renvoie le nombre de valeurs contenues dans a. C'est équivalent à a.shape() [0]; _ D'accord avec @wedesoft que vous devriez utiliser '.num_elements()' – oLas

-1

Vous pouvez également utiliser calloc, puis envelopper la mémoire retournée avec un boost :: multi_array_ref.

Questions connexes