char 배열에 있는 값을 float 형태로 집어 넣으려면 어떻게 하나요?

rider7979의 이미지

안녕하세요

예를 들어
char baTemp[4]= {1,2,3,4}라는 배열의 값을
float 변수에 1234라는 값으로 넣고자 할 경우
어떤 방법이 좋을까요?
비트연산으로
한바이트씩 밀어넣는 방법으로 아래와 같이 하면 가능할까요?

float Temp = (baTemp[0] << 24) & 0xff000000;
Temp |= (baTemp[1] << 16) & 0x00ff0000;
Temp |= (baTemp[2] << 8) & 0x0000ff00;
Temp |= (baTemp[3]) & 0x000000ff;

snowall의 이미지

그건 안좋은 방법인 것 같네요

http://forum.falinux.com/zbxe/?document_srl=408135

이런걸 쓰면 되겠지만, 위의 경우는 추가적으로 또 구현을 해줘야겠죠.

d=1.0
f=0.0
for(i=0;i++;i<ba.length){
 f+=d*atof(ba[i]);
 d*=10.0;
}

이런 식의 구현을 해야 할 것 같은데요

피할 수 있을때 즐겨라! http://melotopia.net/b

qiiiiiiiip의 이미지


사소한 딴지를 걸자면...

일단 int 영역에서 변환한 이후에
마지막에 floating 으로 casting해서 변환하는 것이
보다 정확하지 않을까요??

snowall의 이미지

double에서 float으로 다운캐스팅은 그냥 잘 되는거 아니었나요? 업캐스팅이었던가요. 크게 신경 안쓰고 살다보니...ㅎㅎ

아무튼 말씀하신게 맞습니다.

피할 수 있을때 즐겨라! http://melotopia.net/b

qiiiiiiiip의 이미지


원글의 1,2,3,4가 16진수라면,
말씀하신 방법과 비슷합니다만, | 연산대신 + 연산을 사용하셔야합니다.
float의 binary representation이 int의 그것과 다르기때문입니다.

그래도 snowall님의 방법을 쓰시는것이 보다 bug-free 할것같습니다.

또 baTemp가 -인 경우 문제 자체가 성립하지 않으므로,
아예 unsigned 로 선언하는 것이 안전하겠습니다.

rider7979의 이미지

답글 감사합니다...
그런데 atoi atof 같은 형변환 함수들을 사용할 수 없는 임베디드 환경이라
어려움이 있네요

snowall의 이미지

그럼... atof같은 함수를 구현하셔야겠죠.
atoi는 char를 int로 바꾸는 건데, 0~9까지만 사용한다면 단순히 덧셈뺄셈만으로 구현됩니다.

atof는 그보다는 조금 복잡해 보이지만, 역시 0~9까지만 사용한다면 덧셈, 곱셈, 비트연산만으로 구현할 수 있을 것 같네요.
http://blog.naver.com/PostView.nhn?blogId=blueslame&logNo=110006624513

피할 수 있을때 즐겨라! http://melotopia.net/b

qiiiiiiiip의 이미지


baTemp[] 에 '1','2','3','4' (문자) 가 들어있나요? 1,2,3,4 (숫자) 가 들어있나요?

저는 숫자가 들어있다고 이해했습니다만,

어떤 경우든 atof는 필요없는 상황으로 보이는데요? ( 물론 baTemp 에 0-9 digit만 들어있는 경우. )

문자가 들어있다면 baTemp[i]-'0' 으로 하면 되고,

숫자가 들어있다면 baTemp[i]를 그대로 쓰면되고..

제가 무언가를 놓치고 있는건가요???

snowall의 이미지

너무 오랜만에 C를 봐서 잊고 있었네요. atof 없이도 그냥 캐스팅만 해줘도 잘 되네요...;;

피할 수 있을때 즐겨라! http://melotopia.net/b

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.