2012-10-12 9 views
1

오늘 저는 ARM 툴체인 EABI (크로스 컴파일러)에서 이상한 문제에 직면했습니다.ARM EABI toolchain

Ths 문제는 내가 부동 소수점 값을 문자열로 변환하기 위해 snwprintf()를 사용하려고 할 때, 나는 통과 한 실제 부동 소수점 값이없는 일부 정크 문자열을 얻고있었습니다. 이 같은

smaple 코드 looke는 :

float floatValue = 1.0; 
snwprintf (buffer, bufferSize, _T("%g"), floatValue); 

그때 snwprintf을 디버깅하고 난 변수 인수 목록 (va_arg를)은 정확한 데이터 값을 가리키는되지 않는다는 것을 알게되었습니다. 그리고 메모리를 덤프함으로써 우리는 가변 인수 목록에있는 정확한 데이터를 찾을 수있었습니다. va_arg가 가리켜 야하는 데이터는 다릅니다.

integre 값이 정상적으로 작동하므로 이것이 endianess 문제라고 생각하지 않습니다. 문제는 이중 값에만 있습니다.

누구든지이 호에서 저를 도울 수 있습니까?

+1

2 배로 % lg 하시겠습니까? 그렇지 않으면 스택이나 전달 된 매개 변수에 두 배나 많은 양을 넣을 수 있으며 printf는 해당 매개 변수의 절반 만 사용합니다. GCC 명령 줄에 놓아 두었습니까? –

답변

1

가변 인자 기능을 위해 부동 소수점이 두 배로 넓어 지므로이 값을 이중으로 포맷/인쇄해야합니다.
가변 인자 기능을 전달

5.5 매개 변수 다음과 같은 ARM 아키텍처 상태에 대한

프로 시저 호출 표준은 항상 기본 표준으로 마샬링됩니다.

7.2 인수 전달 규칙
가변 인수 함수의 경우 줄임표 (...)와 일치하는 float 인수는 double 유형으로 변환됩니다.

일반적으로 Afaik 7.2가 보유하고 있습니다.

+0

@dwelch가 나보다 빠르지 만 여러 ARM 문서에 대한 연구를 낭비하고 싶지 않았습니다. – auselen

+0

이것이 형식과 변수 유형이 맞지 않다면 의심의 여지가 있습니다. ARM과 아무 관련이 없습니다. 일반적인 C 문제입니다. 대부분의 또는 모든 플랫폼에서 볼 수 있습니다 (예를 들어 32 비트 레지스터 또는 64 비트 항목을 포함하는 스택 위치와 같은 단일 매개 변수 항목 크기에서 경계를 넘으면 printf는 단일 32 비트 항목이 있다고 생각하고 컴파일러는 32 비트를 소비합니다 변수 유형 때문에 항목). –

+0

dwelch - 몇 가지 해결책을 제안 해 주시겠습니까? – Santhosh