2013-02-18 3 views
-2

C 함수에 대해 약간의 문제가 있습니다.C - 포인터 및 함수를 사용하여 루프에 대한 세그먼트 오류가 발생했습니다.

int* CalcMeanPower(int Media[], int** MeanPowerArray, int righe, int colonne) 
{ 
    int i=0, k=0; 
    int ArrayPower[] = {0, 0, 0, 0}; 

    for (i=0; i<righe; i++) 
    { 
    for (k=0; k<colonne; k++) 
    { 
     ArrayPower[k] = ArrayPower[k] + MeanPowerArray[i][k] ; 
    } 
    } 

    for (k=0; k<colonne; k++) 
    { 
    Media[k] = (ArrayPower[k]/righe); 
    } 

    return Media; 
} 

이 I 주에서 함수 호출 방법이다 :

함수이다

VettoreMedia = CalcMeanPower (VettoreMedia, RefMeanPower, num_mean, N); 변수는 다음과 같이 정의된다

은 다음과 같습니다 : 내가하는 동안은 나에게 세그먼트 오류를 ​​반환하는 프로그램을 실행하려고하면

int* RefMeanPower[N]; 
int* VettoreMedia; 
int N=4, num_mean=5; 

:

for (k=0; k<colonne; k++) 
    { 
    Media[k] = (ArrayPower[k]/righe); 
    } 

당신이 설명해 주시겠습니까 내가 뭘 잘못하고있어? 나는 그물을 통해 검색했지만 대답을 찾을 수 없습니다. 이 함수는 C 프로그램의 작은 조각 일 뿐이므로이 사이클에서 잘못되었다고 확신합니다!

제발 도와주세요 ..

+1

을 할 수는'충분히 큰 ArrayPower'인가? '콜론 '의 가치는 무엇입니까? 대부분 배열의 끝을 지나칠 가능성이 높습니다. – cdarke

+0

너무 현지화로 마감되었습니다. – djechlin

+0

int * RefMeanPower [N]에 대해 저장소를 할당하는 방법을 표시하지 않습니다. int * VettoreMedia; – OldProgrammer

답변

1

유 함수에 전달 befor을 VetorreMedia를 초기화하지 않았습니다. 초기화되지 않았기 때문에 Media는 알 수없는 위치를 가리키고 있으므로 세그먼트 화 오류가 발생합니다. VetorreMedia에는 ​​기본값이 있어야합니다.

0

디버거에서 이것을 실행하면 segfault가 발생한 위치를 볼 수 있고 거기에서 문제를 해결할 수 있습니다.

Google gdb cheatsheet

+0

감사합니다! 이제 작동합니다! 이것은 내 프로그램에 관한 부분 일뿐입니다. RFID 로컬 리 제이션을위한 알고리즘을 수행하고 있으며 요즘에는 다른 질문을 게시 할 것입니다. 어떻게 이런 종류의 벡터 포인터를 초기화 할 수 있습니까? 'char ** RefIdTagArray; char ** IdXTagArray; ' @ x539 미리 감사드립니다. – user2084030

0

변수/배열을위한 메모리를 예약해야합니다.

RefMeanPower은 단순한 일반 초기화되지 않은 포인터의 배열입니다. 그리고 VettoreMedia은 단순한 초기화되지 않은 포인터입니다. 당신이 그렇게 창조에 ki 인덱스이나 Nnum_mean를 교환 RefMeanPower[N][num_mean]을 얻을

for(int i = 0; i < N; ++i) 
    RefMeanPower[i] = malloc(sizeof(int) * num_mean); 

// don't forget to free after usage 
for(int i = 0; i < N; ++i) 
    free(RefMeanPower[i]); 

.

VettoreMedia 당신이

VettoreMedia = malloc(sizeof(int) * N); 

// don't forget to free after usage 
free(VettoreMedia); 

또는

int VettoreMedia[N]; 
// frees automatically when leaving scope 
+0

x539 주셔서 감사합니다! 이제 작동합니다!이것은 내 프로그램에 관한 부분 일뿐입니다. RFID 로컬 리 제이션을위한 알고리즘을 수행하고 있으며 요즘에는 다른 질문을 게시 할 것입니다. 어떻게 이런 종류의 벡터 포인터를 초기화 할 수 있습니까? 'char ** RefIdTagArray; char ** IdXTagArray; ' @ x539 미리 감사드립니다. – user2084030

+0

인터넷 검색 결과 .. 감사합니다! – user2084030

관련 문제