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

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

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

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

Q&A

4回答

1285閲覧

【C言語】double型をputcで送りたい。

ruru0505

総合スコア10

C

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

マイコン

マイクロコンピュータの略で、CPUにマイクロプロセッサを用いたコンピュータのこと。家電製品、電磁機器などの制御に用いられています。単体でコンピュータとしての機能を一通り備えています。 現代のパーソナルコンピュータに近く、同時期のメインフレームやミニコンピュータと比べ、小さいことが特徴です。

0グッド

1クリップ

投稿2019/06/30 06:27

double 型の値を小数点以下3桁まで残してputcでメインのマイコン送りたいです。
doubleを小分け?にして送るにはどうしたらいいですか?
送受信それぞれで分解、結合のプログラムを知りたいです。

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

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

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

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

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

guest

回答4

0

ファイルに出力/読込みで作ってみました。
こんな感じ? (細かなエラーチェック無し)

C

1void writeFile(FILE *fp, double a); 2double readFile(FILE *fp); 3 4 5int main() 6{ 7 double a = 23.1; 8 FILE *fp; 9 double ret; 10 11 fp = fopen("sample.bin", "wb+"); 12 13 writeFile(fp, a); 14 fseek(fp, 0, SEEK_SET); // 先頭に戻す 15 ret = readFile(fp); 16 17 printf("\n...==%f==\n", ret); 18 return 0; 19} 20 21 22void writeFile(FILE *fp, double a) 23{ 24 char buff[100]; 25 char *pBuff; 26 sprintf(buff, "%.3f", a); 27 28 pBuff = buff; 29 while (*pBuff != '\0') { 30 fputc(*pBuff, fp); 31 pBuff++; 32 } 33 fputc('\0', fp); 34 fflush(fp); 35} 36 37double readFile(FILE *fp) 38{ 39 char buff[100]; 40 char *pBuff = buff; 41 double ret = 0.0; 42 char c; 43 44 do { 45 c = fgetc(fp); 46 *pBuff = c; 47 pBuff++; 48 } while (c != '\0'); 49 return atof(buff); 50}

投稿2019/06/30 12:49

pepperleaf

総合スコア6383

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

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

0

そのputcが標準関数のputcの事なら、fprintfで出力しても同じです。
自分でputcを再定義しているということでしょうか?

また、
double型の値を、その値を表す10進数文字列表現に変換して送るということでいいんですよね?
double型の値を、バイナリ値のままで送ると言うことだと話が違ってきます。

投稿2019/06/30 09:35

otn

総合スコア84557

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

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

pepperleaf

2019/06/30 10:18

> 小数点以下3桁まで残してputcでメインのマイコン送りたい てことから、文字列にして送るのが、現実的って気がする。 バイナリのまま、送ってもよさそうですが、マイコンのエンディアンが違うとかの問題も。 ただ、ターミネータまで付けてあげないと、原因不明のバグなんてもありそうな予感。(または、最初に文字数)
guest

0

C

1#include <stdio.h> 2 3void put_double(FILE *fp, double x) 4{ 5 char buf[64]; 6 sprintf(buf, "%.3f", x); 7 for (int i = 0; buf[i]; i++) 8 putc(buf[i], fp); 9} 10 11double get_double(FILE *fp) 12{ 13 char buf[64]; 14 int n = 0, i; 15 for (i = 0; i < 63; i++) { 16 buf[i] = getc(fp); 17 if (buf[i] == '.') n = 1; 18 else if (n > 0 && ++n > 3) break; 19 } 20 buf[i] = '\0'; 21 double x; 22 sscanf(buf, "%lf", &x); 23 return x; 24} 25 26int main(void) 27{ 28 static char fname[] = "main.com"; 29 FILE *fp = fopen(fname, "w"); 30 if (!fp) return 1; 31 32 put_double(fp, 3.1415); 33 fclose(fp); 34 fp = fopen(fname, "r"); 35 if (!fp) return 2; 36 double x = get_double(fp); 37 fclose(fp); 38 printf("%f\n", x); 39} 40

投稿2019/06/30 06:58

kazuma-s

総合スコア8224

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

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

0

質問が日本語になっていないですが…

fprintf(fp, "%.3f", a);
fscanf(fp, "%.3lf", &a);

ではいけませんか?

…いけませんか。では…

出力:目的の変数が負の数であれば'-'をputcで出力し、絶対値をとる。その後、整数部分と小数部分に分離、整数部分については10で割り、余りに'0'を足してバッファに記入、これを整数部分が0になるまで繰り返し、バッファの後ろから前に向かってputcで出力する。その後、'.'を出力する。その後、小数部分を10倍し、整数部分と小数部分に分離し、整数部分に'0'を足してputcで出力する。これをあと2回行う。

入力:変数の初期値を0とし、EOFか'.'が出るまで変数を10倍してgetcで読み込んだ文字コードから'0'を減じて変数に足すという作業を繰り返す。EOFであればそこで終了する。'.'を読み飛ばした後は、次に読み込んだ数がEOFであればそこで終了する。それ以外の文字コードであれば'0'を減じて10で割り変数に加算する。次に読み込んだ数がEOFであればそこで終了する。それ以外の文字コードであれば'0'を減じて100で割り変数に加算する。次に読み込んだ数がEOFであればそこで終了する。それ以外の文字コードであれば'0'を減じて1000で割り変数に加算する。

投稿2019/06/30 06:55

編集2019/06/30 07:21
majiponi

総合スコア1720

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問