double 型の値を小数点以下3桁まで残してputcでメインのマイコン送りたいです。
doubleを小分け?にして送るにはどうしたらいいですか?
送受信それぞれで分解、結合のプログラムを知りたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア6383
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
そのputc
が標準関数のputc
の事なら、fprintf
で出力しても同じです。
自分でputc
を再定義しているということでしょうか?
また、
double型の値を、その値を表す10進数文字列表現に変換して送るということでいいんですよね?
double型の値を、バイナリ値のままで送ると言うことだと話が違ってきます。
投稿2019/06/30 09:35
総合スコア84557
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/06/30 10:18
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
総合スコア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総合スコア1720
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。