2013-07-09 4 views
0

아주 큰 배열의 부호없는 long int를 할당하고 초기화하려고합니다. 이 배열은 단순한 1-D 배열이며 첫 번째 N 소수의 값으로 채 웁니다. 이미 이들을 .cpp 파일에 담아서 포함시킬 프로그램이 있습니다. 배열을 초기화하는 구문을 모르겠습니다. 나는대형 배열 할당 및 채우기

unsigned long int *known = new unsigned long int[N]; 

힙에 배열을 만들 것이라는 점을 알고있다,하지만 난 멤버를 초기화하는 방법을 모르겠어요. 어레이 위에

답변

2

당신은 근본적으로 단지 루프 그래서 같이 모든 요소에 올바른 값을 할당한다

for(size_t idx = 0; idx < N; ++idx) 
{ 
    *(known + idx) = retrieve_value(idx); 
} 

을 분명히 알려져 [IDX]에 할당해야 할 적절한 값을 복귀 retrieve_value 기능.

또한 포인터/배열 등가의 활용 및 배열 구문을 사용하여 코드를 작성할 수 있습니다 배열에게 난 강력 것이 방법을 new'ing에 대한 좋은 이유가없는 말했다

for(size_t idx = 0; idx < N; ++idx) 
{ 
    known[idx] = retrieve_value(idx); 
} 

을 요즘 대부분 불필요한 메모리 관리 문제를 피할 수 있으므로 std :: vector 나 std :: array와 같은 표준 컨테이너 중 하나를 사용하는 것이 좋습니다. 컴파일 타임에 N이 알려지면 std::array은 오버 헤드가 적을 것이고, 그렇지 않으면 std::vector을 적절한 reserve() 호출과 함께 사용하면 작업을 잘 처리 할 수 ​​있습니다. 사용 가능한 메모리에서 마지막 바이트를 절대적으로 쥐어 짜야하는 경우 원시 메모리를 다루는 것이 좋습니다.

+0

그래서 약간의 조사를했고 조언을 받아서 힙에 정의되도록 시도했습니다 : std :: vector * known = new 벡터 ; \t 알려진 [1] = 2; known [2] = 3; 알려진 [3] = 5; 알려진 [4] = 7; \t 알려진 [5] = 11; 알려진 [6] = 13; 알려진 [7] = 17; 알려진 [8] = 19; \t 알려진 [9] = 23; 알려진 [10] = 29; 알려진 [11] = 31; 알려진 [12] = 37; j = 알려진 [i]; 하지만 여전히 오류가 발생합니다. 선언문은 정상적으로 작동하지만 멤버가 채울 수는 없습니다. 나는 아직도 이것에 대해 많은 것을 배우고 있고 재 학습하고 있기 때문에 도움을 주셔서 감사합니다. – cassius

+0

힙에 벡터를 할당 할 필요가 없습니다. 어쨌든 대부분의 경우 저장소가이를 자동으로 구현합니다. 'std :: vector known;을 사용하면된다. 위에 쓴 것처럼 할당을 벡터에 사용하려면'known.resize (size)'를 호출하거나 생성시 벡터를 초기화/크기 조정해야합니다. 벡터 API에 대한 전체 설명은 cppreference.com 또는 유사한 사이트를 참조하십시오. –

+0

오케이, 구문에 대한 권리가 있습니다. 내 프로그램에 직접 붙여 넣으면 작동합니다. KnownPrimes.h에 정의를 포함하면 컴파일러 오류가 발생하지만 "g ++ : error : KnownPrimes.o : No such file or directory"오류가 발생합니다. 컴파일러가 .o 파일을 찾는 이유는 무엇입니까? – cassius

0

배열 및 배열 수에 대한 포인터를 만들 수있는 배열 초기화 프로그램 클래스를 만드는 것이 좋습니다. 이 클래스의 전역 변수를 사용하십시오. 생성시 생성자가 배열을 채 웁니다.

class ArrayInitializer{ 
     ArrayInitializer(unsigned long* ptr, size_t Size); 
     ... 
     ... 
    }; 

지금

//include your header here, 
    ArrayInitializer g_arrayInit(known,N); 

글로벌 변수는 즉시 프로그램 실행을 시작으로 생성 된 전역 변수를 만들 수 있습니다. 또한 당신은이 클래스를 사용하여 'new'를 사용하여 할당 된 메모리를 정리할 수 있습니다.

+0

이것이 원래의 포스터를 사는 것이 무엇인지 잘 모르겠습니까? 특히 글로벌 변수 부분. –