2010-03-01 9 views
1

이 코드를 가지고 있지만 컴파일되지 않고 잘못 된 것을 이해할 수 없습니다. 벡터의 포인터가 올바르지 않습니다. 제 아이디어는 main()에서 일부 숫자를 수집하여 벡터 및 배열에 저장 한 다음 함수의 메모리 주소를 함수에 전달하고 포인터를 사용하여 저장된 데이터를 인쇄하는 것입니다.함수에서 벡터 포인터를 사용하는 중 오류가 발생했습니다.

포인터를 사용하여 메모리를 절약해야한다고 말했을 때 아래 코드는 벡터 및 배열의 ​​내용을 복사하지 않지만 액세스 포인터는 사용합니다 기억 속에있는 그들의 위치 - 그게 내가하고 싶은 것입니다.

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

void function(vector<int>* a, int *s) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
    { 
     cout << a[i] << endl; 
     cout << s[a[i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 


int main(void) 
{ 
    vector<int> m; 
    int s[102]; 
    for(int i=0;i<10;i++) 
    { 
     m.push_back(i*i); 
     s[i*i] = i-2; 
    } 
    function(&m, &s); 
    return 0; 
} 

컴파일 중 몇 가지 오류가 발생합니다. 잘못된 것입니다.

내 코드의 문제점과 해결 방법을 알려주십시오.

void function(vector<int>& a, int *s) 

그리고

function(m, ...); 

을 확실히 이상한 원인이 벡터에 대한 포인터에 [] 사용 :

+1

컴파일 오류를 추측하는 것이 귀하의 질문 중 하나입니까? ;-) –

+1

나는 C와 C++ 프로그래밍에 대해 수년간 가르쳐 왔기 때문에 일반적인 문제 설명이 "작동하지 않는다"고 생각하기 때문에 이미 추측하기에 아주 좋습니다. eBay에서 구입 한 Crystal Ball도 도움이됩니다. – Tronic

답변

5

당신은 벡터가되지 포인터, 참조로 전달해야합니다 ... 감사합니다 문제는 마치 std :: vectors 배열을 가리키는 것처럼 동작하기 때문에 (실제로는 하나만 가리키는 반면). 벡터 자체는 그것에 의해 결코 인덱싱되지 않습니다. (*a)[...]을 사용하여 포인터로 벡터를 인덱싱 할 수도 있습니다. 사용자가 포인터 파싱 고집

+0

이것은 위험한 조언이기 때문에 다운 voting - 많은 코딩 표준이 결코 비 const 참조를 지나치지 말라는 조언을 해줍니다. 그에 대한. 최소한 벡터 참조는 const 여야합니다. 그러나이 대답은 실제 문제를 해결하지 못합니다. 포인터가 사용되기 전에 역 참조가 필요하다는 것입니다. [i]를 (* a) [i]로 바꾸면이 문제를 이해하려는 독자에게 도움이 될 수 있습니다. –

2

후 정확한 구문은 shoulld :

void function(vector<int>* a, int *s[]) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<a->size();i++) 
    { 
     cout << (*a)[i] << endl; 
     cout << (*s)[(*a)[i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 
+0

오류 : 'int (*) [102]'을 'int **'로 변환 할 수 없습니다. 작동하지 않습니다. – VaioIsBorn

+0

죄송합니다, 아래 AndreyT 코멘트를 읽으십시오. 그러나 funtion (m, s)를 호출하고 참조로 파싱하십시오. –

1

(보정)

&s 사실 int(*)[102]이다 : 102 개 항목의 배열에 대한 포인터를 가리킨다.

당신은 말을해야 오래된 C의 기존 규칙에 의해 배열은 기본적으로 인덱스 0와의 항목에 const를 포인터 그래서 s 이미 int*

+1

'& s'는 * int *가 아닙니다. '& s'는'int (*) [102]'입니다. 배열은 const 포인터가 아닙니다. 가치 문맥에서 그것은 나타날 수도 있지만이 경우에는 주소가 취해질 때 그렇지 않다. – AnT

+0

예, 그렇습니다. 어쨌든'& s'는'int * '가 아니기 때문에's'를 인자로 넘기면 충분합니다. – Vlad

0

이 버전의 작품이기 때문에

function(&m, s); 

입니다 :

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

void function(const vector<int>& a, int s [102]) 
{ 
    cout << "function starts.." << endl; 
    for(int i=0;i<(int)a.size();i++) 
    { 
     cout << a [i] << endl; 
     cout << s[a [i]] << endl; 
    } 
    cout << "function ends..." << endl; 
} 


int main(void) 
{ 
    vector<int> m; 
    int s[102]; 
    for(int i=0;i<10;i++) 
    { 
     m.push_back(i*i); 
     s[i*i] = i-2; 
    } 
    function(m, s); 
    return 0; 
} 
+0

니스, 작동합니다. 하지만 내가 볼 수 있듯이 포인터가 전달되지 않습니다 - 이유는 무엇입니까? 또한 함수에 s에 대한 포인터를 전달하여 함수에 전체 배열을 전달하지 않으려 고합니다.이를 수행 할 수있는 방법이 있습니까? – VaioIsBorn

+0

전체 배열을 값으로 전달하는 것은 좋지 않습니다. "기능 (M, S),"I는 "무효 기능 (CONST 벡터 & A, INT의 * s의)" 를 사용 로 호출하려는 –

+0

@VaiolsBorn : 포인터로 전달됩니다. C++에서는 배열을 값으로 전달할 수 없습니다. int s []'(크기는 무시됩니다)와'int * s' (배열은 어쨌든 포인터로 쇠퇴합니다)와 완전히 같습니다. – visitor

1

우선 주 프로그램에서 s는 int에 대한 포인터이고 m은 벡터입니다. 따라서 함수 호출은 다음과 같아야합니다 :

함수 (& m, s);

두 번째로 함수 a는 벡터에 대한 포인터이므로 다음과 같이 색인화해야합니다. (* a) [i].

무효 기능 (const를 벡터 & A, INT의 * s의) { .. A [i]를 < < ENDL < < cout을 :

당신은 정말 주위에 당신의 벡터를 통과 const를 참조를 사용한다 그러나 ; .. }

화하고 호출

기능 (m, S);

관련 문제