2次元配列の宣言・比較・コピーについて

[戻る]
パワー 2010/03/29(月) 09:44:10
【環境】WindowsXP(SP2)、VisualStudio2005++(MFC)

タイトルの通りなんですが、配列の配列を比較したりコピーしたいのですが、
以下に質問を3つ記載させていただきますので、どなたかご教授お願いいたしますm(__)
m

1.宣言と初期化について
char **buf;
buf = new char*[3200];
for(int i=0; i < 3200; i++)
{
buf[i] = new char[4];
}

これで、buf[1]、buf[2]、buf[3]、buf[4]に、それぞれ3200のchar型の配列が宣言され
た事になりますでしょうか?
※buf[4][3200] なのか buf[3200][4]なのかよく分からないです。

2.上記の方法で定義した2つの配列(bufとtmp)の比較

for(int i =0; i < 4; i++)
{
memcmp (buf[i], tmp[i], sizeof(tmp[i]));
}

これで比較出来ますでしょうか?


3.上記の方法で定義した2つの配列(bufとtmp)のコピー
for(int i =0; i < 4; i++)
{
memcpy_s(buf[i], sizeof(buf[i]), tmp[i], 3200 * sizeof(char));
}

これではバッファオーバーランエラーが発生してしまうのですが、どこがおかしいでし
ょうか?

以上3点、初心者の質問なので意味が分からないような箇所があるとは思いますが、ど
うかご教授お願いいたしますm(__)m

tetrapod 2010/03/29(月) 10:10:09
http://okwave.jp/qa/q5781068.html
で「この上なく完璧な」解答ついてるみたいだね。

パワー 2010/03/29(月) 11:08:42
tetrapodさん

http://okwave.jp/qa/q5781068.html

では分からなかったので新規に質問させていただきました。

tetrapod 2010/03/29(月) 11:16:45
であれば、何がわからないのかはっきりさせないと答えようが無い。

しかもここで続けてしまうと okwave のほうの質疑応答が無駄に終わるし、
あっちの回答常連者に失礼だと思うぞ。

パワー 2010/03/29(月) 11:27:35
tetrapodさん

何が分からないかはokwaveで記載済みです。

okwaveは質問してから日時が経過してしまうと回答がつけられない事が多いので
こちらに新規で挙げさせていただいております。

失礼とは思いますが、欲しいのは「答え」なので、質問に対する回答以外は遠慮してい
ただけないでしょうか?

すいませんが、よろしくお願いいたしますm(__)m

tetrapod 2010/03/29(月) 12:26:01
あのさー答えが知りたいだけなら有料のサポートセンターとやらにでもいけば?
どこに行けばいいのかはアドバイスできないけどさ。

なんかこう上から目線だね。「答えりゃいいんだよ、答えりゃ」にしか見えないもん。‘
俺は、掲示板に参加するものとして皆が対等だと思うんだがね。

で、俺が答えるまでも無く既に okwave のほうに極めて適切な答えがついてる。
しかも自分自身で正しい答えも出してる。
これ以上何をしろと?

第三者読者のために、向こうでついてる答えを再掲。
・提示コードは [3200][4] の配列になる
 正確には「二次元配列そのものではなく、二次元配列っぽいもの」
・欲しいのが [4][3200] であるなら、既に自分で答え書いてる。
・sizeof(buf[i]) は「ポインタのサイズ」であって「配列のサイズ」ぢゃない。
 配列のサイズは自分で管理するしかない。

仲澤@失業者 2010/03/29(月) 12:51:35
>>http://okwave.jp/qa/q5781068.html
>では分からなかったので新規に質問させていただきました。

上記のページの説明はかなり詳しく説明されています。
ここで同じ質問をしても、似たような回答になってしまいますね。

また、回答者は質問内容から類推するしかないので、ズバリのコード
を期待しても無駄でしょう。勉強するか、降参するかしかないと
考えられます。

