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

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

新規登録して質問してみよう
ただいま回答率
85.50%
C++

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

Q&A

解決済

2回答

1062閲覧

C++ クラス内の配列へ数値代入出来るのに出力がおかしいのは何故でしょう?

opyon

総合スコア1009

C++

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

0グッド

0クリップ

投稿2018/11/11 09:05

編集2018/11/11 10:53

###解決!

サイズを指定しない場合は宣言と同時に初期化しないとならないので、

今回のケースでは配列は固定長なので使えない
が結論です。

@asmさんの回答でスッキリしました!

回答やコメントくださった方ありがとうございました。
いわゆる配列の初歩的な作法から調べ直してみたいと想います。

###変更後
課題の趣旨から外れそうなので**配列[最大要素数を指定]**にしてみます。
std::vectorが便利過ぎて慣れてしまっているので思わぬ落とし穴でした。

C++

1#include <bits/stdc++.h> 2 3class CBTree 4{ 5 public: 6 // 配列[]は初期化時に要素数を指定しておかなければならないので、 7 // 出題に合わせて最大サイズを指定するしか無い。 8 9 int heap[251]; 10 CBTree() 11 { 12 heap[0] = -2000000001;//最小値-1 13 } 14}; 15 16void alds1_9_1() 17{ 18 // 完全二分木 19 // Complete binary tree 20 int n, key; 21 std::cin >> n; 22 CBTree T; 23 24 //入力 25 for (int i = 1; i <= n; ++i) 26 { 27 std::cin >> T.heap[i]; 28 } 29 30 //確認出力 31 for (int i = 1; i <= n; ++i) 32 { 33 std::cout << T.heap[i] << std::endl; 34 } 35} 36 37int main() 38{ 39 alds1_9_1(); 40 getchar(); 41 return 0; 42} 43 44// 5 45// 7 8 1 2 3 46// 7 47// 8 48// 1 49// 2 50// 3 51

###追記(説明補足)
例えばこういう配列の使い方をイメージしています。
std::vectorやpythonなどの配列の宣言の仕方ですんなり使えると思っていたのにのっけから躓いてしまっています^^;
配列の初歩的なことから調べ直してみます。

配列の初期化
イメージ説明

###知りたいこと
クラス内に定義した配列に数値を代入しそのまま出力したいだけなのですが、
あまりにもシンプルなだけに何が間違っているのか分からず困っています。
とても初歩的なミスだと思うのですがご教示頂けると助かります。

###現状
配列に数値を代入し出力するだけなのに期待していない値が出力されている。

###サンプルコード

C++

1#include <bits/stdc++.h> 2 3class CBTree 4{ 5 private: 6 size_t max_size; 7 8 public: 9 int heap[]; 10 CBTree(size_t max_size) 11 { 12 CBTree::max_size = max_size; 13 heap[CBTree::max_size] = {0}; 14 heap[0] = -2000000001; 15 } 16}; 17 18void alds1_9_1() 19{ 20 // 完全二分木 21 // Complete binary tree 22 int n, key; 23 std::cin >> n; 24 CBTree T(n); 25 26 //入力 27 for (int i = 1; i <= n; ++i) 28 { 29 std::cin >> key; 30 T.heap[i] = key; 31 } 32 33 //確認出力 34 for (int i = 1; i <= n; ++i) 35 { 36 std::cout << T.heap[i] << std::endl; 37 } 38} 39 40int main() 41{ 42 alds1_9_1(); 43 getchar(); 44 return 0; 45} 46
//入力例 5 7 8 1 2 3 //出力例(期待) 7 8 1 2 3 //出力(現状) 0 0 0 24 0

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

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

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

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

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

guest

回答2

0

ベストアンサー

クラスだけ

c++

1class CBTree 2{ 3 private: 4 size_t max_size; 5 6 public: 7 std::vector<int> heap; 8 CBTree(size_t max_size) : 9 max_size(max_size), 10 heap(max_size) 11 { 12 heap[0] = -2000000001; 13 } 14};

flexible array membersはC++には厳密には存在しません。(C99の機能です。)
これは、構造体末尾にサイズ不定の配列がくっついてると仮定します。
そのため、heap[max_size]=0ではオブジェクトの末尾+max_sizeの場所に0を書き込みます。

mallocで確保するstructならともかく、classでこんな事をやるとどうなるか分かったもんじゃないので
可変長配列が欲しいのならばstd::vectorを使いましょう。

投稿2018/11/11 09:35

asm

総合スコア15147

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

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

opyon

2018/11/11 09:39

回答ありがとうございます。 普段やこれまでは学習初期から一貫してstd::vectorのみを使用していたのですが、最近ポインタを使っていたのでその流れで初めていわゆる配列int[]を使ってみたのですがpythonなどとは作法が違うようで困惑しています。 ちょっと配列の初歩的なことから調べ直してみます。 すみませんでした。
asm

2018/11/11 09:45

C/C++では基本的に配列の大きさは不変です。 例外として、(C99において)構造体末尾のメンバは長さ不定の配列にできます。 これが、flexible array memberという機能です。 しかしこれは、長さ0の配列と実質変わりません。 「構造体をmalloc等によって自力で確保する際に大きめに確保したら自己責任でその余剰部分を使える。」というものです
opyon

2018/11/11 09:53

配列[]をすっ飛ばして、std::vectorからdata*などのポインタ使ってた弊害ですね^^; 配列[]を調べてみます。
asm

2018/11/11 10:00

サイズを指定しない場合は 宣言と同時に初期化しないとならないので、今回のケースでは 配列は固定長なので使えない が結論です。
opyon

2018/11/11 10:12

>配列は固定長なので使えないが結論 納得です! 違う方法で検討してみます。 ありがとうございました。 (std:vector使えば楽なのですが、多分問題の趣旨から外れそうなので^^;)
opyon

2018/11/11 19:01

配列[]を使うと何故かエラーが起きる原因が分からいことが多く結局std:vector使いました。
guest

0

int heap[];

で heap[] を宣言していますが、その領域はどこで確保しているのでしょうか?

投稿2018/11/11 09:10

pepperleaf

総合スコア6383

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

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

opyon

2018/11/11 09:21

回答ありがとうございます。 ちょっとheap[]で検索してみます。 単純に配列として名前つけただけなのですが、何か特別な意味があるのでしょうか?
SaitoAtsushi

2018/11/11 09:37

名前ではなく、領域の話です。 名前があるだけで領域が確保されていないという指摘です。
opyon

2018/11/11 09:41

コメントありがとうございます。 普段std::vectorのみを使用していたので配列int[]の作法を理解していませんでした。 配列について調べ直してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問