2016-07-03 4 views
0

C 문자열 (char *)에서 숫자 (즉, 부동 소수점 등)를 구문 분석하려고 할 때마다 세그먼트 오류가 발생하고 매우 일관성이 있습니다. 실제 코드에 Qt 세그먼트 화 오류 코드

:

//aLocation is a C++ object with two variables double Latitude & double Longitude. 
char** tokens; //Gets used in a string split function. 
char* pEnd; 
aLocation.setLatitude(strtod(tokens[0],&pEnd)); //tokens[0] = "26.379165" 
aLocation.setLongitude(strtod(tokens[1],&pEnd)); //tokens[1] = "-80.101639" 

I 대체 기능 및 데이터 유형 (즉 atoi 함수,으로 atof, strtol 함수, strtof, & strtol 함수)를 시도하는 것이 언급되어야한다.

문자열 분할 기능을 검사했으며 예상대로 작동합니다. "qDebug ("위치 : % s, % s ", 토큰 [0], 토큰 1);"를 사용하여 토큰 값을 잘 인쇄 할 수 있습니다. 두 strtod() 함수는 seg fault (함께 또는 따로)를 호출합니다. 내 응용 프로그램에서 위의 두 줄의 코드를 제거하면 seq 오류가 전혀 발생하지 않습니다.


실행 환경은 Buildroot와 이전 Linux 커널 (3.4.39)을 사용하여 만든 사용자 지정 Linux 이미지입니다. 이 응용 프로그램은 Qt 4.8.4 SDK를 사용하여 C++로 작성되었습니다. 응용 프로그램을 실행중인 장치는 USB를 통해 몇 가지 사용자 지정 IC가 추가 된 alix3d 마더 보드입니다. 나는 또한 ld-uClibc.so.0 라이브러리를 사용하고있다.

Location.h :

#ifndef LOCATION_H 
#define LOCATION_H 

class Location 
{ 
public: 
    explicit Location(); 
    void setLatitude(double aLat); 
    double getLatitude(); 
    void setLongitude(double aLong); 
    double getLongitude(); 


private: 
    double latitude; 
    double longitude; 

}; 

#endif // LOCATION_H 

Location.cpp :

#include "location.h" 

Location::Location() 
{ 
} 

void Location::setLatitude(double aLat){latitude=aLat;} 

double Location::getLatitude(){return latitude;} 

void Location::setLongitude(double aLong){longitude = aLong;} 

double Location::getLongitude(){return longitude;} 

UPDATE

Case 1: this->aLocation.setLatitude(1); ------> works (No additional code above or below) 

Case 2:double aLat = (double)strtod(tokens[0], &pEnd); ---> works (No additional code below this) 

Case 3: Below Code Seg faults 
double aLat = (double)strtod(tokens[0], &pEnd); 
this->rsuLocation.setLatitude(aLat); 
+2

[최소, 완전하며 검증 가능한 예] (http://stackoverflow.com/help/mcve)를 만들어 보여주십시오. 그 작은 (그리고 불완전한) 코드로는 실제로 아무 말도 할 수 없습니다. 예를 들어,'strtod' 호출을 개별적으로 수행하고 작동한다면, 에러는 그 호출이 아니라 다른 곳에서 발생한다는 것을 알 수 있습니다. 그렇게하면 MCVE 생성을위한 문제 코드를 좁힐 수 있습니다. 그리고 디버거에서 충돌 시도 위치를 찾아 내기 위해 노력했습니다. –

+0

주요한 용의자는 "문자열 분할 기능"입니다. – molbdnilo

+0

문자열 분할 기능은 매력처럼 작동합니다. 나는 그것을 얼마 동안 사용 해왔다. 또한 인쇄물을 출력하여 출력 결과를 검증했습니다. 위의 추가 정보를 추가했습니다. – user2884335

답변

0

나는 매우 NOO했다 bish 이동 및 부모 개체에 대한 생성자를 호출하는 것을 잊었습니다.

또한 include 문 (#include)을 QtCore 라이브러리 디렉토리 (예 : #include)로 변경했습니다.