7
#include <iostream>
#include <fstream>
#include <cmath>
#include <math.h>
#include <iomanip>
using std::ifstream;
using namespace std;

int main (void)

{
int count=0;
float sum=0;
float maximum=-1000000;
float sumOfX;
float sumOfY;
int size;
int negativeY=0;
int positiveX=0;
int negativeX=0;
ifstream points; //the points to be imported from file
//points.open( "data.dat");
//points>>size;
//cout<<size<<endl;

size=100;
float x[size][2];
while (count<size) {



points>>(x[count][0]);
//cout<<"x= "<<(x[count][0])<<"  ";//read in x value
points>>(x[count][1]);
//cout<<"y= "<<(x[count][1])<<endl;//read in y value


count++;
}

このプログラムは、float x[size][2]を宣言した行で予想される定数式エラーを出します。なんで?

4

8 に答える 8

12
float x[size][2];

宣言された配列はランタイムサイズを持つことができないため、これは機能しません。ベクトルを試してください:

std::vector< std::array<float, 2> > x(size);

または、新しいものを使用します

// identity<float[2]>::type *px = new float[size][2];
float (*px)[2] = new float[size][2];

// ... use and then delete
delete[] px;

C ++ 11を使用できない場合は、boost::arrayの代わりにを使用できますstd::array

ブーストが利用できない場合は、ベクターに固執できる独自の配列タイプを作成してください

template<typename T, size_t N>
struct array {
  T data[N];
  T &operator[](ptrdiff_t i) { return data[i]; }
  T const &operator[](ptrdiff_t i) const { return data[i]; }
};

の構文newを簡単にするためidentityに、インプレースtypedefであるテンプレートを使用できます(で利用可能boost

template<typename T> 
struct identity {
  typedef T type;
};

必要に応じて、次のベクトルを使用することもできますstd::pair<float, float>

std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second
于 2010-03-15T15:47:50.263 に答える
8

配列はコンパイル時に割り当てられますがsize、定数ではないため、コンパイラーはその値を正確に判別できません。

于 2010-03-15T15:43:27.057 に答える
4

C ++では(C99で呼び出されるように)可変長配列を持つことはできません。サイズには、動的に割り当てられた配列(サイズが変化する場合)または静的な積分定数式を使用する必要があります。

于 2010-03-15T15:44:10.003 に答える
2

float x[size][2]配列はコンパイル時に割り当てる必要があるため(いくつかのコンパイラ固有の例外を除いて)、この行は機能しません。コンパイルx時に配列のサイズを簡単に変更できるようにする場合は、次のようにします。

 #define SIZE 100
 float x[SIZE][2];

実行時にのみ持っている情報に基づいて配列を本当に割り当てたい場合は、mallocまたはを使用して配列を動的に割り当てる必要がありますnew

于 2010-03-15T15:46:47.867 に答える
2

自動配列のサイズは、コンパイル時定数でなければなりません。

 const int size = 100;
 float x[size][2];

サイズがコンパイル時にわからなかった場合(たとえば、ユーザーが入力した場合、ファイルの内容から決定された場合)、動的割り当てを使用する必要があります。次に例を示します。

std::vector<std::pair<float, float> > x(somesize);

(ペアの代わりに、専用のPoint構造体/クラスが完全に理にかなっています。)

于 2010-03-15T15:55:39.777 に答える
2

一定の表現を期待していたから!

C(C99のVLAを無視)およびC ++の配列次元は、コンパイル時に既知の量である必要があります。constこれは、単にラベルが付けられているという意味ではありません。プログラムにハードコーディングする必要があります。

動的割り当てまたはstd::vector(動的配列割り当てのラッパー)を使用して、実行時に配列サイズを決定します。

于 2011-01-02T23:00:44.720 に答える
1

言語の制限です。配列サイズは定数式である必要があります。これがcplusplus.comからの部分的なjsutificationです

注:配列は非動的メモリのブロックであり、実行前にサイズを決定する必要があるため、配列が保持する要素の数を表す括弧[]内の要素フィールドは定数値である必要があります。可変長の動的メモリを使用して配列を作成するには、動的メモリが必要です。これについては、これらのチュートリアルの後半で説明します。

于 2010-03-15T15:45:07.163 に答える
1

サイズに値を割り当てていません。したがって、コンパイラはアレイにメモリを割り当てることができません。(nullサイズの配列?何?)

さらに、SIZEを変数ではなく定数にする必要があります。

編集:残念ながら、投稿者が質問を変更したため、この応答はもはや意味がありません。

于 2010-03-15T15:47:31.657 に答える