質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Q&A

解決済

3回答

2225閲覧

数値を文字列に変換する方法

Merrifield

総合スコア31

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

0グッド

0クリップ

投稿2020/05/26 23:57

編集2020/05/27 01:31

C言語において、snprintf、sprintf_s、sprintfを使わずに、double型の小数点を含む数値を文字列に変換する方法はあるのでしょうか?snprintf、sprintf_s、sprintfなどの関数がstdio.hをインクルードしているにも関わらず、エラー(Undefined symbol '_snprintf' in file 'DefaultBuild)が出て使えなかったため、質問させていただきました。snprintfなどが使えない理由についても何か分かることがありましたら教えてください。

開発環境はCube Suite+、ターゲットボードはQB-7KOR/KG3を使用しています。OSはWindows7です。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ttyp03

2020/05/27 00:33 編集

> <stdio.h>をインクルードしているのに、使用できなかった 質問の方向性が間違っています。 使えるはずの環境で使えない、なぜ?という根本原因を質問すべきかと。 この考えがないと今後使えない現象に出会うたびに自作していくことになりますが。
Merrifield

2020/05/27 00:44

おっしゃる通りだと思いますが、一つの方法にこだわる必要もないので、snprintfなどを使わずできる方法があればそちらでも構わないので、こういった質問にしました。
退会済みユーザー

退会済みユーザー

2020/05/27 00:59 編集

普通は標準の方法があればそれを使います。なぜなら、自作したものや出所が不明なものより十分にテストされているからです。また、ハードウェアでサポートされていない機能を無理やりライブラリ側で実現していたりするケースもあります。特に、CやC++はコンパイラに応じてintの型が変わったりプラットフォーム依存な事が大きかったりするので、質問文を修正して、コンパイラと動作環境をきちんと明示してください。
ttyp03

2020/05/27 01:09

コンパイルエラーと書いてますが、正しいですか?リンクエラーではなく? そうするとstdio.h自体読み込めてなさそうですが。
Merrifield

2020/05/27 01:17

リンクエラーの意味が分かっていないのですが、調べてみたかんじではリンクエラーかもしれないです。
ttyp03

2020/05/27 01:35

おそらくradianさんの回答で解決するのではないかと思います。
Merrifield

2020/05/27 01:51

プロパティの部分の設定を変えても上手くいきませんでした。
guest

回答3

0

ベストアンサー

関係あるかはわかりませんが、こんなのが出てきました。
FAQ 1010334:標準入出力関数(sprintf,sscanf,printf,vprintf,vsprintf)を使用して浮動小数点を文字列に変換したいのですが、正常に変換されません。

A: 回答

浮動小数点対応の標準入出力関数を使用するには、次の設定が必要です。
ビルド・ツールのプロパティ パネルの[コンパイル・オプション]タブの[ライブラリ]カテゴリから
[標準ライブラリを使用する]プロパティ -> [はい]
[float対応標準入出力ライブラリを使用する]プロパティ -> [はい]

VC++やgccのメジャーどころのコンパイラなら有識者が多いですが、マイナーなコンパイラを使用しているなら、まず先に公式のドキュメントやFAQを漁った方が良いかと思われます。

投稿2020/05/27 01:03

編集2020/05/27 01:06
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/05/27 01:50

FAQに書いてある設定を変えてみたのですが、上手くいきませんでした。 公式のドキュメントなどを見てみます。
guest

0

方法はあるのでしょうか?

単純に回答すれば「ある」です。まぁ、それが知りたいわけではないでしょうね。

ルネサスのCコンパイラの話ですか?
C言語、というだけではdoubleの内部形式は規定されません。
コンパイラの仕様を調べて、doubleの内部形式に沿って変換ルーチンを作成して下さい。

投稿2020/05/27 00:06

thkana

総合スコア7703

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/05/27 00:21

正直、内部形式と言われてもよくわからないですが、自分でいろいろ調べてみます。
thkana

2020/05/27 00:38

ルネサスの78Kのドキュメント検索ページ https://www.renesas.com/jp/ja/products/microcontrollers-microprocessors/78k/78k0rkx/78k0rkx3.html#documents から CubeSuite+ V2.01.00 統合開発環境 ユーザーズマニュアル RL78, 78K0R コーディング編 https://www.renesas.com/jp/ja/doc/products/tool/doc/003/r20ut2774jj0100_qscd78.pdf 3.1.2 データの内部表現と領域 「RL78,78K0R C コンパイラでは,double,long double型は,floatと同様にANSI/IEEE754-1985 で規定されている,単精度正規化数に対する浮動小数点表現としてサポートします。」 とのことで内部形式IEEE754だということがわかります。 'IEEE754'でググれば...例えばWikipediaの解説 https://ja.wikipedia.org/wiki/IEEE_754 を読んで、理解して下さい。 #出来合いの変換ルーチンはちょっと見つかりませんでした。
thkana

2020/05/27 00:40

(フォーマット説明はドキュメントを読み進めれば書いてあった...)
Merrifield

2020/05/27 00:47

ご丁寧にありがとうございました。こういったまだ全然理解していないのですが、挙げていただいたページをよく読んで勉強します。
guest

0

Windows環境であれば、Windows APIの一部としてwsprintf関数がありますので、それを呼ぶのが手っ取り早いです。

Linuxでは廃止予定ですがgcvtという関数を使えます。


という回答もありえますが、課題としては「使わない関数の抜け道を探す」ものなのでしょうか、それとも「同じアルゴリズムを手で書く」ことを狙っているものなのでしょうか。

投稿2020/05/27 00:07

maisumakun

総合スコア146018

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Merrifield

2020/05/27 00:20

単純に数値を文字列に変換するということを実現したいのですが、質問文で挙げた関数が<stdio.h>をインクルードしているのに、使用できなかったので(Undefined symbolのエラー)、なにか別の方法がないのか知りたいのです。そちらの原因も今探しています。 ちなみに、教えていただいたwsprintfも使用できないです。
maisumakun

2020/05/27 00:23

環境は何でしょうか?
退会済みユーザー

退会済みユーザー

2020/05/27 00:24

普通はインクルードしたら使えますけど、どのコンパイラと処理系をお使いでしょうか? 環境を詳しく書いてみてください。
maisumakun

2020/05/27 00:25

(質問の感じから、てっきり「縛りのかかった課題を解いている」ものと考えていました、失礼いたしました)
Merrifield

2020/05/27 00:31

開発環境は、Cube Suite+で、使用いているOSはWindows7の64ビットです。
maisumakun

2020/05/27 00:33

書いたコードを実際に動かしたいチップは何でしょうか?
Merrifield

2020/05/27 00:41

チップという言葉がなにを指しているのか正直よくわからないですが、78K0R/KG3というターゲットボードを使用していて、78K0R/KG3(μPD78F1166GF)が搭載されています。
thkana

2020/05/27 01:03

質問の際に、エラーメッセージは*一切*省略しない習慣を付けたほうがいいと思います。回答者は重要かもしれない情報が*わざわざ*隠されてしまってイライラ、質問者は解決が得られにくくなる、で誰にも得はないです。 使用しない下位のバイト入出力関数とかをリンクしない設定になっているんじゃないかと想像します。 まともに対応するなら、私の回答の返信の「ユーザーズマニュアル RL78, 78K0R コーディング編」第7章を真面目に読むことになりそうです。 ただし、printfやscanfによる入出力を使用しない(sprintfだけ欲しい)ということであれば、そのエラーになる関数について中身空の(必要なら固定値を返す)ダミー関数を作ってやれば意外と動くんじゃないかという予想もあります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問