質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

Q&A

解決済

1回答

894閲覧

動的2次元配列のアドレス渡しして値を上書き

JanTh1989

総合スコア87

Visual Studio 2010

Microsoft Visual Studio 2010はMicrosoftが提供している統合開発環境(IDE)です。

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

0グッド

0クリップ

投稿2020/01/30 02:55

ダブルポインタ変数にnewをして動的2次元配列を作り、配列を値上書き用の関数に渡して更新、という動きをさせようとしています。
一旦組み込んで、値をファイル出力してみたのですが、値が想定と違ってしまい、悩んでおります。
配列の上書き方法の誤り、またはファイルへの書き込み方法の誤りになってくると思うのですが、どこに誤りがあるのかが判断付かず、ご教授願えればと思っております。

<サンプルコード>
ファイル値が16進で全FF、2進で全1になるつもりでしたが、思っていた値になってくれておりません。

C++

1void update(DWORD dataCount, DWORD bit, ULONGLONG*** dataList) 2{ 3 ULONGLONG mask = (1 << bit); 4 DWORD index = bit / 64; 5 6 for (DWORD i = 0; i < dataCount; i++) 7 { 8 ((*dataList)[i])[index] |= mask; 9 } 10} 11 12int _tmain(int argc, _TCHAR* argv[]) 13{ 14 // データ数. 15 DWORD dataCount = 0; 16 cin >> dataCount; 17 // 出力ビット数. 18 DWORD bitCount = 0; 19 cin >> bitCount; 20 // 8バイト刻み分割数. 21 DWORD splitCount = (DWORD)ceil(((double)bitCount / 64)); 22 23 // ULONGLONG2次元配列定義. 24 ULONGLONG** value = new(std::nothrow) ULONGLONG*[dataCount]; 25 if (NULL == value) 26 return 0; 27 for (DWORD i = 0; i < dataCount; i++) 28 { 29 value[i] = new(std::nothrow) ULONGLONG[splitCount]; 30 if (NULL == value[i]) 31 return 0; 32 } 33 34 for(DWORD i = 0; i < bitCount; i++) 35 { 36 update(dataCount, i, &value); 37 } 38 39 std::fstream file; 40 file.open(L"C:\output.bin", std::ios::out | std::ios::binary); 41 42 for (DWORD i = 0; i < dataCount; i++) 43 { 44 file.write((const char*)&(*value)[i], sizeof(ULONGLONG) * splitCount); 45 } 46 47 return 0; 48}

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

valueの中身を初期化していないため、不定値にmaskを掛けているのではないかと思います。

投稿2020/01/30 03:08

退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

JanTh1989

2020/01/30 05:24

value[i] = new(std::nothrow) ULONGLONG[splitCount](); に変えてみたものの、値は変わりましたが全FFとかにはなってくれませんでした・・・。
JanTh1989

2020/01/30 05:40

file.write((const char*)&value[i], sizeof(ULONGLONG) * splitCount); こうするだけでうまくいきました。 FFにならないのは単に2つ目の入力が64になってなかっただけでした。
退会済みユーザー

退会済みユーザー

2020/01/30 08:22 編集

何をしようとしているプログラムなのかいまいち理解できておりませんが、本当にそれで解決していますか? (とてもそうは思えないのですが・・・)
fana

2020/01/30 08:39

> valueの中身を初期化していないため 処理が |=mask なので,初期値がどうあれどこぞのbitを強制的に立てていくので,最終的に全bitが立つという話かもしれません.
退会済みユーザー

退会済みユーザー

2020/01/30 08:53

>最終的に全bitが立つという話かもしれません. maskなのにor?とか初期化しないの?とか諸々のことに目をつぶったらそれもあり得るのかなと思ったのですが >file.write((const char*)&value[i], sizeof(ULONGLONG) * splitCount); これ、私の勘違いでなければ変なデータを参照してませんか?
fana

2020/01/30 09:48

えーと,valueが2次元配列の根っこで,value[i]は各行の先頭アドレスなのだからー… (const char*)value[i] とすべき,という気がしますね.
退会済みユーザー

退会済みユーザー

2020/01/30 10:14

暫くC++は触る程度のことしかしてなかったのでもしかしたら勘違いかとも思ったのですがやっぱりそうですか...ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問