68user's page 掲示板

Prev< No. 1923〜1928> Next  [最新発言に戻る] [過去ログ一覧]
No. 1923 # HELP 2001/04/30 (月) 01:00:54
新たにプログラムを作り直してみました。
コンパイルできますが、実行結果が全て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);

}

No. 1924 # 68user 2001/04/30 (月) 01:41:25
こういう形のやりとりはあまり効率的とは思えませんが、
納得できるまで付き合いますか。

>>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 に格納、
とするのがよいでしょう。

No. 1925 # HELP 2001/04/30 (月) 22:06:51
この問題はなんとか解決できました。
最後までつきあっていただいて本当にありがとうございました。
またよろしくおねがいします。

No. 1926 # ふくし 2001/05/02 (水) 12:07:45
しゅいましぇん Perl で質問です〜

らくだの本を読んでいて、

    *dick = *richard;

という代入を行なうと $richard も @richard も %richard も &richard も
エイリアシングされてしまうけど、

    *dick = \$richard;

だと $richard だけがエイリアシングされてしまう、というのがどうもよくわかりません。

あと、

    *PI = \3.14159265358979;

と書くと $PI は「定数スカラー」になっていじれなくなる、というのも、
これ、左辺はリテラルのリファレンスなんでしょうか??

No. 1927 # ミング [E-mail] 2001/05/02 (水) 13:43:23
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にしてし、全ての値をだしました。

まだよく理解できていないので、どうしてなのかがわかりません。ご指導
お願い致します。

No. 1928 # 68user 2001/05/04 (金) 00:11:00
>>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 し、それを読み出す、ということを
されたいのでしょうが、もっとよいアルゴリズムがあるんじゃないか
とは思います。他の方、わかりますか?

Prev< No. 1923〜1928> Next  [最新発言に戻る] [過去ログ一覧]