2014-12-01 3 views
0

C++의 새로운 기능입니다. 이 같은초기화되지 않은 변수를 인수로 배열을 사용하여 함수에 전달

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

int m, n; 
void indtastVektor(double A[m]); 
void indtastMatrix(double A[m][n]); 

내 주요 외모 : 나는 내 코드의 시작 부분에 이러한 선언이

int main() { 
    string svar; 
    do { 
     cout 
       << "Ønskes indtastning af en vektor eller en matrix? Tast v for vektor og m for matrix: "; 
     svar = cin; 
     if (svar == "v" or svar == "V") { 
      cout << "Indtast det ønskede antal rækker i vektoren som heltal: "; 
      cin >> m; 
      double vektor[m]; 
      indtastVektor(vektor); 
      break; 
     } else if (svar == "m" or svar == "M") { 
      cout << "Indtast det ønskede antal rækker i matricen som heltal: "; 
      cin >> m; 
      cout << "Indtast det ønskede antal søjler i matricen som heltal: "; 
      cin >> n; 
      double matrix[m][n]; 
      indtastMatrix(matrix); // This line of code gives me an error 
      break; 
     } else { 
      cout << "Intet gyldigt svar indtastet - forsøg igen. \n"; 
     } 
    } while (true); 
    return 0; 
} 

라인 : indtastMatrix (매트릭스); 'indtastMatrix'

기본적 기능은 사용자가 지정한 m을 취하고, N 및 이들 값을 이차원 배열을 생성하는 호출

일치 함수 : 저 다음 오류 준다. Eclipse는 날이 설명을 제공한다 : 행

알려진 전환 '이중 [m]을 [N]을'이중 (*) [N] 첫번째 인수 공극 indtastMatrix (더블 A [m] [N]) ;

정확히 무엇을 의미합니까? 나는 또한 main 함수 앞에 m과 n을 초기화 할 필요가 있다고 가정한다. 내가 런타임에 변수를 초기화하고, 기능이 걸리는 경우 함수에 전달할 수 와서 어떻게

cin >> m; 
double vektor[m]; 
indtastVektor(vektor); 

:

나를 혼란하게 만드는 것은이 코드는 오류를 반환하지 않는다는 사실이다 1 차원 배열을 인수로 사용하지만 2 차원이 아닌 경우?

감사!

답변

0

비표준 확장 인 가변 길이 배열 (VLA)을 사용하고 있습니다.

대신 std::vector을 사용하십시오. something like

void indtastVektor(std::vector<double>& v); 
void indtastMatrix(std::vector<std::vector<double>>& v); 

// ... 

std::vector<double> vektor(m); 
indtastVektor(vektor); 

//... 

std::vector<std::vector<double>> matrix(m, std::vector<double>(n)); 
indtastMatrix(matrix); // This line of code gives me an error 
0

배열은 포인터를 함수에 전달할 때 포인터로 변합니다. 따라서 배열 배열은 배열에 대한 포인터로 붕괴됩니다. 유형은 sometype (*)[size]이고 size은 "내부"(2 차원) 배열의 크기입니다. 정의하거나 함수를 선언 할 때

그러나, 정확한 크기는 컴파일 시간 알려진해야합니다. 크기가 알려지지 않은 경우 단순히 수행 할 수 없습니다.


template<std::size_t SZ> 
void indtastMatrix(double (*A)[SZ]); 
는 또한 variable-length arrays 일부 컴파일러의 비표준 확장이 있습니다 :하지만 템플릿을 사용하여 해결 방법이 있습니다. 대신 std::vector을 사용하십시오.