Pergunta

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

Este programa está a dar-me o esperado expressão constante de erro na linha onde declaro float x[tamanho][2].Por quê?

Foi útil?

Solução

float x[size][2];

Isso não funciona porque as matrizes declaradas não podem ter tamanhos de tempo de execução. Experimente um vetor:

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

Ou use novo

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

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

Se você não tem C ++ 11 disponível, pode usar boost::array ao invés de std::array.

Se você não tem impulso disponível, torne seu próprio tipo de matriz, você pode ficar no vetor

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]; }
};

Para facilitar a sintaxe de new, você pode usar um identity modelo que efetivamente é um typedef no local (também disponível em boost)

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

Se quiser, você também pode usar um vetor de std::pair<float, float>

std::vector< std::pair<float, float> > x(size);
// syntax: x[i].first, x[i].second

Outras dicas

A matriz será alocada no momento da compilação e desde size não é uma constante, o compilador não pode determinar com precisão seu valor.

Você não pode ter matrizes de comprimento variável (como são chamados na C99) em C++.Você precisa usar matrizes alocadas dinamicamente (se o tamanho varia) ou estático integrante expressão constante para o tamanho.

A linha float x[size][2] Não funcionará, porque as matrizes precisam ser alocadas no horário de compilação (com algumas exceções específicas do compilador). Se você quiser alterar facilmente o tamanho da matriz x no compilar Tempo, você pode fazer isso:

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

Se você realmente deseja alocar a matriz com base nas informações que você tem apenas no tempo de execução, você precisa alocar a matriz dinamicamente malloc ou new.

É uma restrição do idioma. Os tamanhos da matriz devem ser expressões constantes. Aqui está uma jsutificação parcial do Cplusplus.com

Nota: O campo Elementos entre colchetes [] que representa o número de elementos que a matriz vai manter, deve ser um valor constante, pois as matrizes são blocos de memória não dinâmica cujo tamanho deve ser determinado antes da execução. Para criar matrizes com uma memória dinâmica de comprimento variável, é necessária, o que é explicado posteriormente nesses tutoriais.

O tamanho de uma matriz automática deve ser uma constante de tempo de compilação.

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

Se o tamanho não for conhecido em tempo de compilação (por exemplo, inserido pelo usuário, determinado a partir do conteúdo do arquivo), você precisará usar a alocação dinâmica, por exemplo:

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

(Em vez de um par, uma estrutura de pontos dedicados/classe faria todo o sentido.)

Porque esperava uma expressão constante!

As dimensões da matriz em C (ignorando os VLAs do C99) e C ++ devem ser quantidades conhecidas em tempo de compilação. Isso não significa apenas rotulado com const: elas tenho ser codificado no programa.

Use alocação dinâmica ou std::vector (que é um invólucro em torno da alocação de matriz dinâmica) para determinar os tamanhos da matriz em tempo de execução.

Você não atribuiu nenhum valor ao tamanho; Assim, o compilador não pode alocar a memória para a matriz. (Uma variedade de tamanho nulo? O quê?)

Além disso, você precisará tornar o tamanho uma constante e não uma variável.

EDITAR: Infelizmente, essa resposta não faz mais sentido, já que o pôster mudou sua pergunta.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top