2011-11-19 11 views
2

複数のデータ型をデータ型変数、たとえばchar *に格納することは可能ですか?データに複数の型が埋め込まれています

この例では、val1(整数)、val3(val5)(chars)を出力しますが、2番目の整数は0、floatは0.00を出力します。

これを行う方法の手がかりはありますか?

助けてください。

#include <iostream> 

static void printData(char *what) { 

    int val1, val2, counter = 0; 
    char val3, val4, val5; 
    float val6; 

    val1 = *((int *)what+counter); 
    counter += sizeof(int); 
    val2 = *((int *)what+counter); 
    counter += sizeof(int); 
    val3 = *((char *)what+counter); 
    counter += sizeof(char); 
    val4 = *((char *)what+counter); 
    counter += sizeof(char); 
    val5 = *((char *)what+counter); 
    counter += sizeof(char); 
    val6 = *((float *)what+counter); 

    printf("val1 = %d, val2 = %d, val3-5 = %c%c%c, val6 = %.2f", val1, val2, val3, val4, val5, val6); 

} 

int main (int argc, const char *argv[]) { 

    char *data = (char *)malloc((sizeof(int) * 2) + (sizeof(char) * 3) + sizeof(float)); 

    int integer = 4, secondInteger = 56; 
    char test[3] = { 't', 'e', 's' }; 
    float floatValue = 3.14f; 

    int counter = 0; 

    *(data) = integer; 
    counter += sizeof(int); 
    *(data + counter) = secondInteger; 
    counter += sizeof(int); 
    *(data + counter) = test[0]; 
    counter += 1; 
    *(data + counter) = test[1]; 
    counter += 1; 
    *(data + counter) = test[2]; 
    counter += 1; 
    *(data + counter) = floatValue; 

    printData(data); 

    return 0; 
} 

答えて

1

Hmmm malloc quirks。私は私のマシンでこれを試してみるとき、私はあなたと同じことを得る。奇妙なことですが、ポインタのインクリメントの外側にキャストを移動すると、secondInteger(56)の正しい値が得られますが、floatValueの値は0.00です。この動作を説明するものは本当にわかりませんが、バイトアライメントと関係があります。私はもっ​​とそれについて考える必要があります。 AIBのよう

#include <iostream> 

static void printData(char *what) { 

    int val1, val2, counter = 0; 
    char val3, val4, val5; 
    float val6; 

    val1 = *(int*)(what+counter); 
    counter += sizeof(int); 
    val2 = *(int*)(what+counter); 
    counter += sizeof(int); 
    val3 = *(char*)(what+counter); 
    counter += sizeof(char); 
    val4 = *(char*)(what+counter); 
    counter += sizeof(char); 
    val5 = *(char*)(what+counter); 
    counter += sizeof(char); 
    val6 = *(float*)(what+counter); 

    printf("val1 = %d, val2 = %d, val3-5 = %c%c%c, val6 = %.2f", val1, val2, val3, val4, val5, val6); 

} 

、私は構造体を使用することを言うだろうが、あなたはmalloc関数を使用していることから、おそらく構造体を使用することをすでに知っていて、ちょうどそれがこの挙動を示す理由は、これを求めている:)

+0

うん、かなり多くの。私はそれらを使うことができると知っていますが、彼らは質問の目的を破り、なぜすべての値を印刷するのではなく、なぜこれを行うのでしょうか。 –

0

ええ、structを使用する方がはるかに簡単です。

あなたの例は私のコンパイラで動作しているようですが、私は標準コンプライアンス(未定義の動作など)のために校正するのが面倒です。それはstruct :)を使用する別の理由です。

0

これはC++のタグがついているので、クラスについて学ぶことをお勧めします。ここでclassにコードを置く作業を開始するための1つの方法は次のとおりです。

#include <iostream> 
#include <iomanip> 
#include <string> 

class data 
{ 
private: 
    int first_int_; 
    int second_int_; 
    std::string chars_; 
    float float_value_; 

public: 
    data(int first_int, int second_int, const std::string& chars, float float_value) 
     :first_int_(first_int) 
     ,second_int_(second_int) 
     ,chars_(chars) 
     ,float_value_(float_value) 
    { 
    } 

    void print(std::ostream& os) const 
    { 
     os << "val1 = " 
      << first_int_ 
      << ", val2 = " 
      << second_int_ 
      << ", val3-5 = " 
      << chars_ 
      << ", val6 = " 
      << std::setprecision(3) 
      << float_value_ 
      << std::endl; 
    } 
}; 

int main() 
{ 
    data d(4, 56, "tes", 3.14f); 
    d.print(std::cout); 
    return 0; 
} 

See how they run!