2015-01-05 2 views
1

사용자가 2 차원 배열의 크기를 결정하는 프로그램을 만들려고했습니다. 컴파일하는 동안 함수 정의에 오류가 발생했습니다. 왜 잘못 되었습니까? 올바른 방법은 무엇입니까?가변 크기를 매개 변수로 사용하여 배열 호출

Dev-C++ 5.7.1 컴파일러 (해당되는 경우)를 사용하고 있습니다. R과 C의

#include<iostream> 

using namespace std; 

int R=0,C=0;     

void func(int); 

int main() { 
    cin>>R>>C; 
    int array[C][R]; 
         // DO STUFF HERE 
    func(array); 
         // DO SOME MORE STUFF 
    return 0; 
} 

void func(int arr[][R]) { 
        // DO STUFF HERE 
} 

답변

0
내가 배열에 대한 포인터를 전달 추천

, 두 변수는 그런 당신이 배열의 범위 내에 있어야 올바르게 포인터 연산을 사용하여 확인하는 당신에게 달려 있습니다. 그렇지 않으면 이것을 템플릿으로 설정하지만 여전히 R & C의 크기를 알아야 할 것입니다.

+0

정확히 2 차원 배열에 대한 포인터를 ap로 전달합니까? 아라 메타? 그리고 어떻게 그것을 함수 내에서 2-D 배열로 다시 변환 할 수 있습니까? (나는 C++에 비교적 익숙하다.) 고마워! –

+0

나는 라이언이 대답의 두 번째 부분에서 그것을 꽤 잘 처리했다고 생각한다. 함수 안에서는 array [x] [y]를 사용하면됩니다. 이것은 그것을하는 방법에 대한 C 답변입니다. Ryan의 대답 중 첫 번째 부분은 더 적절한 C++ 방식입니다. –

2

ISO-C++에서 VLA를 금지합니다. 배열을 동적으로 할당하려면 원시 포인터 트릭을하거나 벡터의 vector을 사용해야합니다. 벡터 방식의

벡터 :

std::cin >> R >> C; 
std::vector<std::vector<int>> array(R, std::vector<int>(C)); 

func의 서명은 다음이된다 (CONST 정확성이 상이 할 수 있음)

void func(const std::vector<std::vector<int>>& v); 

위가 더 쉽고 유지 보수, 안전 짧은 솔루션이다. 포인터와 포인터와


당신이 그것을 할 수 포인터 할 수 있지만, 더 복잡하게, 당신은 FUNC의 서명 당신 new

int R, C; 
std::cin >> R >> C; 
int **array = new int*[R]; // allocates space for R row pointers 
for (int i = 0; i < R; ++i) { 
    array[i] = new int[C]; // for each row, allocate C columns 
} 

func(R, C, array); 

//then delete everything 
for (int i = 0; i < R; ++i) { 
    delete [] array[i]; // delete all of the ints themselves 
} 
delete [] array; // delete the row pointers. 

void func(int r, int c, int **arr); 
되는 delete 모든 필요

다시 벡터 벡터 벡터는 훨씬 쉬울 것입니다.

0

배열은 스택 또는 힙의 두 가지 메모리 영역에 위치 할 수 있습니다.
지정한대로 배열이 스택에 있습니다. 배열은 스택에있는

int array[SIZE]; 

, 컴파일러는 그 크기 무엇인지 미리 알 필요가 그에 크기는 상수 식 (컴파일 타임), 때로는 정의 된 값이어야합니다 (사용하여 설정 #define SIZE 10). 당신이 (런타임에 결정됩니다) 알 수없는 크기의 배열을 만들려면
, 당신은 다음과 같이 힙에 배열을 만들어야합니다

나중에
int **array = new int*[C]; 
for(int i = 0;i<C; i++) 
    array[i] = new int[R]; 

, 당신이 모든을 삭제하는 것을 기억해야한다 동적으로 할당의 사용은 우리가 배열을 삭제하기 때문에, [] 삭제

for(int i = 0;i<C; i++) 
    delete[] array[i]; 
delete[] array; 

노트 (모든이에 새로운 사용) (배열의 int의 배열의 배열, 배열은 [I] int 배열입니다)

+0

은 C++ 11의'constexpr std :: size_t SIZE = 10;'에서'enum {SIZE = 10};이나 C++의 일부분 (선행 처리기 치환과 반대)을 선호하기 때문에'enum {SIZE = 10}; –

+0

'SIZE'는'const'이어야합니다. * 상수 표현식 *이어야합니다. 값을 컴파일 할 때 알 수없는 const 변수를 가질 수 있습니다. –

+0

@ RyanHaining 당신 말이 맞습니다. 결정된 – Gadol21

관련 문제