2016-12-29 1 views
1

J'ai dans mon programme C++ non signé tableau de caractères des valeurs hexagonales:tableau unsigned char C de la longueur

unsigned char buff[] = {0x03, 0x35, 0x6B}; 

Et je voudrais calculer la taille de ce tableau afin que je puisse l'envoyer sur linux port UART utilisant cette fonction:

if ((count = write(file,buff,length))<0) 
{ 
    perror("FAIL to write on exit\n"); 
} 

comme je peux voir la longueur est un nombre entier, et buff est un tableau qui peut changer de taille pendant l'exécution du programme. quelqu'un peut-il m'aider comment l'écrire. Merci

+0

'buff' ne peut pas changer sa taille pendant l'exécution du programme. Il est initialisé avec un littéral et aura une longueur de 3 toujours – StoryTeller

+0

Les * valeurs * ne sont pas hexadécimales, vous les avez seulement écrites en notation hexadécimale. '{3, 53, 107}' est exactement équivalent, tout comme '{03, 065, 0153}'. – molbdnilo

+0

@Story Teller Ceci est seulement un exemple, buff peut avoir différents nombres de valeurs stockées en lui. – Ns2100

Répondre

0

Vous pouvez le faire avec un tableau:

size_t size = sizeof array; 

avec votre exemple qui donne:

ssize_t count = write(file, buff, sizeof buff); 
if (count < 0 || (size_t)count != sizeof buff) { 
    perror("FAIL to write on exit\n"); 
} 

Note: J'utilise C sémantique parce écriture est de lib C.


En C++, vous pouvez utiliser le modèle pour vous assurer que vous utilisez sizeof avec un tableau.

template<typename T, size_t s> 
size_t array_sizeof(T (&array)[s]) { 
    return sizeof array; 
} 

avec votre exemple qui donne:

ssize_t count = write(file, buff, array_sizeof(buff)); 
if (count < 0 || static_cast<size_t>(count) != array_sizeof(buff)) { 
    perror("FAIL to write on exit\n"); 
} 
+0

Merci, cela a résolu mon problème. – Ns2100

+0

Cela échoue pour les pointeurs. – jww

+0

@jww Je dis clairement "avec un tableau". Et bien sûr avec un pointeur, il n'y a aucun intérêt à le faire! Non cela ne "échoue" pas avec le pointeur. Cela conduit à un résultat différent. Avec un but différent. Je réponds juste avec le ** contexte ** de la question. – Stargateur

5

Comme l'une des options pour obtenir le nombre d'éléments vous pouvez utiliser ce modèle:

template<typename T, size_t s> 
size_t arrSize(T(&)[s]) 
{ 
    return s; 
} 

Et appeler ensuite:

auto length = arrSize(buff); 

Ceci pourrait être utilisé dans le code pour différents types de tableaux.

Dans le cas de taille de tableau, vous voulez dire son octets taille totale vous pouvez simplement utiliser le sizeof(buff). Ou, comme d'autres ont suggéré que vous pouvez utiliser std::array, std::vector ou tout autre contenant au lieu et écrire un aide comme ceci:

template<typename T> 
size_t byteSize(const T& data) 
{ 
    typename T::value_type type; 
    return data.size() * sizeof(type); 
} 

ensuite d'acquérir la taille d'octet réel des données que vous pouvez simplement appeler:

std::vector<unsigned char> buff{0x03, 0x35, 0x6B}; 
auto bSize = byteSize(buff); 
+0

Merci pour votre aide. – Ns2100

+3

Note: c'est mieux que la méthode 'sizeof array/sizeof * array', car elle échouera toujours à compiler si vous l'appelez avec quelque chose qui a un opérateur' * 'mais qui n'est pas un tableau. L'autre méthode compilera et donnera silencieusement des résultats erronés. – Quentin

+0

@Stargateur Merci pour la note, fixe que – Dusteh

2

Si vous utilisez C++ 11 vous pourriez penser à passer à

#include <array> 
std::array<char, 3> buff{ {0x03, 0x35, 0x6B} }; 

qui offre une interface comme std::vector (y compris size & data) pour les tableaux fixes. L'utilisation de array peut empêcher certaines erreurs habituelles et offrir certaines fonctionnalités couvertes par <algorithm>.

L'appel à write sera alors:

write(file,buff.data(),buf.size()) 
+0

Bon conseil, mais notez que '' fonctionne aussi avec des tableaux de style C. – Quentin

+0

ne répond pas à l'OP, cela donne le nombre d'elem l'op veut la taille en octets. – Stargateur

+0

taille en octet et la taille est égale en cas de char.En utilisant un autre type, vous pouvez utiliser la multiplication avec size_type – Totonga

-1

Et je voudrais calculer la taille de ce tableau afin que je puisse l'envoyer sur linux port UART utilisant cette fonction ...

Vous avez besoin d'une macro ou d'une fonction COUNTOF. Ils peuvent être difficiles à obtenir dans tous les cas. Par exemple, la réponse acceptée ci-dessous s'échouer en mode silencieux lorsque vous travaillez avec des pointeurs:

size_t size = sizeof array; 
size_t number_element = sizeof array/sizeof *array; 

Microsoft Visual Studio 2005 a intégré dans la classe macro ou un modèle appelé _countof. Il gère tous les cas correctement. Consultez également la documentation _countof Macro sur MSDN.

Sur les systèmes non Microsoft, je crois que vous pouvez utiliser quelque chose comme ce qui suit. Il gère des pointeurs correctement (à partir making COUNTOF suck less):

template <typename T, size_t N> 
char (&ArraySizeHelper(T (&arr)[N]))[N]; 
#define COUNTOF(arr) (sizeof(ArraySizeHelper(arr))) 

void foo(int primes[]) { 
    // compiler error: primes is not an array 
    std::cout << COUNTOF(primes) << std::endl; 
} 

Une autre bonne référence est Better array 'countof' implementation with C++ 11. Il discute des façons de faire les choses de façon incorrecte, et comment faire les choses correctement sous différents compilateurs, comme Clang, ICC, GCC et MSVC. Il inclut l'astuce de Visual Studio.


buff est un tableau qui peut changer la taille lors de l'exécution du programme

Tant que vous avez les données au moment de la compilation, la macro ou la fonction countof devrait fonctionner. Si vous construisez des données à la volée, cela ne fonctionnera probablement pas.


Ceci est étroitement lié: Common array length macro for C?. Cela peut même être un doublon.

+0

ne répond pas à l'OP, cela donne le nombre d'élem que l'op veut la taille en octets. – Stargateur