2016-12-29 8 views
1

++進値のプログラムunsigned char型の配列:私はCを持っているC++のunsigned char配列の長さ

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

そして私は、私が使用してUARTポートのLinux上でそれを送ることができるように、この配列のサイズを計算したいと思いますこの関数は:

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

私は長さがintであることがわかりますが、buffはプログラム実行中にサイズを変更できる配列です。 誰でも私にそれを書く方法を助けることができます。おかげであなたは配列でこれを行うことができ

+0

'buff'はプログラム実行中にサイズを変更できません。これはリテラルで初期化され、長さは常に3です – StoryTeller

+0

*値*は16進ではなく、16進表記で書かれています。 '{3、53、107}'はまったく同じで、 '{03、065、0153}'も同様です。 – molbdnilo

+0

@Story Tellerこれは一例に過ぎず、バフは彼に格納されている値の数を変えることができます。 – Ns2100

答えて

0

size_t size = sizeof array; 

あなたの例で与える:

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

注:書き込みはLIB Cから


あるので、私はCは、セマンティックを使用C++で

、あなたは、配列でsizeofを使用することを確認するためにテンプレートを使用することができます。

与えるあなたの例で
template<typename T, size_t s> 
size_t array_sizeof(T (&array)[s]) { 
    return sizeof array; 
} 

:オプションの1つとして

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

ありがとう、これは私の問題を解決しました。 – Ns2100

+0

これはポインタでは失敗します。 – jww

+0

@jww私は明らかに「配列あり」と言っています。もちろん、ポインタを使用すると、それを行う必要はありません!いいえ、ポインタで「失敗」しません。これは別の結果につながります。異なる目的で。私はちょうど質問のコンテキスト**で答えます。 – Stargateur

5

をあなたは、このようなテンプレートを使用することができます要素の数を取得する:

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

、その後呼び出しを:

auto length = arrSize(buff); 

これは、さまざまな配列タイプのコード全体で使用できます。

配列サイズの場合は、の合計バイトサイズを使用することができます。sizeof(buff)を使用することができます。それとも他の人があなたの代わりにstd::arraystd::vectorや他のコンテナを使用して、このようなヘルパーを書くことができます示唆されているように:

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

次に、データの実際のバイトサイズを取得するために、あなたは簡単に呼び出すことができます。

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

ご協力いただきありがとうございます。 – Ns2100

+3

注:これは 'sizeof array/sizeof * array'メソッドよりも優れています。なぜなら、演算子' * 'を持つが配列ではないものを呼び出すと、コンパイルに失敗するからです。他の方法はコンパイルして、間違った結果を静かに伝えます。 – Quentin

+0

@Stargateurノートをありがとう、ありがとう、 – Dusteh

2

あなたがC++ 11を使用している場合には(含むstd::vectorのようなインターフェースを提供しています

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

に切り替えると思うかもしれませんsize & data)。 arrayを使用すると、いくつかの一般的なエラーを防止し、<algorithm>によってカバーされ、いくつかの機能を提供するかもしれません。

writeへの呼び出しはその後、次のようになります。

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

素晴らしいアドバイスだが、 ''もCスタイルの配列で動作することに注意してください。 – Quentin

+0

は、OPをアンサーしません。 – Stargateur

+0

charの場合、バイトとサイズのサイズは同じです。他のタイプを使用すると、size_typeの乗算を使用することができます。 – Totonga

-1

そして私は、私はこの機能を使用してUARTポートのLinux上でそれを送ることができるように、この配列のサイズを計算したいと思います...

COUNTOFマクロまたは機能が必要です。すべてのケースで正しいようにするのは難しいことです。ポインタを操作する場合、例えば以下のように受け入れ答えは静かに失敗します:

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

のMicrosoft Visual Studio 2005が組み込まれてい_countofというマクロまたはテンプレートクラス。すべてのケースを適切に処理します。また、MSDNの_countof Macroのドキュメントを参照してください。

Microsoft以外のシステムでは、次のようなものを使用することができます。

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; 
} 

もう一つの良いリファレンスがBetter array 'countof' implementation with C++ 11である:それは(making COUNTOF suck lessから)適切にポインタを処理します。 Clang、ICC、GCC、MSVCなどのさまざまなコンパイラの下で、正しく動作させる方法と、正しく動作させる方法について説明しています。 Visual Studioのトリックが含まれています。


バフは、限り、あなたはコンパイル時にデータを持っているように、プログラムの実行

時のサイズを変更することができます​​マクロや関数が動作するはず配列です。データをオンザフライで構築している場合は、おそらく動作しません。


これは密接に関連しています:Common array length macro for C?。重複している場合もあります。

+0

はOPをアンサーしません。 – Stargateur

関連する問題