2017-10-06 6 views
0

이 프로그램을 실행할 때 세그먼트 오류가 계속 발생합니다. 나는 (명령 줄에 삽입 된) 파일을 읽고 각 파일의 x 및 y 좌표를 POINTS (readPoints라는 함수를 사용하는)라고하는 동적으로 할당 된 메모리 구조체에 할당하려고합니다. 이 구조체에 저장된 후에는 함수 호출에 전달하여 x 및 y 값을 곱한 다음 x 및 y 곱하기에 추가합니다. 누군가 내가 잘못 갔다는 것을 나에게 설명해 주시겠습니까! 나는 포인터에서 위대하지 않다. 미리 감사드립니다.분할 오류 11, 포인터를 사용하여 문제를 해결하고

#include <stdio.h> 
#include <stdlib.h> 

typedef struct 
{ 
    float xcord; 
    float ycord; 
}POINTS; 

int readPoints(char* file, int numofpoints); 
int calc(POINTS* points, int numofpoints); 

int main(int argc, char* argv[]) 
{ 

int numoffiles; 
FILE* file; 
int result, i; 
numoffiles = argc; 

POINTS* pointer; 
int numofpoints; 

if(numoffiles == 1) 
{ 
    printf("Please enter a file\n"); 
} 

for(i=1; i<numoffiles; i++) 
{ 
    file = fopen(argv[i], "r"); 
    fscanf(file, "%d", &numofpoints); 
    pointer = readPoints(file, numofpoints); 

    if(pointer == NULL) 
    { 
     printf("Error return from readPoints function"); 
    } 


    result = calc(&pointer[i], numoffiles); 


    printf("%12f", result); 
    free(pointer); 
} 
} 

int readPoints(char* file,int numofpoints) 
{ 
    int i, j; 

    POINTS* Pointstructs; 
    Pointstructs = (POINTS*)malloc((numofpoints)*sizeof(POINTS)); 

    if(file == NULL) 
    { 
     printf("Error transferring file into readPoints\n"); 
    } 

    for(i=0; i<numofpoints; i++) 
    { 
     fscanf(*file, "%f, %f", &Pointstructs[i].xcord, &Pointstructs[i].ycord); 
     printf("%f, %f", Pointstructs[i].xcord, Pointstructs[i].ycord); 
    } 

    return Pointstructs; 
} 

int calc(POINTS* points, int numofpoints) 
{ 
    int i=0, j=0; 
    int answer; 

    while(i<numofpoints && j<numofpoints) 
    { 
     answer += points[i].xcord * points[j].ycord; 
     i++; 
     j++; 
    }  
return answer; 
} 
+0

'exit'를 호출하고 프로그램 실행을 중단해야하는 곳이 여러 곳 있습니다. – babon

+3

저는 항상 [Valgrind] (https://www.valgrind.org)를 사용하여 segfaults를 얻는 이유를 찾습니다. '-g'로 컴파일하고'valgrind '로 실행하십시오. 행운을 빕니다! –

+3

64 비트 시스템에서이 작업을 수행하고 있습니까? 'int'는 보통 32 비트이지만 포인터는 64 비트입니다. 이제 포인터의 상위 32 비트를 잘라서 함수에서 그 값을 반환하면 어떻게되는지 다시 생각해보십시오. 경고를 켜십시오 (컴파일러가 경고를 외치는 경우). –

답변

0

readpoints 함수는 첫 번째 인수를 파일 포인터로 사용해야합니다. BCS fopen은 FILE 포인터를 반환하지만 u는 char 포인터를 사용합니다. fscanf 첫 번째 인수는 파일 포인터 여야합니다. Pls correct