/ / puis-je obtenir T ** (tableau à 2 dimensions de style c) de boost :: multi_array <T, 2>? - c ++, tableaux, boost, tableau multidimensionnel

puis-je obtenir T ** (tableau à 2 dimensions de style c) de boost :: multi_array <T, 2>? - c ++, tableaux, boost, tableau multidimensionnel

parce que je veux utiliser boost :: multi_array <> et que, en même temps, la bibliothèque existante nécessite un tableau de style c

Réponses:

2 pour la réponse № 1

T ** est ne pas un tableau de style C. Les tableaux de style C intégrés sont implémentés via une technique de recalcul d'index superposée sur un tableau 1D ordinaire.

T ** serait une 2D "multi-niveaux" implémentée manuellementtableau. Ce type de tableau 2D utilise une implémentation à deux niveaux, le tableau de premier niveau étant un tableau de pointeurs pointant vers des tableaux de second niveau contenant des données réelles. C'est une approche complètement différente, incompatible avec les tableaux intégrés.

Disposition de la mémoire utilisée par boost::multi_array<T, 2> est identique à celle du tableau de style C intégré, c’est-à-dire qu’il s’agit d’un tableau 1D qui "prétend" être 2D par recalcul d’index. Vous ne pouvez pas "extraire" un T **tableau de style, puisque la structure de la mémoire à deux niveaux n’existe tout simplement pas dans boost::multi_array.

Cela soulève en fait la question du type de tableau requis par vos bibliothèques héritées: T **-style tableau ou tableau de style C, car ce ne sont pas les mêmes.


1 pour la réponse № 2

Si le tableau multidisque boost est mis en page de la même manière que le tableau primitif c ++ ne pourrait-il pas y accéder de manière standard?

De augmenter la référence multi_array:

c_storage_order

...

c_storage_order est utilisé pour spécifier qu'un tableaudevrait stocker son éléments utilisant la même présentation que celle utilisée par la primitive C ++ tableaux multidimensionnels, c’est-à-dire de la dernière dimension à la première. Ce est l'ordre de stockage par défaut pour les matrices fournies par cette bibliothèque.

Et en bas:

Cette bibliothèque est analogue à boost :: array en ce sens qu'elle augmente le style C Tableaux à N dimensions, comme le fait boost :: array pour les tableaux à C à une dimension

Ce qui signifie qu’il ajoute simplement le wrapper pour faciliter la déclaration et l’accès, mais sous le capot, cela ressemble à un tableau multidimensionnel standard.

As-tu essayé? Voyez-vous des problèmes?

MODIFIER

Comme il a été souligné auparavant, il semble s'agir d'un tableau 1D. Mais il semble que cela peut être consulté comme ceci:

#include <boost/multi_array.hpp>

void f( int * arr )
{
std::cout << __PRETTY_FUNCTION__ << " start" << std::endl;
for( int y = 0; y != 2; ++y )
{
for ( int x = 0; x != 4; ++x )
{
//  std::cout << arr[x][y] << "," ;  // compiler does not like
std::cout << arr[ x + ( y * 4 ) ] << "," ;
}
std::cout << std::endl;
}

std::cout << __PRETTY_FUNCTION__ << " end" << std::endl;
}

Et

void multi()
{
typedef boost::multi_array< int, 2 > arr_t;
typedef arr_t::index index;

arr_t a( boost::extents[2][4],  boost::c_storage_order() );

int v( 0 );

for ( index i = 0; i != 2; ++i )
for( index j = 0; j != 4; ++j )
{
a[i][j] = ++v;
}

v = 0;
for ( index i = 0; i != 2; ++i )
for( index j = 0; j != 4; ++j )
{
assert( a[i][j] == ++v );
}

for ( index i = 0; i != 2; ++i )
{
for( index j = 0; j != 4; ++j )
{
std::cout << a[i][j] << "," ;
}
std::cout << std::endl;
}

f( a.data() );
}

Sortie:

1,2,3,4,
5,6,7,8,
void f(int*) start
1,2,3,4,
5,6,7,8,
void f(int*) end