手写printf

前景知识:

头文件 #include<stdarg.h>,用于实现可变参数函数的功能。

va_list,用来获取不确定个数的参数,va_list ap,定义参数列表

va_start,获取可变参数列表中第一个参数的地址

va_start(ap,v),ap是类型为va_list的指针,v是可变参数最左边的参数

va_arg,获取可变参数的当前参数,描述当前类型获取对应的参数 va_arg(ap,t),t为类型

例如:const char* s = va_arg(ap,const char*);

va_end,清空va_list可变参数列表 va_end(ap)

简单使用一下函数:

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
int myprintf(const char* fmt, ...)
{
    va_list ap;//定义参数列表
    va_start(ap, fmt);//获取可变参数列表中第一个参数的地址

    const char* s = va_arg(ap, const char*);
    int d = va_arg(ap, int);//获取可变参数当前的参数 描述当前类型获取对应的参数
    //va_arg(ap,t) t为类型

    printf("first:%s\n", s);
    printf("second:%d\n", d);

    va_end(ap);//清空可变参数列表
    return 1;
}
int main()
{
    myprintf("hello %s %d", "abc", 18);
}

最终版:支持%d、%s、%x打印,尚不完善。

#define _CRT_SECURE_NO_WARNINGS
#include<stdio.h>
#include<stdlib.h>
#include<stdarg.h>
int myprintf(const char* fmt, ...)
{
	const char* s = "";
	int d;
	char buf[100];

	va_list ap;//定义参数列表
	va_start(ap, fmt);//获取可变参数列表中第一个参数的地址

	while (*fmt)
	{
		//判断%
		if (*fmt != '%')
		{
			putchar(*fmt++);
			continue;
		}
		//是% 看下一位是s d...
		switch (*++fmt)
		{
		case's':
			s = va_arg(ap, const char*);
			for (; *s != '\0'; ++s)
			{
				putchar(*s);
			}
			break;
		case'd':
			d = va_arg(ap, int);
			_itoa(d, buf, 10);//int转为十进制字符串存在于buf中
			for (s = buf; *s != '\0'; ++s)
			{
				putchar(*s);
			}
			break;
		case'x':
			d = va_arg(ap, int);
			_itoa(d, buf, 16);//int转为十进制字符串存在于buf中
			for (s = buf; *s != '\0'; ++s)
			{
				putchar(*s);
			}
			break;
		default:
			putchar(*(fmt-1));
			putchar(*fmt);
			break;
		}
		fmt++;
	}

	va_end(ap);//清空可变参数列表
	return 1;
}
int main()
{
	myprintf("hello %s %d 0x%x %%\n", "abc", 18,0x100);
	myprintf("%s %d 0x%x %%\n", "abc", 18, 0x100);
	myprintf("%s\n","good");
}

### OpenART Mini 手写数字识别 #### 软硬件环境概述 OpenART 是恩智浦推出的 MCU 机器学习教育套件,其中 OpenART Mini 提供了一个轻量级平台用于嵌入式人工智能开发。该平台支持基于 i.MX RT 系列微控制器的机器学习应用,例如图像分类、手写字符识别等[^1]。 对于手写数字识别功能,通常会涉及以下几个方面: - **数据集准备**:MNIST 数据集是一个常用的手写数字训练和测试集合,包含大量标注好的手写数字图片。 - **模型训练**:通过 TensorFlow Lite 或其他框架,在 PC 上完成神经网络模型的设计与训练。 - **模型转换**:将训练后的浮点数模型量化为整数量化模型,并将其部署到目标设备上运行。 - **推理实现**:利用 OpenMV 的图像采集能力以及 NXP EdgeFast 工具链优化后的 TFLite Micro 推理引擎来执行预测操作。 #### 示例代码展示 以下是针对 i.MX RT 平台的一个简化版手写数字识别流程示例: ```c #include "fsl_debug_console.h" #include "tensorflow/lite/micro/all_ops_resolver.h" // 加载已训练并量化的 tflite 模型文件至全局变量中... const unsigned char g_tflite_model[] = { ... }; void app_main(void){ // 初始化TFlite解释器实例及相关资源配置过程省略... TfLiteTensor* input_tensor = interpreter.input(0); while (true) { /* 假设此处有函数可以从摄像头获取灰度图 */ uint8_t image_data[IMAGE_SIZE]; capture_image(image_data); memcpy(input_tensor->data.int8, image_data, IMAGE_SIZE); if(interpreter.Invoke() == kTfLiteOk){ TfLiteTensor* output_tensor = interpreter.output(0); int max_index= find_max(output_tensor->data.int8,DIGITS_COUNT); PRINTF("Predicted Digit:%d\n",max_index ); } vTaskDelay(pdMS_TO_TICKS(DELAY_MS)); } } ``` 上述代码片段展示了如何设置输入张量并将捕获的数据传递给它;调用 `Invoke()` 方法启动计算;最后读取输出张量找到最大概率对应的类别标签作为最终结果输出。 #### 注意事项 由于实际应用场景可能更加复杂,因此还需要考虑诸如预处理阶段中的降噪滤波、尺寸调整等问题。另外值得注意的是,尽管这里只讨论了静态链接方式加载模型的方法,但在某些情况下动态加载外部存储介质上的模型也可能成为必要选项之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值