2014-11-18 4 views
-3

문자열과 int를 허용하고 주어진 문자열과 그 int 배열을 만드는 함수를 만들려고합니다. 예 "에서 myArray"문자열을 주어 5는 내가 사용하는 배열 int myarray[5];해야한다 :C++ 함수는 인수를 기반으로 배열을 만듭니다.

void function(string x, int y) { 
    int x[y]; 
} 

을하지만 ... declaration of 'int x[y]' shadows a parameter 나에게 모든 팁을 제공합니다?

+1

예 : 귀하의 첫 번째 매개 변수는'문자열 x' 다른 뭔가? 동일한 범위에서 동일한 이름을 가진 선언을 가질 수 없습니다. – displayname

+0

'int x [y]'는'myarray'라는 변수를 선언하지 않습니다. 어쨌든 동적으로 이름 붙여지고 동적으로 크기가 지정된 배열이 필요하면'std :: unordered_map '를 사용하십시오. –

+1

귀하의 기능이 무엇을해야하는지 이해가되지 않습니다. 당신이 그것을 묘사 한 방식은 : 로컬 어레이 (불법적으로 btw)를 선언하는 것을 제외하고는 아무 일도하지 않습니다. 귀하가 성취하려고 시도하는 것에 대해 더 많은 것을 말씀해주십시오. –

답변

3

declaration of int x [y] shadows a parameter은 실제로 다른 변수를 "숨기고 있음"을 의미합니다.

x이라는 문자열 인수와 x이라는 배열을 컴파일러에서 어떻게 구별해야합니까? 그렇지 않습니다! 그들은 둘 다 같은 이름을 가지므로 문자열에 더 이상 액세스 할 수 없습니다.

즉, C++의 배열 크기는 컴파일 타임에 알려 져야한다고 말하면 코드에는 해당하지 않습니다. 일부 컴파일러는 확장 기능을 제공하지만 표준 준수를 유지하려면 벡터를 사용해야합니다.


일부 key하고 std::map 또는 std::unordered_map을 조사 할 수있는 value 사이의 관계를 갖고 싶어

void function(std::string x, int y) { 
    std::vector<int> other_name(y); 
} 

.

void function(string x, int y) { 
    std::map<std::string, std::vector<int>> my_map; 

    my_map[x] = std::vector<int>{1, 2, 3, 4, 5}; 
} 

{1, 2, 3, 4, 5}

+0

@ TheParamagneticCroissant 완료, 이미 편집 중입니다. –

3

당신은 정말 매크로, 예를 들어, 함께 이런 종류의 일을 할 수있는 벡터로 문자열 x를 연결할 수 있습니다지도를 작성합니다

int myarray[5]; 

필요 :

#define FUNCTION(x, y) \ 
    int x[y] 

// ... 

FUNCTION(myarray, 5); 

이 다음에 확장됩니다.

그러나 나는 이것을 권장하지 않습니다. 실제 문제에 대해 설명하면 아마도 매크로가 포함되지 않은 훨씬 좋은 해결책 일 것입니다.

3

런타임에 배열의 문자열 이름을 가진 변수의 이름을 지정할 수 없습니다.

변수 이름 만 컴파일 할 수 있습니다. 즉, 모든 변수 이름을 코드에 정의해야합니다.

동적 이름을 갖고 싶다면지도를 저장하고 문자열, 벡터 이름 및 벡터를 저장해야합니다.

2

vector을 C 스타일 배열보다 사용하는 것이 좋습니다. C++ Std Lib 함수를 사용하는 것이 자신의 롤을 만드는 것보다 낫습니다. 이 두 가지 모두를 감안할 때, 당신이하려는 것은 어떤 상황에서도 의미가 없습니다. 문맥의

부족, 여기에 내가 할 줄 것입니다 : 코드에서

#include <string> 
#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <iterator> 

int main() 
{ 
    const std::string val = "Foo"; 
    constexpr size_t numVals = 5; 
    std::vector <std::string> myVals (numVals, val); 
    std::copy (myVals.begin(), myVals.end(), std::ostream_iterator <std::string> (std::cout, "\n")); 
} 
0

오류가 변수가 숨어있다. 로컬 변수 "x"를 선언하여 매개 변수 "x"를 숨기고 있습니다.변수 x가 사용될 때 컴파일러는 전달 된 문자열 x가 아니라 배열 인 로컬 변수 x를 사용한다는 것을 알고 있습니다.

전달하는 문자열의 성격이 변수 이름으로되어 있으면이 구문은 찾고 있던 구문이 아니며 사실 존재하지 않습니다. C 및 C++의 변수 이름은 컴파일 타임 중에 선언되며 런타임은 선언되지 않습니다. 런타임에 변수의 이름을 찾는 것은 불가능하지는 않더라도 어렵습니다.

사실, 함수가 로컬 배열이라고 부르는 것은 신경 쓰지 않아도됩니다. 당신이 신경 쓰는 모든 일을하는 것이 좋을 수도 있습니다. 함수 호출을 사용하여 크기가 지정된 배열을 만드는 것이 더 걱정되는 것 같습니다. 새것과 같은 것.

int* x; // a pointer to an integer. 
x = new int[10]; // x now points to an array of 10 ints and can be used as an array 
// do stuff with x[] array here 
delete[] x; // free up memory 

귀하가 찾고자했던 개념이 아니라면 더 많은 피드백을 제공 할 때까지 귀하의 질문이 저의 것입니다.

관련 문제