블로그 이미지
smstock

카테고리

분류 전체보기 (54)
취미 (8)
공부 (32)
낙서장 (12)
Total
Today
Yesterday

달력

« » 2024.5
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31

공지사항

태그목록

최근에 올라온 글

외부 라이브러리 같은 것을 가져다 쓸때 빌드 오류 나는 경우가 있다.

 

아래와 같은 오류가 나오는데

 

Severity Code Description Project File Line Suppression State Error C4668 '_WIN32_WINNT_WIN10_RS2' is not defined as a preprocessor macro, replacing with '0' for '#if/#elif"

 

프로젝트의 Build.cs 에 아래 코드를 추가하면 해결 된다.

 

bEnableUndefinedIdentifierWarnings = false;

 

Posted by smstock
, |

프로그램을 실행하다 보면 해당 에러가 나오는 경우가 존재한다.

 

window에서는 32bit, 64bit 문제 없이 잘 돌아가는게 arm processer에서만 죽는 현상이다.

 

해당 문제는 64bit로 빌드하면 멀쩡하게 돌아가던게 32bit로 빌드한걸 실행했을 때만 문제가 발생한다.

 

에러난 곳을 살펴보면 struct 안에 존재하는 변수의 레퍼런스에 접근할 때 죽는 것을 확인할 수 있다.

 

일반적으로 struct를 사용할 때 pragma pack을 활용을 많이 한다. 해당 기능의 활용이 문제를 야기하는 것 같다.

 

예를 들어 아래와 같은 상황을 보면

 

#pragma pack(push, 1)

struct STemp

{

int8 a;

int16 b;

int32 c;

};

#pragma pack(pop)

 

static void get_value( int16 *p_value)

{

char str[] = "9999.999";

*p_value = atoi( str); // <-- 에러가 발생하는 위치

}

 

static void get_value( int32 *p_value)

{

char str[] = "9999.999";

*p_value = atoi( str); // <-- 에러가 발생하는 위치

}

 

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

{

STemp sData;

get_value( &sData.b); // <--- 정상 실행

return 0;

}

 

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

{

STemp sData;

get_value( &sData.b);

get_value( &sData.c); // <--- error

return 0;

}

 

위와 같은 결과가 나오는데 아래처럼 직접 값을 입력하면 크래시는 안난다;;

*p_value = 99.99;

 

결론

- 해당 오류 발생하면 pragma pack 사용하지말고 패킷을 serialize해서 전송하는 방식으로 수정하자

 

참고

https://decdream.tistory.com/491

 

signal 7 (SIGBUS), code 1 (BUS_ADRALN), fault addr

참고 URL : http://stackoverflow.com/questions/3246441/what-does-bus-adraln-invalid-address-alignment-error-means http://www.badayak.com/3302 일반적으로 point 변수에 잘못된 값이 들어가 있을 경우는 nu..

decdream.tistory.com

https://badayak.com/3302

 

Bus error? 버스 에러? 뭐지?

프로그램을 실행해 보니 전혀 본 적이 없는 에러가 출력되네요. Bus error? 프로그램 코드를 보면 전혀 문제가 없는데, 실행만 하면 Bus error가 발생합니다. 재미있는 것을 I386 컴퓨터에서는 발생하지 않는데, A..

badayak.com

 

Posted by smstock
, |

64비트에 대한 ANSI 표준은 살펴보면 long long형으로 정의되어 있다

 

64비트 UNIX 운영체제의 경우에만 long형이 64비트로 정의되어 있다

 

유닉스/리눅스 시스템에서 사용하는 gcc 컴파일러들은 거의 모두 long long형을 지원한다

 

int64_t 모든 플랫폼을 지원하기 위해서는 아래와 같이 타입 정의를 하여 사용한다

 

윈도우의 경우

#ifdef WIN32

typedef __int64 int64_t;

#else 

typedef long long int64_t; // 또는 Unix의 헤더파일들 include 

#endif

 

 

참조

http://egloos.zum.com/aslike/v/2718804

https://codeday.me/ko/qa/20190310/36478.html

 

 

Posted by smstock
, |

최근에 달린 댓글

최근에 받은 트랙백

글 보관함