1

私は C++ で小さなプログラミング演習に取り組んでいます。目標は、2 の最初の 32 個のべき乗で配列を開始し、後でそれらを出力することです。通常の for ループを使用しても問題はありませんが、C++11 標準で導入された範囲ベースの for ループを使用しようとしました。コンパイル中に、「範囲ベースの for ループは C++11 拡張 [-Wc++11-extensions] です」という警告が表示されます。プログラムを実行すると、「Segmentation fault: 11」というエラーが表示され、それ以上の出力はありません。

elem 変数がどういうわけか壊れていることはすでにわかっていますが、その方法がわかりません。あなたがn00bを助けることができることを願っています:)

#include <iostream>
#include <cmath>
using namespace std;

int main()
{
    const int LAENGE = 32;
    long potenzen[LAENGE];

    for(int elem : potenzen)
    {
        potenzen[elem] = pow(2.0, (double) (elem + 1));
    }

    for(int elem : potenzen)
    {
        cout << endl;
        cout << potenzen[elem];
    }

    cout << endl;

    return 0;
}
4

3 に答える 3

7

elemインデックスではなく のが割り当てられます。代わりに、配列の要素を出力したいものです。配列を埋めるには、単純に整数インデックスを使用します。potenzencout << elem;

for (int i = 0; i < LENGTH; i++) { // ProTip #1: use English identifiers
    array[i] = 2 << i; // ProTip #2: don't use `pow()` when working with integers
}

コンパイラの警告について:コンパイル時に-std=c++11or-std=c++0xフラグを使用して、C++11 機能を使用するつもりであることをコンパイラに伝えます (GCC または clang を使用すると仮定します。他のコンパイラについてはわかりません)。

于 2013-09-14T14:19:25.743 に答える
3

Ranged for ループは、要素のインデックスではなく、要素の値を提供します。

    potenzen[elem] = pow(2.0, (double) (elem + 1));

する必要があります

for(int i = 0; i < LAENGE; i++)
  potenzen[i] = 2 << i;

(シフトについては、H2CO3の回答と以下の彼のコメントを参照してください)

ここでは foreach ループを使用できないことに注意してください。

for(int& elem : potenzen)
{
    elem = pow(2.0, (double) (elem + 1));
}

elemステートメントの右側で初期化されていない値にアクセスしているためです。

また:

for(int elem : potenzen)
{
    cout << endl;
    cout << potenzen[elem];
}

する必要があります

for(int elem : potenzen)
{
    cout << endl;
    cout << elem;
}

aselemには配列値が含まれます。

于 2013-09-14T14:20:28.653 に答える
1

上記の回答はコードの問題を正しく指摘していますが、配列インデックスを要素値として使用する場合は、それらを設定する必要があります。これがないと、不確定な (ガベージ) 値に初期化されます。次のコードも、あなたがやろうとしたことに幾分似ている解決策です:

#include <iostream>
#include <algorithm>

int main()
{
  constexpr auto count = 32;
  unsigned long long values[count] = { }; // initialise elements to 0
  auto i = 0;
  // fill them with their respective index values
  std::generate_n(values, count, [&i] { return i++; });
  for(auto &x : values)
  {
    // without casting the literal 2 would be treated as an int
    x = static_cast<unsigned long long>(2) << x;
    std::cout << x << std::endl;
  }
  return 0;
}

多くのシステムでは long のサイズは 4 バイトですが、2^32 = 4294967296 = 0x100000000 つまり 33 ビットが必要なので、unsigned long long代わりにを使用しました。longまた、すべての値が正になることがわかっているため、符号なしにする方が理にかなっています。

于 2013-09-14T17:10:39.940 に答える