【掲示板ご利用上の注意】

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

 詳しくはこちら


本当はこんなに大きく書きたくはないのですが、なかなか守っていただけなくて…。
 守ってくださいね。お願いします。(by管理人)

C言語ソース⇒HTML形式ツール掲示板2こちら


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

No.23131

キャストについて
投稿者---tanaka(2005/09/19 00:03:31)


初めて登校させて頂きます。tanakaと申します。よろしくお願いします。

ソースは以下で、sample構造体のメンバのb[6]に16進数で値を代入して、
今度は、b[6]の4番目と5番目を連結させた物を、sample構造体のメンバの
cに代入したいのですが、上手くいきません。連結させた値が正しい事まで
は確認できたのですが、キャストした値が予期しない値を表示してしまうの
でキャスト部分がおかしいとは思うのですが、よくわからず困っています。
どなたか、ご教授願えませんでしょうか。
<pre>struct sample{
unsigned char b[6];
unsigned short c;
};


unsigned char *strcat(unsigned char *str1, unsigned char *str2){
register *p = str1;

str1++;
while(*str1++ = *str2++);

return str1;
}

int main(){
struct sample a*;
unsigned char *s1;
unsigned char *s2;

a->b[0] = 0x01;
a->b[1] = 0x02;
a->b[2] = 0x03;
a->b[3] = 0x04;
a->b[4] = 0x05;
a->b[5] = 0x06;

s1 = &a->b[4];
s2 = &a->b[5];

/* ここでキャスト */
a->c = (unsigned short)strcat(s1, s2);

/* 値を確認 */
printf(&quot;%#x\n&quot;, a-&gt;);
/*↑ここで表示される値が予想していた0x0506ではなく
想定外の値が表示される*/
}
</pre>


この投稿にコメントする

削除パスワード

発言に関する情報 題名 投稿番号 投稿者名 投稿日時
<子記事> Re:キャストについて 23132 επιστημη 2005/09/19 00:14:07
<子記事> Re:キャストについて 23133 nop 2005/09/19 00:31:36


No.23132

Re:キャストについて
投稿者---επιστημη(2005/09/19 00:14:07)


>unsigned char *strcat(unsigned char *str1, unsigned char *str2){
> register *p = str1;
>
> str1++;
> while(*str1++ = *str2++);
>
> return str1;
>}

# pを使っていませんけども。
この関数、文字列str2をstr+1以降にコピーしてその終端を返してますが、それでいいのかしら?



この投稿にコメントする

削除パスワード

No.23134

Re:キャストについて
投稿者---tanaka(2005/09/19 00:32:04)


>>unsigned char *strcat(unsigned char *str1, unsigned char *str2){
>> register *p = str1;
>>
>> str1++;
>> while(*str1++ = *str2++);
>>
>> return str1;
>>}
>
># pを使っていませんけども。
>この関数、文字列str2をstr+1以降にコピーしてその終端を返してますが、それでいいのかしら?

すみません。ご指摘の通りです。

unsigned char *strcat (unsigned char *str1, unsigned char *str2) {
register *p = str1;
p++;

while(*p++ = *str1++);

return str1;
}

です。よろしくお願いします。




この投稿にコメントする

削除パスワード

No.23139

Re:キャストについて
投稿者---επιστημη(2005/09/19 08:13:21)


>unsigned char *strcat (unsigned char *str1, unsigned char *str2) {
> register *p = str1;
> p++;
>
> while(*p++ = *str1++);
>
> return str1;
>}
>
>です。よろしくお願いします。

元発言にあったコードでは文字列の終端('\0')がないので
この関数がまともに動くとは思えません。




この投稿にコメントする

削除パスワード

No.23140

Re:キャストについて
投稿者---tanaka(2005/09/19 08:25:02)


>>unsigned char *strcat (unsigned char *str1, unsigned char *str2) {
>> register *p = str1;
>> p++;
>>
>> while(*p++ = *str1++);
>>
>> return str1;
>>}
>>
>>です。よろしくお願いします。
>
>元発言にあったコードでは文字列の終端('\0')がないので
>この関数がまともに動くとは思えません。
>

お返事有難う御座います。まずは、ルール違反をしてしまい、申し訳御座いませんでした。お詫び申し上げます。

>元発言にあったコードでは文字列の終端('\0')がないので
>この関数がまともに動くとは思えません。
ご指摘の通りです。記述ミスでした。申し訳ありません。
最後にa->[6]='\0';が抜けていました。

宜しくお願いします




この投稿にコメントする

削除パスワード

No.23133

Re:キャストについて
投稿者---nop(2005/09/19 00:31:36)


とりあえず、キャストの問題ではありません。
Cに於ける型の認識が不足しているようなので、
もう一度、型に関する勉強をした方が良いでしょう。

特に、「数値」と「文字」と「文字列」の違いを勉強した方が良いかと思います。


# 個人的には、二つの数値の連結に strcat() と言う命名からしてナンセンスです。
# もっと言うと、あなたが望んでいるであろう動作を、
# 「連結」と表現する事が、そもそもナンセンスの様な気がします。



この投稿にコメントする

削除パスワード

No.23136

Re:キャストについて
投稿者---nop(2005/09/19 00:52:00)


ついでに考え方を書いておきましょう。

■やりたいこと

 数値「0x05」と数値「0x06」をどうにかして数値「0x0506」にして、
 printf()にて16進数として表示したい。

■考え方

1.各値を演算後の桁数に合わせて考える
 0x05 → 0x0005
 0x06 → 0x0006

2.0x0005 の各ビットを左にずらす
 0x0005 → 0x0500

3.2の値と0x0006の論理和と取る
   0x0500
 OR) 0x0006
