Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用‘%f’和‘%f’的问题(Avr)

使用‘%f’和‘%f’的问题(Avr)
EN

Stack Overflow用户
提问于 2021-05-04 13:09:10
回答 1查看 323关注 0票数 0

(注:在这个问题的早期版本中,我假设我使用了错误的引用。这是一个不同的问题,我对标题/问题做了相应的修改。

我的代码打算用avr-gcc编译,并在ATmega168p微控制器上运行。

我在C中有以下函数,用于解析缓冲区(char数组)中的浮点值,并将其分配给相应的浮动变量:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
void read_float_from_buffer(float *var, char *buffer, uint8_t start, uint8_t end) {
    char val_buf[8];

    // transfer characters representing float to a temporary buffer
    uint8_t p=0;
    for (uint8_t i=start;i<=end && p<7;i++) {
        val_buf[p++]=buffer[i];
    }
    val_buf[p]='\0';

    // perform sscanf on this temporary buffer
    float buf=-1;
    if(sscanf(val_buf, "%.2f", &buf)==1) // this fails, sscanf returns 0
      *var=buf;
}

我有另一个函数find_float_in_buffer(),它在char缓冲区中搜索浮点值的开始和结束索引。函数read_float_from_buffer()在此函数中调用:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
float a_float_variable=0.;
void find_float_in_buffer(char *buffer) {
    uint8_t start,end=0;
    /*
    I do some magic here to find out where my float string starts and ends
    */
    read_buffer_float(&a_float_variable,buffer,start,end);
}

根据我的理解,这应该可以工作,但是由于某种原因,扫描val_buf临时缓冲区失败了(sscanf返回0)。

我的问题是:我将buffer的引用传递给find_float_in_buffer中的read_buffer_float的方式正确吗?我以为我终于理解了如何传递指向函数的指针或引用,但我不确定这是否是将一个函数中的指针传递给另一个函数的方式。

编辑:,我正在Atmel微控制器上运行这段代码,并使用avr-gcc进行编译。

编辑2: --我删除了我的整个固件,并得到了以下MWE:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define F_CPU 8000000UL

#include <stdlib.h>
#include <stdbool.h>
#include <stdio.h>
#include <util/delay.h>
#include "src/peripheral-core/uart.c"

int main() {
  _delay_ms(200);
  uart_init();
  uartWriteString("application started\n\r\0");

  char test[]="12.34\0";
  float testfloat=-1;
  sscanf(test, "%f", &testfloat);

  uartWriteString("teststring is:\t\0");
  uartWriteString(test);
  uartWriteString("\n\rscanned float is:\t\0");
  uartWriteFloat(testfloat);
  uartWriteString("\n\0");

  for (;;) {
    _delay_ms(1000);
  }
}

对我来说,这个指纹:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
application started

teststring is:  12.34

scanned float is:   -1.000

要构建.hex文件,我运行以下命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avr-gcc -std=gnu99 -c -Os -Wall -mmcu=atmega168p main.c -o main.o
avr-gcc -std=gnu99 -Wl,-u,vfprintf -lprintf_flt -lm -mmcu=atmega168p main.o -o main.elf
avr-objcopy -O ihex -j .data -j .text main.elf main.hex

AVR-GCC版本:

avr-gcc --version给出avr-gcc.exe (GCC) 10.1.0

当我在我的开发系统上运行下面的等价物时,它可以工作。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#include <stdio.h>

int main() {
  printf("application started\n\r\0");

  char test[]="12.34\0";
  float testfloat=-1;
  sscanf(test, "%f", &testfloat);

  printf("teststring is:\t\0");
  printf(test);
  printf("\n\rscanned float is:\t\0");
  printf("%.2f",testfloat);
  printf("\n\0");
}

但是:当我将"%.2f"作为格式说明符传递给sscanf() (正如注释中指出的那样无效)时,该版本在相同的行为下失败。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-05-04 22:58:19

由于您已经强制编译器使用printf和对float支持,所以您知道标准库的这个限制。

您也需要为scanf()这样做。请看文件。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
avr-gcc -std=gnu99 -Wl,-u,vfprintf -lprintf_flt -Wl,-u,vfscanf -lscanf_flt -lm -mmcu=atmega168p main.o -o main.elf
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/67392247

复制
相关文章
scanf函数与scanf_s函数
ANSI C中没有scanf_s(),只有scanf(),scanf()在读取时不检查边界,所以可能会造成内存泄露。所以vc++2005/2008中提供了scanf_s(),在最新的VS2013中也提供了scanf_s()。在调用时,必须提供一个数字以表明最多读取多少位字符。 目前最新的c11标准中已经将scanf_s函数“转正”了。 http://msdn.microsoft.com/zh-cn/library/w40768et%28VS.80%29.aspx 如果想继续使用scanf这个不安全的函数可以
landv
2018/05/24
1.1K0
scanf的使用,cin和scanf的区别
对于 printf 函数,相信大家并不陌生。之所以称它为格式化输出函数,关键就是该函数可以按用户指定的格式,把指定的数据显示到显示器屏幕上。该函数原型的一般格式如下: int printf(const char * format, … );
秋名山码神
2022/12/13
1.1K0
scanf的使用,cin和scanf的区别
使用scanf限定输入
❝有一个这样的需求就是使用scanf限定输入数字。我们该怎么解决呢? ❞ 答案是使用:%[],表示要读入一个字符集合。 小例子   只限定输入数字。 char string[100]; /* 这里只读取数字。*/ scanf("%[0-9]", string); printf("string = %s\n", string);   键盘输入: 12345abc   打印输出: string = 12345 一些常用限定符 数字集合   除了支持scanf,还支持sscanf和fscanf。
Qt君
2020/06/04
1.3K0
scanf与gets函数混用
2、scanf在gets前调用,这种情况就会出现问题,当输入完scanf中的变量时,运行到gets函数,则不让输入任何字符
idealclover
2018/10/31
1.4K0
C语言中的printf()与scanf()
相比于其它的编程语言,C语言的输入输出功能非常强大,可以按照各种要求进行输入输出。
越陌度阡
2021/10/22
1K0
【C++】scanf()和scanf_s()函数
scanf_s()函数是Microsoft公司VS开发工具提供的一个功能相同的安全标准输入函数,从vc++2005开始,VS系统提供了scanf_s()。在调用该函数时,必须提供一个数字以表明最多读取多少位字符。
用户7886150
2021/04/27
2.6K0
getchar()和scanf()混合使用的坑
最近在混合使用 getchar() 和 scanf() 的时候遇到一个坑,现在记录一下。
nnngu
2020/07/03
1.1K0
C语言中的 printf 与 scanf
相比于其它的编程语言,C语言的输入输出功能非常强大,可以按照各种要求进行输入输出。
越陌度阡
2022/11/27
8430
C语言中的 printf 与 scanf
MIPS架构深入理解2-MIPS架构体系
架构这个词,英文是architecture,牛津词典对其解释为the design and structure of a computer system。所以,这个词体现的是设计和结构,也就是说,是一个抽象机器或通用模型概念上的描述,而不是一个真实机器的实现。这就好比一辆手动挡车,无论是前轮驱动还是后轮驱动,它的油门总是在右,离合器在左。这里,油门和离合器的位置就相当于架构,前轮还是后轮驱动是具体实现。所以,相同的架构,实现未必相同。
Tupelo
2022/08/15
5.9K0
MIPS架构深入理解2-MIPS架构体系
关于scanf与cin哪个快的问题
一开始入c++的时候成天跑cin,cout 直到有一天用cin,cout超时 才知道scanf比cin快的多 但是后来又听说加了ios::sync_with_stdio(false);的cin跟飞一样
attack
2018/04/13
9610
关于scanf与cin哪个快的问题
C语言之不能在scanf中使用换行
#include<stdio.h> #include<iostream> int main() { char* str[10]; printf("请输入:\n"); scan
西西嘛呦
2020/08/26
2.5K0
C语言之不能在scanf中使用换行
C语言中scanf函数输入格式使用注意
int a.b; scanf("%d%d",&a,&b); 12 34中间加空格 ---- char a,b; scanf("%c%c",&a,&b); ab中间不能加空格 ---- char s1[10],s2[10]; scanf("%s%s",s1,s2); hello world中间加空格 ---- char s1[10]; scanf("%s",s1) 空格后的字符串无法接收。 ---- int a,b,c; scanf("%d,%d,%d",a,b,c) 因为%d,%d,%d”中间有,,所以输入
岳泽以
2022/10/26
1.2K0
c语言scanf函数用法详解_c语言输入scanf格式
本节介绍输入函数 scanf 的用法。scanf 和 printf 一样,非常重要,而且用得非常多,所以一定要掌握。
全栈程序员站长
2022/11/18
4.5K0
【译】与Adapter一起使用(ListView, GridView, ...)
首先,我们需要为测试提供一些图像。我们从eatfoody.com截取了部分美味的食谱图,上传至imgur。
小鄧子
2018/08/20
1.2K0
scanf函数的实战应用: 实例演示scanf函数在实际应用中的使用方法
在C语言中,scanf函数是一种常用的读取数据的方式,它可以按照我们预期的格式读取数据。为了让scanf函数更高效地工作,我们可以使用格式化字符串来限制输入的数据类型和长度。
曈曈too
2023/02/27
2K0
从一道mips题目学习搭建mips环境及ROP
本文以一道简单的mips pwn题,讲解mips环境搭建及mips ROP的构造。这道题目是安洵杯的一道pwn题,题目链接https://github.com/Q1IQ/ctf/blob/master/mips/pwn2
黑伞安全
2020/11/09
3.1K0
从一道mips题目学习搭建mips环境及ROP
C语言 | scanf函数
“要成为绝世高手,并非一朝一夕,除非是天生武学奇才,但是这种人…万中无一” ——包租婆
小林C语言
2021/03/23
3.7K0
C语言 | scanf函数
在C语言中,输入是以计算机主机为主体而言的,从输入设备向计算机输入数据称为输入,C语言本身不包含输入语句。
小林C语言
2021/03/23
5.5K0
C语言 | scanf函数
MIPS指令集实验
编写一个简单的终端输出“Hello World!!”的小程序,首先写好一些数据包括CONTROL和DATA的地址以及字符串Hello World,然后将CONTROL和DATA的地址存储在寄存器中以之作为基址,将字符串首地址写入DATA,将4写入CONTROL
叶茂林
2023/10/09
2550
MIPS指令集实验
点击加载更多

相似问题

JAVA -如何从FOR循环外部访问for循环内的变量

50

Python从外部动态更改循环内的变量

11

循环内条件影响循环变量增量

17

Python -变量如何影响循环

10

Java环境下从内循环访问外部循环变量

22
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文