charとshortの比較

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
ななし

charとshortの比較

#1

投稿記事 by ななし » 14年前

char[2]とshortを比較の方法を教えてください。


short s = 0x3031;
char c[2] = {0x30, 0x31};

if(memcmp(s, c, 2) == 0)
{
 printf("sとcは同じです。\n");
}

上記のようにコーディングすると、memcmpでエラーが出ます。
エラー:makes pointer from integer without a cast

さかまき

Re:charとshortの比較

#2

投稿記事 by さかまき » 14年前

sじゃなくて&sにする必要があります。
私のインテルはいってるPCでは
short s = 0x3130;
char c[2] = {0x30, 0x31};

if(memcmp(&s, c, 2) == 0)
{
printf("sとcは同じです。\n");
}

で「同じです」になります。

softya

Re:charとshortの比較

#3

投稿記事 by softya » 14年前

メモリの比較はエンディアンなどの問題で環境依存しますので、数値比較はmemcmpしない方が良いです。
if( c[0]==((s>>8)&0xff) && c[1]==(s&0xff) ) {
 printf("sとcは同じです。\n");
}
にすべきです。
まぁ、無理やり出来なくないですがWindowsパソコンだと確実に"sとcは同じです"にはなりません。

さかまきさんの方法は、エンディアンに完全に依存した書き方ですので、よく分からないなら使うべきではありません(確実にバグの温床になります)。
画像

たかぎ

Re:charとshortの比較

#4

投稿記事 by たかぎ » 14年前

どんな目的でどんな比較をしたいのかによるでしょう。
まずはhttp://dixq.net/board/board.htmlを熟読して、必要な情報を補足してください。

フェアレディ

Re:charとshortの比較

#5

投稿記事 by フェアレディ » 14年前

>さかまきs
回答ありがとうございます。
sと&sにすることでエラーは消えました。
ただ、char配列とshortのビットの並び順が同じで比較したいです。
言葉不足ですみません。


>softyas
1バイトずつ比較する方法で、問題を解決することが出来ました。
ありがとうございます。
また、エンディアンといった環境依存について教えていただきありがとうございます。


>たかぎs
「規約と注意事項」を読まずに投稿してしまいました。
指摘していただきありがとうございます。
今後とも、よろしくお願い致します。 画像

さかまき

Re:charとshortの比較

#6

投稿記事 by さかまき » 14年前

>ただ、char配列とshortのビットの並び順が同じで比較したいです。
>言葉不足ですみません。

エンディアンの関係で、私のインテルはいってるPCでは
char c[2] = {0x30, 0x31};
と同じであるには
short s = 0x3031;
ではなくて
short s = 0x3130;
ですよという意味合いで書きました。
結果が「同じです」にならないだけですので、どのように比較されても結構だと思います。

たかぎ

Re:charとshortの比較

#7

投稿記事 by たかぎ » 14年前

> 「規約と注意事項」を読まずに投稿してしまいました。
> 指摘していただきありがとうございます。

そう思うなら、どうして是正しないのでしょうか?

toyo

Re:charとshortの比較

#8

投稿記事 by toyo » 14年前

適当な名前は規約に従って修正されたようです
環境に依存する場合なので使っているOS名・コンパイラ名・ライブラリ名も明記しましょう。

閉鎖

“C言語何でも質問掲示板” へ戻る