10

これは私が書き込もうとしているコードです:

#include <stdio.h>
#include <math.h>
#include <stdlib.h>
#include <string.h>
#include <malloc.h>

int main(int argc, char *argv[])
{
    float arry[3] = {0};

    memset(arry, (int) 10.0, 3*sizeof(float));

    return 0;
}

私の問題は、memsetを使用して、配列のすべてのエントリを0以外の数値にすることができるかどうかを確認したいということです。ただし、その行をステップ実行すると、配列の内容が非常に小さい数値(0)に変わります。この場合、memset()関数を使用して何が間違っているのだろうか。私がこれを入力しているときに提案された関連する質問のどれもそうではないように見えるので、これが重複した投稿ではないことを願っています。

4

5 に答える 5

15

Memsetはintを受け取りますが、それをunsigned charにキャストし、floatの各バイト(sizeof(float)はおそらく4)をそのビットパターンで埋めます。これがC++の場合は、代わりに塗りつぶしを選択してください。

#include <algorithm>
using namespace std;

//...

fill (arry,arry+3,10.0);
于 2009-06-24T18:32:20.563 に答える
10

doubleをintにキャストすると、2進数00001010(2進数では10)が作成され、それがmemsetされた値になります。これはcharであるため、各フロートは実際にビットパターン00001010 000010100000101000001010を受信して​​います。

于 2009-06-24T18:26:59.807 に答える
8

いいえ。memsetは1バイトを取り、それを配列に書き込みます。floatはマルチバイトタイプです。

編集:はい、私はmemsetがintを取ることを知っています。ただし、unsigned char(1バイト)のみを使用して入力します。

于 2009-06-24T18:26:30.930 に答える
3

実際、あなたの試みは少し誤解を招きます。memsetはバイトで機能します。実際にmemset値にfloatを使用しても、意味がありません。

float形式には仮数用に23+1ビット、指数用に8ビットがあります。float内に生のバイト値(memsetを使用)を書き込む場合、で解釈される値を設定しているため、何を取得しているかわかりません。別の方法!

スニペットでは、10.0fを含む4バイトのfloatを値10を含む4バイト整数に変換する(int)にもキャストします。ただし、前述のように、floatを10(= 0x0a)でmemsetすると、最終的に、float形式で10.0fではない0x0A0A0A0Aを取得します。これは、任意の値にすることができます(また、あなたの場合のように、0に非常に近い値)。

実際memsetには、charの配列を初期化する場合(1バイトの長さであるためすべてのcharの値を効果的に取得するため)、またはすべての基本的な種類のデータで機能するすべてを0(NULL)に設定する場合に役立ちます。 。

于 2009-06-24T18:44:51.447 に答える