二次元配列から一次元配列へのコピー

[戻る]
eclipse 2008/07/05(土) 17:07:55
#include <iostream>
#include <vector>

using namespace std;

class Board {
    static const int BOARD_SIZE = 8;
      vector< vector<int> > Array;
public:
    // コンストラクタ
    Board()
    {
        // array resize
        Array.resize( BOARD_SIZE );
        for(int i = 0; i<BOARD_SIZE; ++i){ Array[i].resize( BOARD_SIZE ); }
        // set data
        for(int y=0; y<BOARD_SIZE; ++y) {
            for(int x=0; x<BOARD_SIZE; ++x) {
                Array[y][x] = 0;
                }
            }
        Array[3][3] = 1;
        Array[4][4] = 1;
        Array[3][4] = 2;
        Array[4][3] = 2;
        }
    
    // デストラクタ
    ~Board(){}
    char *VectorToArray();
};

class TcpServer {
    char buf[1024];
public:
    Board board;
    // コンストラクタ
    TcpServer()
    {
    }
    // デスクトラクタ
    ~TcpServer(){}
    void GetBuffer();
};

char *Board::VectorToArray()
{
      char buf[1024];
      memset(buf, '0', 1024);
      char *pbuf;
    pbuf = buf;
    int x, y;
    for(x = 0; x<8; ++x) {
        cout << endl;
        for(y = 0 ; y<8; ++y) {
            sprintf(pbuf, "%d", Array[x][y] + '0');
            ++pbuf;
            }
        }
    return pbuf;
}

void TcpServer::GetBuffer()
{
    memset(buf, '0', 1024);
    strcpy(buf, board.VectorToArray());
    cout << buf << endl;
}

int main()
{
    
    TcpServer tserv;
    tserv.GetBuffer();

    return 0;
}

eclipse 2008/07/05(土) 17:09:09
失礼しました、質問が抜けていました
お世話になります、ボードゲームの配列処理で期待通りの動作ができません
よろしくお願い致します。

Boardクラスで、int型の二次元配列をvectorで生成し、その値を、Boardクラスの一次元
配列、bufにコピーしたいのですが
思ったように配列が、埋まりません、間違い、勘違いをしている処を、ご指摘ご教示願え
ないでしょうか。

eclipse 2008/07/05(土) 17:10:48
グダグダになってます、重ね重ねすみません。
×
Boardクラスで、int型の二次元配列をvectorで生成し、その値を、Boardクラスの一次元
配列、bufにコピーしたいのですが

○
Boardクラスで、int型の二次元配列をvectorで生成し、その値を、TcpServerクラスの一次元
配列、bufにコピーしたいのですが

επιστημη [HomePage] 2008/07/05(土) 17:48:41
> char *Board::VectorToArray()

- automatic変数のポインタを返してはいけません。
  static char buf[1024]; が正解。
- 返すのはpbufではなくbufです。

eclipse 2008/07/06(日) 08:54:00
[[解決]]
επιστημηさん、ありがとうございました
関数のプロトタイプはそのままにして、bufを返却することで、期待通りの動作となりま
した。
>automatic変数のポインタを返してはいけません。
なるほど、そういうものなのですね。仕様として理解しました
>返すのはpbufではなくbufです。
C言語に於いて、配列は戻り値として、指定出来ないものかと、思っていました。
警告: address of local variable ‘buf’ returned
警告がでますが、思い通りの動作となりました、向学のために
他に方法があれば、教えて頂きたいのですが。

επιστημη [HomePage] 2008/07/06(日) 09:35:43
> 他に方法があれば、教えて頂きたいのですが。

C++なら std::string 使います。

eclipse 2008/07/06(日) 13:23:37
ありがとうございます。
std::stringなら、操作も楽そうなのでなお、良しですね。

エビ 2008/07/06(日) 15:10:30
> 警告: address of local variable ‘buf’ returned

コンパイラは何を使っているのか分かりませんが、その警告は気になりますね。
επιστημηさんが指摘したように、bufをstatic変数にしてもこの警告が出たので
しょうか。

eclipse 2008/07/06(日) 20:32:23
エビさんお世話になります
>コンパイラは何を使っているのか分かりませんが、その警告は気になりますね。
コンパイラはgccです
勘違いをしていました。というか、良く読んでおらず、本質を見失い
staticを付加するのを忘れていました、掲示したコードは、要点だけを抜粋したものなので
作成中の、プログラムを修正するのが大変でした、(^^;
そんな感じで、修正しながら、実際作成中のプログラムの中でchar* bufは、サーバーか
らマルチクライアントへメッセージを返す際の、クラスの中で、一意に決まらなければな
らない変数だったので、
いろんなchar* bufが存在したら、矛盾が生じ、バグになりそうな部分だなとか、
こういう時こそ、static関数使わなくてはな、ならない場面だなとか、妙に感心しつつ、
修正してました。
ということで、警告も消えました。ありがとう。

古いスレッドには追加発言できません。