PATIO 2010/03/29(月) 13:23:21
> 失礼とは思いますが、欲しいのは「答え」なので、
> 質問に対する回答以外は遠慮していただけないでしょうか?

こういう掲示板は単に答えを得るだけの場所では無いと思いますよ。
答えに至る部分のディスカッションを行なったり、
そのディスカッションの内容を後から他の人が読んで参考にしたり
する事も目的の一つのはずです。
あくまでも相互扶助の一環としてやっていると思うので
ディスカッションする気が無いというのはどうかと思います。

PATIO 2010/03/29(月) 13:28:22
追記。

何処がわからなかったかはあちらに書いてあるといっても
あちらを見る事が出来ない環境にいる人もいますよ。
しかも、あちらに書いてある事自体、tetrapodさんが書いてくれなかったら
この掲示板しか読んでいない人にはわかりません。
なので、どう分からないのかの説明はこちらの掲示板でもするべきです。

パワー 2010/03/29(月) 13:37:29
[[解決]]
tetrapodさん
仲澤@失業者さん

すいません、言語知識はもちろん、ネットでのマナーについても勉強させて
いただきます。
本当にすいませんでした。

ただ、決して「答えだけ出せー」とか思っているわけではございません・・・。
可能でしたら、ご回答いただいている方々の処理のコード1行に対して1行ずつコメン
トを記載していただきたいくらい理解が出来ない状態で・・・。

とりあえず降参して、言語・マナー・言葉遣い・効果的な質問方法など勉強しまようと
思います。

という事で、こちらについては解決とさせていただきます。
本当にすいませんでした。

tetrapod 2010/03/29(月) 14:30:08
1行1行すべてについてコメントが必要なレベルなら、そりゃ質疑応答にならんので
もっと勉強しておくんなまし。としか言いようが無いなー。
加減算がわからなきゃ乗除算の質疑応答は難しいし、
乗除算がわからなきゃ積分の質疑応答は難しい。

まず C の二次元配列は「配列の配列」であって右側 [] が elementary になる、
というあたりは理解できているのかな?
char x[4][3200]; の解釈は 『「char[3200] の配列」が [4] の配列』

次に最初の提示コードで作っているのは「配列の配列」ではないことは大丈夫?
作っているのは『「配列の先頭要素を指すポインタ」の配列』であるわけだ。
new char[3200] は char を 3200 個用意する処理 (これで得るのは char*)
new char*[3200] は char* を 3200 個用意する処理 (これで得るのは char**)

『「char[3200] の配列」が [4] の配列』 *もどき* を作りたければ
new char[3200]; を4回実行すればいい。既に okwave で自分で書いたとおり。

まあ後出しじゃんけんで話が進んでいて、実は vector<string> が適切なのでは?
という展開になっている、ってことで。

ITO 2010/03/29(月) 20:24:18
>失礼とは思いますが、欲しいのは「答え」なので、質問に対する回答以外は遠慮してい
>ただけないでしょうか?
こちらより、


> 何が分からないかはokwaveで記載済みです。

> okwaveは質問してから日時が経過してしまうと回答がつけられない事が多いので
> こちらに新規で挙げさせていただいております。
こっちの方が失礼になりますね。

「質問内容が知りたければ、
 >http://okwave.jp/qa/q5781068.html
 を勝手にこのサイトを見れば?」

っていうのを丁寧に言い換えているだけです。
ここの掲示板は回答者が親切だからよかったもの、
普通だったら、「何いってるんだ、ふざけるな!!」等の
コメントだけで無回答になってもおかしくないです。


>失礼とは思いますが、欲しいのは「答え」なので、質問に対する回答以外は遠慮してい
>ただけないでしょうか?

これは、まぁー失礼ではないですね。
言い方がよくないだけです。
ただ、こう言い換えましょう。

「なにぶん、初心者なもので、よく分かっていません。
  よって、回答を先にいただきたいのですが、駄目でしょうか?」

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