Comment peut être un tableau de double (1D) stocké en utilisant un tampon de protocole? Qu’en est-il des tableaux denses multidimensionnels (2D ou 3D)?
Un tableau de double serait mieux stocké via
repeated double foo = 5 [packed=true];
repeated
fait agir comme une liste, permettant plusieurs elements; packed
évite un en-tête par article.
Il n’y a pas de support direct pour les tableaux rectangulars (ou supérieurs) dans protobuf. Le plus proche est de stocker quelque chose comme:
repeated innerType foo = 5; // note, can't be "packed" message innerType { repeated double foo = 1 [packed=true]; }
cela ressemble en gros à un tableau en dents de scie, mais avec un élément entre chaque niveau.
On pourrait simplement imiter la disposition de la mémoire C / C ++:
message DoubleMasortingx { required uint32 rows = 1; required uint32 cols = 2; repeated double data = 3 [packed=true]; }
Pour accéder aux données, utilisez les data[i*cols+j]
(ligne principale) ou les data[i+rows*j]
(colonne principale). Pour les masortingces carrées, un seul des rows
/ rows
doit être stocké. Techniquement, même dans le cas rectangular, protobuf connaîtra la longueur des données et l’autre valeur pourra être déduite.
Pour plus de facilité, on double MasortingxAdapter::get(int row, int col)
probablement Masortingx en C ++ avec une classe Adapter permettant l’access via double MasortingxAdapter::get(int row, int col)
; il pourrait également vérifier data_size()==rows()*cols()
.