2012-04-28 3 views
0

main 메서드에서 참조로 선언 된 배열을 함수에 대한 매개 변수로 전달할 수 있습니까? 또한 컴파일러가 dimentions를 원하지만, 내가 변수를 줄 때, 컴파일러가 배열의 잘못된 정수 차원의 오류를 제공, 여기에 코드입니다 :C++의 함수 매개 변수로 참조로 배열 전달

#include <iostream> 
#include <algorithm> 
#include <vector> 
using namespace std; 

int scanV(int Row, int value, int M, int (&tableValues)[]) 
{ 
for (int i = 0; i <= M; ++i) 
{ 
    if (tableValues[Row - 1][i] == 1) 
    { 
     if (i + value <= M) 
     { 
      tableValues[Row][i+value] == 1; 
     } 
     if (i - value >= 0) 
     { 
      tableValues[Row][i-value] = 1; 
     } 
    } 
} 
} 

int main() 
{ 
int C, B, M; 
cin>>C; 
int integers[C]; 

for (int i = 1; i < C; ++i) 
{ 
    cin>>integers[i]; 
} 
cin>>B; 
cin>>M; 
integers[0] = B; 
int tableValues[C][M + 1]; 
tableValues[0][B] = 1; 
for (int i = 1; i < C; ++i) 
{ 
    scanV(i, integers[i], M, tableValues); 
} 

return 0; 
} 
+1

쉬운 :'벡터 & tableValues'는 매개 변수가 될 것입니다. – chris

+1

tableValues ​​매개 변수는 int 배열 배열이 아닌 int 배열에 대한 참조이므로 tableValues ​​[x] [y]를 수행 할 수 없으며 int 배열 배열에 전달할 수도 없습니다. 코드에는 여러 가지 다른 문제가 있습니다. 예를 들어, C가 컴파일 타임 상수가 아니라면 "int integer [C]"를 수행 할 수 없습니다 (여기에는 분명히 없습니다). – abarnert

+0

좋아,하지만 그것을 사용하면 "(tableValues ​​[행 - 1] [i] == 1)"및 오류 "잘못된 형식 int [int] '배열에 대한 10 줄에 오류를 제공합니다 첨자 | 다른 줄에 더 많은 것 – user1113314

답변

2

하나의 간단한 해결책은 벡터를 사용하는 것입니다. 이 간단한 예제를 고려해보십시오.

#include <iostream> 
#include <vector> 

void f (std::vector<std::vector<int> > &v) 
{ 
    for (int i = 0; i < 3; ++i) 
     for (int j = 0; j < 3; ++j) 
      v[i][j] = i * 3 + j; 
} 

int main() 
{ 
    std::vector<std::vector<int> > v (3, std::vector<int> (3, 0)); 
    f (v); 

    for (int i = 0; i < 3; ++i) 
     for (int j = 0; j < 3; ++j) 
      std::cout << v[i][j] << ' '; 
} 

int에서는 (2x3) int의 2D 벡터가 만들어집니다. 생성자는 3 개의 요소를 보여 주며, 모든 요소는 int의 벡터로 초기화되며 3 개의 요소가 0으로 초기화되어 생성됩니다.

그런 다음 벡터는 참조를 통해 증가하는 값을 할당하는 함수 f로 전달됩니다. 자신의 사용은 일반 배열과 매우 유사하다,

0 1 2 3 4 5 6 7 8 

당신이 볼 수 있듯이,하지만 그들은 실제로 포함하고를 사용하여 프로그래밍의 새로운 수준에 쉽게 액세스를 제공합니다 : 벡터 메인 인쇄되면 보여줍니다 STL.

C++ 11에서는 그 사용이 훨씬 익숙해졌습니다. 다음과 같이 벡터를 할당 할 수 있습니다 여러 차원의 벡터 것이 대신 기본 1D 벡터 형식으로 어떤 종류의 매트릭스 클래스에 캡슐화하는 것이 좋습니다가 있다고

std::vector<int> v0 = {2, 5}; 
std::vector<std::vector<int> > v1 { {1,2,3} , {4,5,6} , {7,8,9} }; 

참고.

편집 :

여기에 지정된 요소에 1D 및 2D 벡터를 초기화의 예입니다. 위에서 보았 듯이 이것은 C++ 11에서는 쉽지만 배열이 이미 있다면 꽤 빠릅니다. 한 번에 하나 개의 요소를 통과 들어

int a [5] = {1,2,3,4,5}; //normal 
std::vector<int> v1 (a, a +5); //create using beginning and ending addresses of a 

int b[3][3] = { {1,2,3} , {4,5,6} , {7,8,9} }; //normal 
std::vector<std::vector<int> > v2; //empty vector 

for (int i = 0; i < 3; ++i) //3 in first dimension 
    v2.push_back (std::vector<int> (b [i], b [i] + 3)); //push a vector with the appropriate 3 elements of b onto the back of v2 

, 당신은이 작업을 수행 할 수 있습니다

std::vector<std::vector<int> > v (3, std::vector<int> (3)); 

for (int i = 0; i < v.size(); ++i) //v.size() == 3 
    for (int j = 0; j < v [i].size(); ++j) 
     adjustElement (v [i][j]); //replace with what you need 
+0

변수를 std :: vector >에 어떻게 두어야합니까? v (3, std :: vector (3, 0)); ? – user1113314

+0

마지막 문장은 아마도 다시 작성해야합니다. 확실히 여러 차원을 1D 벡터로 캡슐화하고 싶지는 않습니다. 그가 여기에서 원하는 것은 2D 매트릭스 클래스입니다. – abarnert

+0

@abarnert, 입력 해 주셔서 감사합니다. 내가 바꿀거야. 또한, user1113314, 예제를 추가하겠습니다. – chris

1

std::vector들 금지 가변 길이 배열 (예 : int integers[C]; 등)로 C++로 갈 수있는 방법입니다.

나는이 쉽게 코드를 읽을 수 있도록 보내고 typedef 추천 :

#include <vector> 

typedef std::vector<int> row_t; 
typedef std::vector<row_t> table_t; 

이 그럼 당신은 선언 할 수 있습니다 : 그것은 아무것도 반환하지 않기 때문에 나는이 void을했습니다

void scanV(int Row, int value, int M, table_t& tableValues) 

. int main()에서

귀하의 변수는 다음이 될 :

row_t integers; 
table_t tableValues; 

이 줄을 조심 :

  tableValues[Row][i+value] == 1; 

당신은 아마 할당하는 의미 동등성을 확인하기보다는!`표준 : vector`와

그리고 B보다 좀 더 의미있는 변수 이름을 선택하는 시도하십시오, M, C ...

관련 문제