2013-07-20 3 views
0

2 개의 별도 벡터를 만드는이 논리적 배열을 1 부분과 0 부분으로 나누고 싶다고 가정 해 보겠습니다.포인터로 전달 된 벡터 채우기

그래서 나는 다음과 같은 방법을 함께했다 (! 그래서 상상력)

void cut_and_uncut(long* input, int length, long* cut_part, int* cut_length, long* uncut_part, int* uncut_length){ 
    int i; 
    int n_cut=0; 
    for(i=0;i<length;i++) n_cut+=input[i]; 
    cut_part = vecallocl(n_cut); 
    uncut_part = vecallocl(length-n_cut); 
    *cut_length = n_cut; 
    *uncut_length = length-n_cut; 
    int index_cut = 0; 
    int index_uncut = 0; 
    for(i=0;i<length;i++){ 
    if(input[i]==1){ 
     cut_part[index_cut] = i; 
     index_cut++; 
    } else { 
     uncut_part[index_uncut] = i; 
     index_uncut++; 
    } 
    } 
} 
  • input 길이 length의 입력 벡터이다
  • cut_part가 1의 인덱스의와 벡터이다 길이 cut_length
  • uncut_part은 0의 인덱스, 길이 uncut_length
  • 인 벡터입니다. 0

: 나는

int len,len2; 
long* cut_vec; 
long* uncut_vec; 
cut_and_uncut(split,matrix.m+matrix.n,cut_vec,&len,uncut_vec,&len2); 

두의 int (lenlen2) 제대로 가득이 함수를 호출

(주 vecallocl(k)malloc(k*sizeof(long)) 단지 바로 가기입니다)하지만 난 볼 때 cut_vecuncut_vec 벡터에 segfault가 발생합니다.

나는 실제로 뭔가를 가리키지 않고 두 포인터를 초기화하기 때문에 내가 메모리에 뭔가 잘못하고 있다는 생각이 들지만 실제 vecallocl 함수를 사용하면 올바르게 초기화해야합니다.

cut_and_uncut 함수 내부에서 벡터를 인쇄하면 모든 것이 작동합니다. 외부 (즉,이 함수가 호출되는 동일한 레벨에서) 일 때 모든 것이 작동합니다.

무엇이 잘못 되었나요?

void cut_and_uncut(long* input, int length, long** cut_part, 
    int* cut_length, long** uncut_part, int* uncut_length) 

.... 
// inside the function you now use `*cut_part` instead of `cut_part`, etc. 

if(input[i]==1){ 
     *cut_part[index_cut] = i; 
     index_cut++; 
} else { 
     *uncut_part[index_uncut] = i; 
     index_uncut++; 
} 

을하며이있는 (아직 할당되지 않은) 포인터하지만 주소가 아닌 통과 :

+0

"이 cut_and_uncut 함수 내부에서 벡터를 인쇄하면 모든 것이 작동합니다. 외부 (즉,이 함수가 호출되는 동일한 레벨에서) 작업을 수행하면 벡터가 작동하지 않습니다." 밖에서 무슨 heppens? – lulyon

+0

예를 들어 cut_vec [0]을 호출 할 때마다 분할 오류가 발생합니다. – Helios

답변

2

이 시도

long *cut_part; 
long *uncut_part; 

cut_and_uncut(... &cut_part, &uncut_part, ...) 

이 방법은, 수정 cut_and_uncut()의 복귀 후 유지됩니다.

+0

나는 당신이 말한대로 정확히했으나 여전히 효과가 없습니다. 실제로 함수 내에서 벡터를 채우기 전에 segfaults를한다 : 나는 * cut_part [index] = i뿐만 아니라 메모리 할당 ('* cut_part = vecallocl (...)')도 변경했다. 두 개의 if 문 안에 print 문을 추가하면 처음 7 개의 인덱스 (i = 0, ..., 7) 만 처리되고 segfaults가 cut_and_uncut 메서드 내부에 있음을 알 수 있습니다. – Helios

+0

다음과 같이 코드를 작성합니다. 이전에 쎄그멘테이션 오류가 발생 했었지만 약간의 수정 작업을 할 수있었습니다 : '* cut_part = vecallocl (n_cut); '을 사용하여 메모리를 할당 한 후,'long * cut = * cut_part' 그리고 나서 루프'cut [index_cut] = i;'안에서. 이러한 변경 사항을 적용하면 답변이 올바르게 작동합니다. – Helios