───────
   0x0506

4.printf() にて16進数として表示


この投稿にコメントする

削除パスワード

No.23137

Re:キャストについて
投稿者---RAPT(2005/09/19 03:46:51)


…たった30分すら待てないのね。
【掲示板ご利用上の注意】も守ってないし。

Multi-Post: キャストについて




この投稿にコメントする

削除パスワード

No.23138

Re:キャストについて
投稿者---tanaka(2005/09/19 08:12:40)


>
…たった30分すら待てないのね。
【掲示板ご利用上の注意】も守ってないし。

Multi-Post: キャストについて


大変申し訳ございませんでした。以後、十分気付けたいと存じます。
全然、解らなくて色々な所に、質問を出してしまいました。
マナー違反を犯してしまい、申し訳ありませんでした。


この投稿にコメントする

削除パスワード

No.23141

Re:キャストについて
投稿者---tanaka(2005/09/19 08:31:56)


>ついでに考え方を書いておきましょう。
>
>■やりたいこと
>
> 数値「0x05」と数値「0x06」をどうにかして数値「0x0506」にして、
> printf()にて16進数として表示したい。
>
>■考え方
>
>1.各値を演算後の桁数に合わせて考える
> 0x05 → 0x0005
> 0x06 → 0x0006
>
>2.0x0005 の各ビットを左にずらす
> 0x0005 → 0x0500
>
>3.2の値と0x0006の論理和と取る
>   0x0500
> OR) 0x0006
> ───────
>   0x0506
>
>4.printf() にて16進数として表示

ご指導有難う御座います。
まずは、マナー違反を犯してしまい、申し訳ありませんでした。

この様な方法は思いつきませんでした。有難う御座います。

最初に貰った返事に、キャストの問題では無いと在りましたが、
考え方が間違っていたって事なんでしょうか?
今のままの方法では、無理なのでしょうか?


この投稿にコメントする

削除パスワード

No.23144

Re:キャストについて
投稿者---RAPT(2005/09/19 11:19:11)


最初に貰った返事に、キャストの問題では無いと在りましたが、 考え方が間違っていたって事なんでしょうか? 今のままの方法では、無理なのでしょうか?
無理とか言う以前に、どうしたいのかが見えてきません。 入力値:0x05 , 0x06 (int型2つ) 出力値:"0x0506" (文字列として) としたいということでしょうか。 printf("0x%02x%02x\n", 0x05, 0x06); これは想定どおりの出力ですか?



この投稿にコメントする

削除パスワード

No.23145

Re:キャストについて
投稿者---RAPT(2005/09/19 11:20:50)


ついでに言えば、strcat() は標準関数に含まれる関数なので、
混乱を避けるためにも別の関数名にした方が良いかと思われます。



この投稿にコメントする

削除パスワード

No.23148

Re:キャストについて
投稿者---tanaka(2005/09/19 11:52:15)


>
最初に貰った返事に、キャストの問題では無いと在りましたが、 考え方が間違っていたって事なんでしょうか? 今のままの方法では、無理なのでしょうか?
無理とか言う以前に、どうしたいのかが見えてきません。 入力値:0x05 , 0x06 (int型2つ) 出力値:"0x0506" (文字列として) としたいということでしょうか。 printf("0x%02x%02x\n", 0x05, 0x06); これは想定どおりの出力ですか?


すみません。説明不足でした。
まず、配列には、任意の16進数の値が、unsigned charで宣言された配列に格納されています。
unsigned char b[6]; /* 任意の16進数の値が格納されている */


次にその配列に格納されている値の4番目と5番目を連結(すいません。適切な表現が思いつきませんでした。)させ、それをunsigned shorで宣言された変数へ格納したいのですが、カーネル空間で使用するので、ライブラリ関数は使用できないので、ライブラリ関数のstrcatもどきを自作して行おうと思いました。それで、今の様な作りになっております。

また、出力結果といたしましては、
printf("%#x\n", 0506);

が想定している値となります。




この投稿にコメントする

削除パスワード

No.23149

Re:キャストについて
投稿者---まきじ(2005/09/19 12:01:42)


>ライブラリ関数のstrcatもどきを自作して行おうと思いました。

unsigned char buf[6]={0x01,0x02,0x03,0x04,0x05,0x06};

b の要素は、文字列ではなく文字ですので、strcat() は不要です。
最終的に、unsigned short 型の変数に代入するということなので
nop さんが仰ってる考え方が良いでしょう。

= << | らの演算子を使えばできます。


この投稿にコメントする

削除パスワード

No.23183

Re:キャストについて
投稿者---tanaka(2005/09/20 22:39:00)


連絡が遅くなり申し訳ありませんでした。
無事に解決できました。私が行った方法は、
<pre>
struct sample{
unsigned char b[6];
unsigned short c;
};

int main(){
struct sample smp;

smp.b[0]=0x01;
smp.b[1]=0x02;
smp.b[2]=0x03;
smp.b[3]=0x04;
smp.b[4]=0x05;
smp.b[5]=0x06;

smp.c = (smp.b[4]<<8) + smp.b[5];
}
</pre>
です。ルール違反等を行ったにもかかわらず、丁寧に教えて頂、
有難うございました。また、何かありましたら、宜しくお願い
します。




この投稿にコメントする

削除パスワード

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