掲示板利用宣言

 次のフォームをすべてチェックしてからご利用ください。

 私は

 題名と投稿者名は具体的に書きます。
 課題の丸投げはしません。
 ソースの添付は「HTML変換ツール」で字下げします。
 返信の引用は最小限にします。
 環境(OSとコンパイラ)や症状は具体的に詳しく書きます。
 返信の付いた投稿は削除しません。
 マルチポスト(多重投稿)はしません。

掲示板2

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧

No.26437

C++でも構造体はありますが
投稿者---RingBuffer(2006/03/17 21:00:47)


質問ではないのですが、
構造体を(char *) でキャストしようとしたら怒られますね。

まあ、そんなものかもしれませんが。
メモリヘの配置はどうなっているのでしょうね?
Cと同じ構造なら、キャストさせてくれても良いと思うのですが。


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:C++でも構造体はありますが 26438 επιστημη 2006/03/17 22:09:41
<子記事> Re:C++でも構造体はありますが 26442 si 2006/03/17 23:53:27


No.26438

Re:C++でも構造体はありますが
投稿者---επιστημη(2006/03/17 22:09:41)


>構造体を(char *) でキャストしようとしたら怒られますね。
>
>まあ、そんなものかもしれませんが。
>メモリヘの配置はどうなっているのでしょうね?
>Cと同じ構造なら、キャストさせてくれても良いと思うのですが

struct foo {
 int x;
 int y;
};

int main() {
 struct foo f;
 char* p = (char*)f;
 return 0;
}

> cl foo.c
foo.c(8) : error C2440: '型キャスト' : 'foo' から 'char *' に変換できません。

Cでも怒られますよ?



この投稿にコメントする

削除パスワード

No.26442

Re:C++でも構造体はありますが
投稿者---si(2006/03/17 23:53:27)


#include <stdio.h>
struct foo {
  int x;
  int y;
};

int main() {
  struct foo f = {0x12345678,0x9ABCDEF1};
  unsigned char* s = (unsigned char*)&f;
  printf("%x %x\n",f.x,f.y);
  printf("%02x %02x %02x %02x  %02x %02x %02x %02x\n",
    *s++,*s++,*s++,*s++,*s++,*s++,*s++,*s++);
  return 0;
}



この投稿にコメントする

削除パスワード

No.26443

Re:C++でも構造体はありますが
投稿者---YuO(2006/03/18 00:14:36)


  printf("%02x %02x %02x %02x  %02x %02x %02x %02x\n",
    *s++,*s++,*s++,*s++,*s++,*s++,*s++,*s++);


えーっと,結果が予想できないのですけど……。
# 副作用完了点に到達しない間の複数のs++は未定義動作だから。

とりあえず,Visual C++ 2005での出力が
12345678 9abcdef1
9a bc de f1  12 34 56 78
だったりすることはsiさんの予想どおりなのでしょうか……?
12345678 9abcdef1
78 78 78 78  78 78 78 78
と出力されても私は驚きませんけどね。
# そのくらいなら予想される範囲内ですし。


この投稿にコメントする

削除パスワード

No.26445

Re:C++でも構造体はありますが
投稿者---si(2006/03/18 00:31:47)


>
  printf("%02x %02x %02x %02x  %02x %02x %02x %02x\n",
    *s++,*s++,*s++,*s++,*s++,*s++,*s++,*s++);

>
>えーっと,結果が予想できないのですけど……。
># 副作用完了点に到達しない間の複数のs++は未定義動作だから。
>
>とりあえず,Visual C++ 2005での出力が
>
12345678 9abcdef1
9a bc de f1  12 34 56 78
だったりすることはsiさんの予想どおりなのでしょうか……?
>
12345678 9abcdef1
78 78 78 78  78 78 78 78
と出力されても私は驚きませんけどね。
># そのくらいなら予想される範囲内ですし。
素早いツッコミありがとうございます。s[0],s[1],... が面倒だったのでつい
上記の様にコピペでやりました。
gcc だと動いてしまうんで、ついつい、こんな書き方いつもしてしまうんですよ。


この投稿にコメントする

削除パスワード

No.26446

Re:C++でも構造体はありますが
投稿者---si(2006/03/18 00:34:35)


#include <iostream>
using namespace std;
struct foo {
  int x;
  int y;
};

int main() {
  struct foo f = {0x12345678,0x9ABCDEF1};
  unsigned char* s = (unsigned char*)&f;
  cout << hex << f.x << f.y << endl;
  cout << static_cast<unsigned>(*s++) << static_cast<unsigned>(*s++)
   << static_cast<unsigned>(*s++) << static_cast<unsigned>(*s++)
   << static_cast<unsigned>(*s++) << static_cast<unsigned>(*s++) 
   << static_cast<unsigned>(*s++) << static_cast<unsigned>(*s++) << endl;
  return 0;
}
c++ はまったくの、ど素人なのですが、こんな書き方アリですか?



この投稿にコメントする

削除パスワード

No.26447

Re:C++でも構造体はありますが
投稿者---επιστημη(2006/03/18 00:55:40)


> c++ はまったくの、ど素人なのですが、こんな書き方アリですか?

「アリ」とは? 正しく動く保証はないでしょね。

#include <iostream>
#include <algorithm>
#include <iterator>

using namespace std;

struct foo {
 int x;
 int y;
};

int main() {
 struct foo f = {0x12345678,0x9ABCDEF1};
 unsigned char* s = (unsigned char*)&f;
 cout << hex << f.x << f.y << endl;
 copy(s, s+sizeof(foo), ostream_iterator<unsigned>(cout,""));
 return 0;
}



この投稿にコメントする

削除パスワード

No.26459

Re:C++でも構造体はありますが(訂正コード)
投稿者---si(2006/03/19 14:54:36)


取り敢えずまともな表示が出る様にコード訂正します。
Linux, g++ 4.1
#include <iostream>

using namespace std;
struct foo {
  int x;
  int y;
};

int main() {
  struct foo f = {0x12345678,0x9ABCDEF1};
  unsigned char* s = (unsigned char*)&f;
  cout << hex << f.x << " " << f.y << endl;
  int i;
  for ( i = 0; i < sizeof(struct foo); i++)
    cout << static_cast<unsigned>(*s++) << " ";
  
  cout << endl;
  return 0;
}




この投稿にコメントする

削除パスワード

No.26448

Re:C++でも構造体はありますが
投稿者---si(2006/03/18 00:59:01)


私って馬鹿ですね。
やっと、YuO さんのツッコミの意図が分かりました。

printf("%02x %02x %02x %02x %02x %02x %02x %02x\n", s[0],s[1],s[2],s[3],s[4],s[5],s[6],s[7]);

私の環境で期待される表示
12345678 9abcdef1
78 56 34 12 f1 de bc 9a

# g++のコードも同様大きな間違いをしてますね。


この投稿にコメントする

削除パスワード

管理者用メニュー    ツリーに戻る    携帯用URL    ホームページ    ログ    タグ一覧