7

これに対する答えがどこにも見つからないようです。配列を配列の型の最大値に memset するにはどうすればよいですか? memset(ZBUFFER,0xFFFF,size)ZBUFFER が 16 ビットの整数配列である場合に機能すると思います。代わりに、全体で -1 を取得します。

また、この作業を可能な限り高速にすることを目的としているため (すべてのフレームを初期化する必要がある zbuffer です)、より良い方法 (さらに高速または高速) がある場合はお知らせください。

編集: 明確にするために、signed int 配列が必要です。

4

9 に答える 9

9

C++ では、std::fill と std::numeric_limits を使用します。

#include <algorithm>
#include <iterator>
#include <limits>

template <typename IT>
void FillWithMax( IT first, IT last )
{
    typedef typename std::iterator_traits<IT>::value_type T;
    T const maxval = std::numeric_limits<T>::max();
    std::fill( first, last, maxval );
}

size_t const size=32;
short ZBUFFER[size];
FillWithMax( ZBUFFER, &ZBUFFER[0]+size );

これは、どのタイプでも機能します。

Cではmemset、バイトの値を設定するのはやめた方がよいでしょう。char(ev. )以外のタイプの配列を初期化するには、手動ループunsignedに頼る必要があります。for

于 2013-04-11T11:58:44.140 に答える
7

-1 と 0xFFFF は、2 の補数表現を使用した 16 ビット整数では同じものです。short配列をではなくとして宣言したため、-1 しか得られませんunsigned short。または、値を出力するときに値を符号付きに変換しているためです。

ところで、 memset を使用してバイト以外のものを設定できるというあなたの仮定は間違っています。memset(ZBUFFER, 0xFF, size)同じことをしただろう。

于 2013-04-11T11:49:07.887 に答える
4

std::fillC++ では、アルゴリズムを使用して配列に値を入力できます。

std::fill(ZBUFFER, ZBUFFER+size, std::numeric_limits<short>::max());

これは、現在のアプローチよりも速くも遅くもありません。ただし、機能するという利点があります。

于 2013-04-11T11:59:04.777 に答える
2

これは2 の補数によるものです。unsigned short最大値を取得するには、配列タイプを に変更するか、 を使用する必要があります0x7FFF

于 2013-04-11T11:49:17.837 に答える
2
for (int i = 0; i < SIZE / sizeof(short); ++i) {
    ZBUFFER[i] = SHRT_MAX;
}

これは最後の数バイトを初期化しないことに注意してください。if (SIZE % sizeof(short))

于 2013-04-11T11:58:50.250 に答える
0
#include <algorithm>
#include <limits>

std::fill_n(ZBUFFER, size, std::numeric_limits<FOO>::max())

の要素FOOの型です。ZBUFFER

于 2013-04-11T12:01:39.023 に答える
0

「memset」と言うとき、実際にその機能を使用する必要がありますか? これはバイト単位の割り当てにすぎないため、符号付き配列では機能しません。

各値を最大値に設定したい場合は、次のように使用します。

std::fill( ZBUFFER, ZBUFFER+len, std::numeric_limits<short>::max() )

whenlenは要素の数です (配列のバイト単位のサイズではありません)

于 2013-04-11T12:01:47.503 に答える