C言語のソースを書いてください。インターネットのPrefix(例えば192.68.8/24)をint[A][B]のように記述したいです。Aは「/」の前半部分。Bは「/」の後半(Prefix長)です。ソースそのものずばりを回答してください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2010/07/07 11:10:02
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答1件)

id:taka-hr No.1

回答回数57ベストアンサー獲得回数4

ポイント60pt

なにか問題設定が間違っている気がします。

int[A][B] と書きたいと言われても、C言語に型名 + 添え字という構文がありません。

int var[A][B]; と定義しておいて、var[a][b] という形の式で得られるのは int 型の値ですが。

var[192.68.8][24] と書きたいという意味ならそんなのC言語では無理ということになります。

---- ---- ---- ---- ---- ---- ---- ---- ----

x = var[0][24]; y = var[1][24] としたときに x = 192, y = 68 になるようにすることはできないこともないですが、こんなの使い道あるんでしょうか。単なる宿題?

で、このとき z = var[0][23] はなんになるのが正しいでしょう?


超解釈で書いてみたソースはこんな感じですが、問題を書き間違えている可能性が高いんじゃないかとは思いますのでもう一回問題を確認してください。。

#include <assert.h>

void generate_networks(int addr[4], int networks[4][33])

{

int i, j;

unsigned int mask;

unsigned int work;

for (j = 0; j <= 32; j++) {

mask = 0xffffffffU ^ ((1U << (32-j)) - 1);

for (i = 0; i < 4; i++) {

networks[i][j] = addr[i] & (mask >> (3 - i) * 8) & 0xff;

}

}

}

int main()

{

int addr[4] = {192, 68, 8, 0};

int networks[4][33];

generate_networks(addr, networks);

assert(networks[0][24] == 192);

assert(networks[1][24] == 68);

assert(networks[2][24] == 8);

assert(networks[0][16] == 192);

assert(networks[1][16] == 68);

assert(networks[2][16] == 0);

assert(networks[0][12] == 192);

assert(networks[1][12] == 64);

assert(networks[2][12] == 0);

return 0;

}

id:labtest

すみません。間違い&説明不足でした。回答の受付を一時停止しもう一度質問し直します。

2010/06/30 12:08:52
  • id:taka-hr
    上記のソースで、networks[a][b] と書いたときに、a がアドレスのオクテット位置(0 <= a <= 3), b が netmask のビット長とすると、そのオクテット位置のネットワークアドレスが返せていると思います。

    > ネットワークのPrefixを表現したいのです。

    そこだけは気持ちはわかるのですが、表現してなにをしたいのか、入力がなにで出力になにがほしいのかが明確じゃないのです。

    たとえば、アドレスとネットマスク長を渡した時に Prefix を返したいのであれば

    void get_prefix(int addr[4], int mask_length, int prefix[4]);

    というような関数を書くほうがよくないですか? だとしたらこんなかんじ?


    #include <assert.h>

    void get_prefix(int addr[4], int mask_length, int prefix[4])
    {
    int i, j;

    unsigned int mask;

    mask = 0xffffffffU ^ ((1U << (32 - mask_length)) - 1);

    for (i = 0; i < 4; i++) {
    prefix[i] = addr[i] & (mask >> (3 - i) * 8) & 0xff;
    }
    }

    int main()
    {
    int addr[4] = {192, 68, 8, 0};
    int prefix[4];

    get_prefix(addr, 24, prefix);
    assert(prefix[0] == 192);
    assert(prefix[1] == 68);
    assert(prefix[2] == 8);

    get_prefix(addr, 12, prefix);
    assert(prefix[0] == 192);
    assert(prefix[1] == 64);
    assert(prefix[2] == 0);

    return 0;
    }


    > ちなみに私の環境ではintは32bitでした。

    32bit 以上はほしいですが64bitとかでもたぶん動くとは思います。
  • id:taka-hr
    もしかしたら文字列で "192.68.8/24" を渡すと、prefix とマスク長を返すような、

    int parse_network(const char *str, int addr[4]);

    のような関数がほしいのでしょうか。。だとしたらちょっと面倒なので保留w

    また気が向いたら書きます。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません