こんばんわ
またまた単純な質問ですが、
以下のようにコマンド引数を
char,short,char*
それぞれに入れたいのですが、charがうまくいきません。
どなたか、宜しくお願いします。
char aaa;
short bbb;
char* ccc;
void main(int argc, char *argv[]) {
if (argc > 1)
aaa = atoi(argv[1]);
if (argc > )
bbb = atoi(argv[1]);
if (argc > )
ccc = atoi(argv[1]);
}
「うまくいかない」ではわかりません。
どういう動作を期待して実際どのように動作したか具体的に書いてください。
仕事のプレッシャーのため不眠症気味です(^^;
さて、単にソースファイルを見た限りでうまくいかない理由を推察するとすれば、
1バイトのサイズを持つchar型に(一般的に)4バイトのサイズを持つint型の
値を代入してます。たぶん、-127~127以外の値は代入されないと思います。
あとは具体的にうまくいかない状況を述べていただかないと答えようないです。
ではでは
> http://rararahp.cool.ne.jp/cgi-bin/lng/vc/vclng.cgi?print+200301/03010046.txt
マルチスレッドになっています、どちらか「済」マークしてください
ほかの方が言うようにコンパイルエラー出てませんか?
>char* ccc;
これもおかしくないですか
実態のない char ポインタでしょ?
>aaa = atoi(argv[1]);
で異常終了していて、最後まで実行結果見れていないのでは
無いでしょうか
ここ間違ってたら、だれかフォローして・・・
>マルチスレッドになっています、どちらか「済」マークしてください
気づかないで、別のほうにレスしてました。
どうも初心者だと思われましたので、特別サービスです。
>char aaa;
>short bbb;
>char* ccc;
>void main(int argc, char *argv[]) {
> if (argc > 1)
> aaa = atoi(argv[1]);
> if (argc > )
> bbb = atoi(argv[1]);
> if (argc > )
> ccc = atoi(argv[1]);
sprintf( ccc, %s, argv[3]);
>}
char aaa;
short bbb;
char ccc[256]; // 実態がなかった(サイズは適当)
void main(int argc, char *argv[]) {
if (argc > 1)
aaa = (char)atoi(argv[1]);
if (argc > 2) // 数値が入ってなかった
bbb = (short)atoi(argv[2]); // 引数が違った
if (argc > 3) // 数値が入ってなかった
sprintf( ccc, %s, argv[3]); // 文字列の処理でなかった
// 、引数が違った
}
いつもありがとうございます。
そして質問がわかり難くすみません。
今日も質問させてください。
const char *IP = 10.15.XX.XX;
int aaa = atoi(s);
上記のようにconst char *で取得したIPアドレスの下位15ビットを
aaaにいれなければならないのですが、意味がよくわかりません。
済みませんが
どなたかよろしくお願いします。
「文字列として受け取ったIPアドレスの、下位15ビットを取り出したい」ということでよ
ろしいですか?
その前に、上記の文章がどういう意味かおわかりになっていますか?
IPアドレスは0~255の数値4つで構成されているように見えますが、実は32bitの1つの数
値です。上記の文章は、「4つの10進数(に見える文字列)で表現されている数値を32bitの
1つの数値に変換して、それの下位15bitを取り出したい」と等価だと解釈できます。
文字列から4つの数値を取り出し、
32bitの1つの数値を作り出し、
下位15bitを取り出す。
という手順になります。
その通りです。
そして教えていただいた内容は理解しました。
ありがとうございます。
もうひとつだけ教えてください。
>下位15bitを取り出す。
を具体的に教えて頂きたいのですが・・・
よろしくお願いします。
>>下位15bitを取り出す。
>を具体的に教えて頂きたいのですが
................................
という32のbitがあったとしたら、「下位15bit」というのは、
.................XXXXXXXXXXXXXXX
だけをとりだす、ということです。「12.34.56.78」というIPアドレスだったら、32bit値は
00001100001000100011100001001110 (2進数。16進なら0x0c22384e)
になります。これの「下位15bit」を取る、ということは
00000000000000000011100001001110
ということです。どういう操作をしたか(数学的に)言えますか?
00000000000000000011111111111111 (16進だと0x7fff)とのANDを取った、ということです。
C, C++でAND演算子は「&」です。
私のレスに対して、よかったかどうかの回答がなかったのですが
よろしかったのでしょうか?
(プログラム修正のコメントまで書いたのですが)
1.最初に4個のアドレスを文字列へコピーする。
2.このIPアドレスを32ビットに変換する。
確か、関数があったと思う。
なくても自分で関数を作る
3.tibさんのおっしゃるようにANDで上位17ビットをマスクする。
でよいと思いますが。
みなさんレス有難うございます。
もうひとつ質問させてください。
> 1.最初に4個のアドレスを文字列へコピーする。
とありますが、
取得したIPアドレスが「const char *s 」
なのですが、それから文字列コピーの方法を教えてください.
初心者なもので申し訳ありません。宜しくお願いします。
オンランヘルプとかさぁ、C/C++の本読んで自分で勉強しなよ。
そのくらいのことは。
初心者、初心者ってねぇ。初心者だからって何でも許されると思わないほうがいい。
初心者なら初心者のレベルに見合ったプログラム作って、少しつづステップアップ
していくもんじゃない?
最初の質問とだいぶ違ってきていると思いますけど?
別スレッド立てたらどうですか
>取得したIPアドレスが「const char *s 」
>なのですが、それから文字列コピーの方法を教えてください.
C++ではなく、C言語の基礎学習やり直してみてはどうですか