ページ 11

vectorコンテナについて

Posted: 2010年5月01日(土) 21:41
by yskey
こんばんは、yskeyと申します。
現在DxLibで戦略ゲームを製作中で、ベクターコンテナによるグラフ構造を作ろうとしています。

グラフ構造をプログラム内で宣言するのに少し工夫をしようと思いこんな方法を思いつきました。
たとえば画像のようなマップを作るときは、

,2,4\n
,1,4,5,3\n
,2,5\n
,1,2,5\n
,2,3,4\n

のようにします。(\nは明示するために書いています)
これをこのようなプログラムで読み込みます。
コンマのときブランチを増やして次にある番号の配列のポインタをRegion_Node.Branchにしまいます。
-----------------------------------------------構造体宣言部
struct Region_Node_t{
    vector<Region_Node_t*> Branch;
};
vector<Region_Node_t> Region_Node;
-----------------------------------------------読み込みプログラム

int Region_Ini(){
    int fp,buf,bur_count=0,com_count=0;

    if((fp=FileRead_open("dat/ini/region.dat"))==NULL){
        return -1;
    }

    while((buf=FileRead_getc(fp))!=EOF){
        if(buf=='\n')Region_Node.push_back();
    }
    if(FileRead_seek(fp,0,SEEK_SET)!=0)return -1;

    while((buf=FileRead_getc(fp))!=EOF){
        if(buf==','){
            Region_Node[bur_count].Node.push_back();
            buf=FileRead_getc(fp);
            Region_Node[bur_count].Branch[com_count] = &Region_Node[buf];
            com_count++;
        }
        if(buf=='\n'){
            bur_count++;
            com_count=0;
        }

    }
    return 0;
}
要するにpush_back()を使って配列を増やすときに引数がいるのですが、push_backで配列を増やした後に構造体のメンバにポインタを格納したいときはどうすればよいのでしょうか?

Re:vectorコンテナについて

Posted: 2010年5月01日(土) 22:25
by ookami
いろいろ気になる点はあるのですが、vector<vector<int> >のようにしてはマズいですか?

あとは細かい点↓

Region_Node[bur_count].Node.push_back();
のNodeはBranchの間違いですかね。

Region_Node[bur_count].Branch[com_count] = &Region_Node[buf];

Region_Node[bur_count].Branch[com_count] = &Region_Node[buf-'0']; // …かな?環境依存ですがとりあえず。

Re:vectorコンテナについて

Posted: 2010年5月01日(土) 23:10
by yskey
ookamiさんご返信ありがとうございます。

<vector<vector<int>>とするint型のものしか代入できないですよね?
リスト構造っぽいことをしているので、int型だと同じ構造体のポインタが入れれなくなるのでマズイです。

後、buf-'0'っていうのはいったいどうゆうことをしているのでしょうか?

Re:vectorコンテナについて

Posted: 2010年5月01日(土) 23:35
by ookami
リスト構造であれば、ポインタの他にメインデータの領域がいりますよね?

最初のソースで「ポインタの代入」にはなってますが、添え字が意図通りではないだろうなと。bufには数値ではなく文字コードが入っているはずですから。

Re:vectorコンテナについて

Posted: 2010年5月01日(土) 23:54
by ookami
追記

メインデータを省略しているとしても、実際の要素がpushされる前にポインタを取得しようとしているので、動作は不定になりそうですね。

Re:vectorコンテナについて

Posted: 2010年5月02日(日) 10:05
by yskey
よく考えたらatoi()関数使うの忘れてました…

いま気づいたんですが、ベクターコンテナって配列だからポインタじゃなくてポインタの代わりに添え字でやればいいんですね。

>>ookamiさん
どうもありがとうございました。