|
新たにプログラムを作り直してみました。 コンパイルできますが、実行結果が全て0になってしまいます。 どこを直せばいいのか教えて下さい。 #include<stdio.h> void swap(int *bin) { char buff[32+1],answer[32+1]; int count; buff[32] = '\0'; for(count = 0; count < 32; count++) { if(count != 0 && *bin == 0) { break; } if (*bin % 2 == 0 ) { buff[(32-1)-count] = '0'; } else { buff[(32-1)-count] = '1'; } *bin = *bin / 2 ; } buff[32+1] = *bin; } int main() { int hoge,hairetu[32+1]; char buf[32+1]; printf("数を入力してください>>>"); fgets(buf,sizeof(buf),stdin); sscanf(buf,"%d",&hoge); swap(&hoge); printf("2進数>>>%d\n",hoge); } |
|
こういう形のやりとりはあまり効率的とは思えませんが、 納得できるまで付き合いますか。 >>1923 HELP swap に hoge のアドレスを渡し、swap の中で *bin を2で 割っていって、0になったらループを抜けているので、 最終的には必ず *bin == 0、つまり hoge も 0 になります。 buff の中に結果を入れているのに、最終的にどこにも 反映していないので、呼び出し側では結果を受けとれません。 で、2進数の結果を int で返してもらっても、大抵の場合 うれしくないので、void int2bin(int n,char* s) という 形にしましょう。 呼び出し側では char answer[256], buf[256]; int input_num; printf("数を入力してください>>>"); fgets(buf, sizeof(buf), stdin); sscanf(buf, "%d", &input_num); int2bin(input_num, answer); printf("2進数>>>%s\n", answer); として、変換側では void int2bin(int num, char *answer) と受け、num の値を 2進数に変換して answer に格納、 とするのがよいでしょう。 |
|
この問題はなんとか解決できました。 最後までつきあっていただいて本当にありがとうございました。 またよろしくおねがいします。 |
|
しゅいましぇん Perl で質問です〜 らくだの本を読んでいて、 *dick = *richard; という代入を行なうと $richard も @richard も %richard も &richard も エイリアシングされてしまうけど、 *dick = \$richard; だと $richard だけがエイリアシングされてしまう、というのがどうもよくわかりません。 あと、 *PI = \3.14159265358979; と書くと $PI は「定数スカラー」になっていじれなくなる、というのも、 これ、左辺はリテラルのリファレンスなんでしょうか?? |
|
Awkを練習しています。 目的; Data1というファイルに4ポイントの座標が書き込んであります。 c1 10 10 c2 20 20 c3 30 30 c4 40 40 この4ポイントを4x4=16個ある箱の一番左下とし、これを元に、残り15箱にはいる15x4=60ポイントの座標を求める。offset値はx=y=100とします。 コマンドラインで awk '{for (i=0;(i,4);i=i+1) print $1"-"i+1, $2+"100"*i, $3}' data1 > out1 で一番したの4箱ぶんをだし、 out1; c1-1 10 10 c1-2 110 10 c1-3 210 10 c1-4 310 10 c2-1 20 20 c2-2 120 20 c3-3 220 20 .......... awk' '{temp=substr($1, 1,4);for (i=0;(i,4);i=i+1) print temp, i+"1", $2, $3+"100"*i}' out1 > out2 out2 c1-1 1 10 10 c1-1 2 110 10 c1-1 3 210 10 c1-1 4 310 10 c1-2 1 10 110 c1-2 2 110 110 c1-2 3 210 110 .................. で全てを出す方法で目的は達成したのですが,それを一度で出したいと思い、下の様にしてみました。 "test.awk" {for (i=0;(i<4);i++) print ($1"-"i+"1", $2+"100"*i, $3) >> "out1"} close ("out1") {getline < "out1" temp=substr($1, 1,4);for (j=0;(ij,4);j=j+1) print temp, ij+"1", $2, $3+"100"*j} #awk -f test.awk < data1 > out3 しかし、data1のFNR=4の場合out3は16行まででとまってしまうので、わざわざdata1のFNRを64にしてし、全ての値をだしました。 まだよく理解できていないので、どうしてなのかがわかりません。ご指導 お願い致します。 |
|
>>1926 ふくし > *dick = \$richard; > だと $richard だけがエイリアシングされてしまう、 > というのがどうもよくわかりません。 dick という名前には、スカラー、配列、ハッシュ、関数 などがあり、それぞれ $dick、@dick、%dick、&dick として アクセス可能です。名前と実データのアドレスの間は、 シンボルテーブルにより対応づけられています。で、 *dick = *richard; は、それらシンボルテーブルを一括して書き換えるもので、一方 *dick = \$richard; は $richard 用シンボルテーブルだけを書き換えるもの、 と解釈してはどうでしょうか。 実際にそういう作りになっているかどうかはわかりません。 ところで、 $fuga='fuga'; local(*hoge) = *fuga; print "\$hoge=$hoge\n"; は OK でも、 @fuga=('a', 'b', 'c'); local(*hoge) = *fuga; print "\@hoge=@hoge\n"; とすると In string, @hoge now must be written as \@hoge なんですねぇ。美しくないなぁ。 >>1927 ミング うーむ、awk 以前に、ちょっと問題の意味が理解できません。 # でも、for (j=0;(ij,4);j=j+1) という書き方もわかんないなぁ。 ファイルに書き込んで close し、それを読み出す、ということを されたいのでしょうが、もっとよいアルゴリズムがあるんじゃないか とは思います。他の方、わかりますか? |