BSP Day32

本文介绍C语言中用于调试的预定义宏,如__FILE__和__LINE__的使用方法,并通过示例展示了如何利用这些宏进行调试,同时提供了文件操作的基本应用。

C语言中的__LINE__ 及__FILE__ 等预定义跟踪调试用法

1. C语言预定义跟踪调试宏介绍

C语言头文件 #include<stdio.h> 中定义了__FILE__、LINE、FUNCTION、__DATE__等跟踪调试宏定义,方便调试编译使用。
预定义宏的名称由两个下划线字符 " _ " 开头和结尾,这些预定义宏不能被取消定义(#undef)或由编程人员重新定义。
如果编译器不是标准的,则可能仅支持几个宏或根本不支持,编译程序也许还提供其它预定义的宏名。

 

#include <stdio.h>
// 打印文件所在的绝对位置
void Find_file() {
	printf("This project is in \"%s\" \n\n", __FILE__);
}
// 打印出程序所在行数
void Print_line() {
	printf("This print is  on line %d\n\n", __LINE__);
}
// 打印出函数运行错误及位置
void test(int num) {
	if (num < 0) {
		printf("The [ %s() ] input is less than 0 on line %d.\n\n", __FUNCTION__, __LINE__);
	}
	else if (num == 0) {
		printf("The [ %s() ] input is 0 on line %d.\n\n", __func__, __LINE__);
	}
	else {
		printf("The [ %s() ] input is valid\n\n", __FUNCTION__);
	}
}

int main()
{
	printf("Programer run start from [%s] on line %d .\n\n", __FUNCTION__, __LINE__);
	Find_file();
	Print_line();
	test( -10 );
	test( 0 );
	test( 1 );
	return 0;
}

 运行结果如下:

还可以把它打印到文件中去 

 

#include<stdio.h>
int add(int a,int b)
{
	return a+b;	
}
int sub(int a,int b)
{
	return a-b;
}
int mul(int a,int b)
{
	return a*b;
}
int del(int a,int b)
{
	return a/b;
}
int main()
{
	FILE *fp = fopen("./1.log","w+");
	if(fp == NULL)
	{
		perror("fopen");
	}
	int a = 10,b = 20;
	int ret = add(a,b);
	fprintf(fp,"%d   %d\n",__LINE__,ret);//行数 
	int ret1 = sub(a,b);
	fprintf(fp,"%s   %d\n",__FILE__,ret1);//文件路径 
	int ret2 = mul(a,b);
	fprintf(fp,"%s   %d\n",__DATE__,ret2);//创建文件日期(月,日,年) 
	int ret3 = del(a,b);
	fprintf(fp,"%s   %d\n",__TIME__,ret3);//创建文件的时间 
	return 0;
}

文件的一些练习

1.实现文件的简单加密和解密

#include <stdio.h>
#include <string.h>
void encode(char *name, char *newName, int code);
void decode(char *name, char *newName, int code);
int main()
{
    encode("main.c", "encode.c", 666);
    decode("encode.c", "decode.c", 666);
    return 0;
}
/**
 * @brief encode 加密文件
 * @param name 需要加密的文件名称
 * @param newName 加密之后的文件名称
 * @param code 秘钥
 */
void encode(char *name, char *newName, int code){
    FILE *fw = fopen(newName, "w+");
    FILE *fr = fopen(name, "r+");
    char ch = EOF;
    while((ch = fgetc(fr)) && (!feof(fr))){
        fputc(ch ^ code, fw);
    }
    fclose(fw);
    fclose(fr);
}
/**
 * @brief encode 解密文件
 * @param name 需要解密的文件名称
 * @param newName 解密之后的文件名称
 * @param code 秘钥
 */
void decode(char *name, char *newName, int code){
    FILE *fw = fopen(newName, "w+");
    FILE *fr = fopen(name, "r+");
    char ch = EOF;
    while((ch = fgetc(fr)) && (!feof(fr))){
        fputc(ch ^ code, fw);
    }
    fclose(fw);
    fclose(fr);
}

2.俩种方法通过文件操作读取图片然后把图片写到另一个文件中

#include<stdio.h>

int main()
{
	FILE *fp = fopen("./1.jpg","rb");
	if(fp == NULL)
	{
		perror("fopen");
	}
	FILE *fq = fopen("./2.jpg","wb");
	if(fq == NULL)
	{
		perror("fopen");
	}
	char str[1000];
	char ch;
	rewind(fp);
	while(1)
	{
		if(feof(fp)!=0)
		{
			break;
		}
		ch = fgetc(fp);
		fputc(ch,fq);
	}
	return 0;
}
#include<stdio.h>
#include<stdlib.h>
int main()
{
	FILE *fp = fopen("./1.jpg","rb");
	if(fp == NULL)
	{
		perror("fopen");
	}
	FILE *fq = fopen("./3.jpg","wb");
	if(fq == NULL)
	{
		perror("fopen");
	}
	fseek(fp,0,2);
	int i = ftell(fp);
	rewind(fp);
	char *p = (char *)malloc(i);
	fread(p,1,i,fp);
	fwrite(p,1,i,fq);

	fclose(fp);
	fclose(fq);
	free(p);
	p=NULL;
	
	return 0;
}

1.有5个学生, 每个学生有3门课程的成绩,从键盘输人学生数据(包括学号,姓名,3
门课程成绩),计算出平均成绩,将原有数据和计算出的平均分数存放在磁盘文件“stud”中。
2.将第1题“stud”文件中的学生数据,按平均分进行排序处理,将已排序的学生数据
存入一个新文件“stu. sort" 中。
3.将第2题已排序的学生成绩文件进行插人处理。插人一个学生的3门课程成缋,程
序先计算新插人学生的平均成绩,然后将它按成绩高低顺序插人,插人后建立一个新文件。
4.将第3题结果仍存入原有的“stu_ sort"文件而不另建立新文件。

struct student//定义结构体 
{
 int num;
 char name[10];
 int score[3];
 float ave;
 }stu[5];
int main(int argc, char *argv[]) {
 int i,j,sum,t;
 FILE *fp;
 struct student p,temp,re[6];
 for(i=0;i<5;i++)//结构体赋值 
 {
  printf("输入第%d条记录\n",i+1);
  scanf("%d,%s",&stu[i].num,stu[i].name);
  printf("请输入三门课成绩\n");
  scanf("%d,%d,%d",&stu[i].score[0],&stu[i].score[1],&stu[i].score[2]);
  sum=0;
  sum=stu[i].score[0]+stu[i].score[1]+stu[i].score[2];
  stu[i].ave=sum/3.0;
 }
 if((fp=fopen("stud.txt","w"))==NULL)//写入文件 
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
 fwrite(&stu[i],sizeof(struct student),1,fp);
 fclose(fp);
 if((fp=fopen("stud.txt","r"))==NULL)//读取文件 
 {
  printf("cannot open stud.txt\n");
  exit(0);
 }
 for(i=0;i<5;i++)
 {
  fread(&stu[i],sizeof(struct student),1,fp); 
        printf("%d,%s,%d,%d,%d,%6.2f\n",stu[i].num,stu[i].name,stu[i].score[0],stu[i].score[1],stu[i].score[2],stu[i].ave);
 }
    fclose(fp);
    printf("\n");}

好了,今天就分享到这了,明天继续! 

 

 

### GD32F470ZGT6 芯片驱动程序下载、安装与使用说明 对于 GD32F470ZGT6 芯片的开发,其外设驱动程序通常位于官方 BSP(Board Support Package)库中。以下是关于该芯片驱动程序的具体信息: #### 1. 驱动程序位置 GD32F470 系列的外设驱动程序可以找到在以下路径下: ```plaintext bsp\gd32\arm\libraries\gd32_drivers ``` 此路径包含了所有必要的硬件抽象层(HAL)以及底层驱动文件[^1]。 #### 2. 驱动程序获取方式 可以通过以下两种主要途径来获取 GD32F470 的驱动程序及相关资源: - **官方网站**: 访问 GigaDevice 官方网站并进入支持页面,查找对应型号的固件包。 - **第三方工具链**: 如果使用 Keil MDK 或 IAR Embedded Workbench 开发环境,则可以直接通过在线组件管理器更新最新的 GD32 库。 #### 3. 驱动程序安装流程 完成下载后需按照如下步骤集成到项目工程中: - 将解压后的 `gd32_drivers` 文件夹复制至工作目录; - 在 IDE 中创建新工程项目时指定头文件路径指向上述文件夹内的 include 子目录; - 同样链接对应的源码模块 (.c 文件),确保编译过程中能够识别这些函数定义。 #### 4. 使用注意事项 当涉及到闪存操作时需要注意,默认情况下 Flash 是处于写保护状态下的,因此执行任何修改存储单元内容之前都应先调用启用写的接口方法[^2]: ```c // 假设存在这样的API用于设置写允许标志位 void flash_write_enable(void); flash_write_enable(); ``` 另外,在实际应用层面比如利用 RTC 实现时间日期记录等功能时,除了基本初始化之外还需要考虑更多细节配置选项以便满足特定需求场景的要求[^3]. ```python # 示例 Python 伪代码展示如何模拟简单的日历逻辑处理部分 def update_calendar(year, month, day): days_in_month = { 1:31, ... 12:31} if year % 4 == 0 and (year % 100 != 0 or year % 400 == 0): days_in_month[2]=29 total_days=sum([days_in_month[m]for m in range(1,month)])+day return f"{total_days}th Day Of The Year" print(update_calendar(2023,5,1)) # 输出结果为 '121st Day Of The Year' ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

weixiaxiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值