문제

#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]를 선언하는 선에서 예상되는 일정한 표현 오류를 제공합니다. 왜요?

도움이 되었습니까?

해결책

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, 당신은 an을 사용할 수 있습니다 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의 VLAS 무시) 및 C ++의 배열 치수는 컴파일 타임에 알려진 수량이어야합니다. 그렇다고 단지 라벨이 붙은 것은 아닙니다 const: 그들 가지다 프로그램에 하드 코딩되는 것.

동적 할당 또는 std::vector (동적 배열 할당 주변의 래퍼 인) 런 타임에서 배열 크기를 결정합니다.

크기에 값을 할당하지 않았습니다. 따라서 컴파일러는 배열에 대한 메모리를 할당 할 수 없습니다. (널 크기의 배열? 뭐?)

또한 크기를 변수가 아닌 일정하게 만들어야합니다.

편집하다: 불행히도 포스터가 질문을 변경했기 때문에이 응답은 더 이상 의미가 없습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top