質問

#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++;
}

このプログラムは、フロートX [サイズ] [2]を宣言する行で、予想される一定の発現エラーを提供しています。なんで?

役に立ちましたか?

解決

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, 、Aを使用できます 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

他のヒント

配列はコンパイル時に割り当てられ、それ以降 size 定数ではありません。コンパイラはその値を正確に決定することはできません。

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

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

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

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

それは言語の制限です。配列サイズは一定の式でなければなりません。これは、cplusplus.comからの部分的なjsutificationです

注:配列が保持する要素の数を表すブラケット内の要素フィールド[]は、実行前にサイズを決定する必要がある非ダイナミックメモリのブロックであるため、一定の値でなければなりません。可変長さの動的メモリを備えた配列を作成するには、これらのチュートリアルで後で説明する必要があります。

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

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

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

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

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

それは一定の表現を期待していたからです!

C(C99のVLAを無視する)およびC ++の配列寸法は、コンパイル時にわかっている量でなければなりません。それは、単にラベル付けされたという意味ではありません const: : 彼ら 持ってる プログラムにハードコーディングされます。

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

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

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

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

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top