二次元配列から一次元配列へのコピー – プログラミング – Home

二次元配列から一次元配列へのコピー
 
通知
すべてクリア

[解決済] 二次元配列から一次元配列へのコピー


eclipse
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

#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
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

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

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


返信引用
eclipse
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

グダグダになってます、重ね重ねすみません。
×
Boardクラスで、int型の二次元配列をvectorで生成し、その値を、Boardクラスの一次元
配列、bufにコピーしたいのですが


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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> char *Board::VectorToArray()

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


返信引用
eclipse
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

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


返信引用
επιστημη
 επιστημη
(@επιστημη)
ゲスト
結合: 22年前
投稿: 1301
 

> 他に方法があれば、教えて頂きたいのですが。

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


返信引用
eclipse
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

ありがとうございます。
std::stringなら、操作も楽そうなのでなお、良しですね。


返信引用
エビ
 エビ
(@エビ)
ゲスト
結合: 16年前
投稿: 1
 

> 警告: address of local variable ‘buf’ returned

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


返信引用
eclipse
 eclipse
(@eclipse)
ゲスト
結合: 16年前
投稿: 6
Topic starter  

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


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました