2017-04-14 7 views
1

charにintを代入するとこの問題が発生します。 私はconst char * データを持っています。これはdifferentsオブジェクトのサイズの記憶域のように機能します。 データがオブジェクトと同じサイズを持っているかどうかを確認するためにこれを使用して、次に整数をデータに追加します。 問題は、私は私が にデータ、ASCIIテーブル内の2つの位置を移動しますが、どのようにデータ列として振る舞いを追加するとき、私はこのほかにどのように機能するかを理解できないことを期待ということ、です。int charに追加すると、期待通りに動作しません

例:私は、char「と `」保存のconstのchar *データを持っている、と私は作る場合には、96の値を持っている:

data += 2; 

が、私は結果がであることを期待しますBが、値60

私が起こるかを示すために、関数SYS_LOGを使用して<です。

機能ブート:

 void Boot(const char* data){ 
    [...] 
    /* 
    * OBJECT PROTO 
    */ 

    sys_log(0, "BOOT: OBJ PROTO data string: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO size of data: %d", decode_2bytes(data)); 

    if (decode_2bytes(data) != sizeof(TObjectProto)) 
    { 
     sys_err("object proto table size error"); 
     thecore_shutdown(); 
     return; 
    } 
    sys_log(0, "BOOT: OBJ PROTO data after decode_2bytes(data): data = %s", data); 
    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 

    size = decode_2bytes(data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", size); 

    data += 2; 
    sys_log(0, "BOOT: OBJ PROTO data str + 2: data = %s", data); 
    sys_log(0, "BOOT: OBJ PROTO data to size: size = %d", decode_2bytes(data)); 

    CManager::instance().LoadObjectProto((TObjectProto *) data, size); 

    sys_log(0, "To data assign %d * %d", size, sizeof(TObject)); 
    data += size * sizeof(TObjectProto); 
    sys_log(0, "BOOT: OBJ PROTO data str: data = %s", data); 

    [...] 

decode_2bytes():

inline WORD decode_2bytes(const BYTE *a) 
{ 
    return (*((WORD *) a)); 
} 

SYS_LOG:

Apr 12 09:05:54.205886 :: BOOT: OBJ PROTO data string: data = ` 
Apr 12 09:05:54.205914 :: BOOT: OBJ PROTO size of data: 96 
Apr 12 09:05:54.205924 :: BOOT: OBJ PROTO data after decode_2bytes(data): data = ` 
Apr 12 09:05:54.205933 :: BOOT: OBJ PROTO data str + 2: data = < 
Apr 12 09:05:54.205948 :: BOOT: OBJ PROTO data to size: size = 60 
Apr 12 09:05:54.205961 :: BOOT: OBJ PROTO data str + 2: data = ½6 
Apr 12 09:05:54.205970 :: BOOT: OBJ PROTO data to size: size = 14013 
Apr 12 09:05:54.209238 :: To data assign 60 * 40 
Apr 12 09:05:54.209247 :: BOOT: OBJ PROTO data str: data = (

SYS_LOGで見ることができるように、私は値、データが含まれているかを示します、2を加えたときに得られる結果。

+1

逆参照された値ではなく、ポインタに2を追加しているようです。 – Nattrass

+0

あなたは何も追加していません。ポインタを動かしています。 ASCIIでは、バックティックは96、 '<'は60です。あなたのバッファは '{96,0,60,0,171,54、...}で始まります。 (そして、バイナリデータを文字列として出力しようとしています。)[The Definitive C++ Book Guide and List](http://stackoverflow.com/questions/388242/the-definitive-c-book-guide-and-list)をお勧めします。 – molbdnilo

+0

あなたは 'data'がポインタであることを忘れているようです。あなたは2つをポインタに追加しています。 –

答えて

2

data + = 2;

私は結果をbすることを期待するだろうが、<は、それが<ある文字列の3番目の文字を指しますので、あなただけの、2でポインタをインクリメント値60

であります。文字列がそれより前に終わってしまった場合は、ランダムな値になることさえあります。

*data += 2; 

しかしdataconst char*として宣言されているので、これは、コンパイラエラーをトリガします:

ポインタが指すことをインクリメントするには、間接参照ポインタに持っています。

文字列を変更する場合は、パラメータをchar* dataに変更します。

+0

'* data + = 2'は' while(* data ++) 'のように、最初にポインタをインクリメントして逆参照すると考えましたか? –

+0

@Stephanまず、ポインタを逆参照し、次にポイントされた値をインクリメントします。 – zett42

+0

はい、そうです。私はちょうど '* data + = 1'が' * data ++ 'とは異なるものであることを知りました... –