木皆之森 - 编程
type: channel
link: https://www.raobee.com/category/code/
description: programming
items: Verilog笔记（一） —— 常用的给连续信号延时的手段
items: 开坑！写一个属于自己的QQ机器人（一）
items: typecho handsome主题侧边栏广告位去除“广告”标题
items: C语言线性单链表的建立与简单使用
items: C语言志愿者管理系统

Verilog笔记（一） —— 常用的给连续信号延时的手段
type: item
date: 2023-02-16T21:13:57+08:00
description: 使用verilog进行编程时，经常会遇到需要对连续信号进行延时处理的情况，这里记录一下常用的给信号进行延时打拍的手段。 方案一：使用多个寄存器采用时序逻辑依次赋值，如下： /****************************************************************\ 此方案使用了3倍数据位宽的寄存器，实现了延迟2拍输出数据的效果 \****************************************************************/ module aaa( input clk, input rst_n, input [7:0]data_in, output [7:0]data_out ); reg [7:0]data_delay_1, data_delay_2, data_delay_3; always @(posedge clk or negedge rst_n) if(!rst_n) begin data_delay_1 <= 8'h0; data_delay_2 <= 8'h0; data_delay_3 <= 8'h0; end else begin data_delay_1 <= data_in; data_delay_2 <= data_delay_1; data_delay_3 <= data_delay_2; end assign data_out = data_delay_3; endmodule 方案优点：延时拍数较少时方便阅读，常见于需要延时一两拍的场景下。 方案缺点：延时拍数较多时阅读性变差。 至于资源占用其实在FPGA综合布线时会被自动优化成移位寄存器形式。 方案二：使用移位寄存器 待补充，先鸽了，总而言之就是使用shift_ram巴拉巴拉巴拉...

开坑！写一个属于自己的QQ机器人（一）
type: item
date: 2021-02-03T21:47:00+08:00
description: 基于nonebotV2与go-cqhttp，写一个属于自己的QQ机器人 介绍 要写一个属于自己的QQ机器人，首先要了解QQ机器人的组成原理，不同组件实现的功能以及实现方式。 组件名 作用 描述 go-cqhttp 无头客户端 与QQ服务器连接，模拟真实QQ客户端，与自己的后端逻辑框架（即头）进行交互，实现各种消息通知的收发 nonebot2 “头骨” 接受无头客户端发送来的消息，提供封装好的方法供开发者编写处理逻辑，相当于“头骨”，起框架作用 这篇文章 （个系列） 会基于以上框架，自行编写处理逻辑，实现自己想要的功能 注意 nonebot是使用python3来编写的框架，后续的所有相关代码都是基于在nonebot可以运行的python环境（python3 >= 3.7）下编写与测试。虽然python相对比较容易入门，编写这样的机器人还是需要有少许编程基础知识的，完全没有任何相关概念的人尽早右上退出吧（~虽然我自己也就是个半吊子水平~）。 环境 编写环境是Windows10,amd64,python3.8 本文编写时所使用框架版本：nonebot 2.0.0a9,go-cqhttp v0.9.39 安装所需环境： nonebot: pip3 install nonebot go-cqhttp: https://github.com/Mrs4s/go-cqhttp/releases 注意根据自己的系统、处理器架构来挑选对应的可执行文件 例如： Windows系统，AMD64架构，则下载后缀为windows-amd64.exe的文件 Linux系统，I386架构，则下载后缀为linux-i386的文件 go-cqhttp配置 在go-cqhttp可执行文件同目录下创建config.hjson，按照如下模板修改信息配置 /* go-cqhttp 默认配置文件 */ { // QQ号 uin: 12345678 // QQ密码 password: "这里填机器人QQ密码" // 是否启用密码加密 encrypt_password: false // 加密后的密码, 如未启用密码加密将为空, 请勿随意修改. password_encrypted: "" // 是否启用内置数据库 // 启用将会增加10-20MB的内存占用和一定的磁盘空间 // 关闭将无法使用 撤回 回复 get_msg 等上下文相关功能 enable_db: true // 访问密钥, 强烈推荐在公网的服务器设置 access_token: "" // 重连设置 relogin: { // 是否启用自动重连 // 如不启用掉线后将不会自动重连 enabled: true // 重连延迟, 单位秒 relogin_delay: 3 // 最大重连次数, 0为无限制 max_relogin_times: 0 } // API限速设置 // 该设置为全局生效 // 原 cqhttp 虽然启用了 rate_limit 后缀, 但是基本没插件适配 // 目前该限速设置为令牌桶算法, 请参考: // https://baike.baidu.com/item/%E4%BB%A4%E7%89%8C%E6%A1%B6%E7%AE%97%E6%B3%95/6597000?fr=aladdin _rate_limit: { // 是否启用限速 enabled: false // 令牌回复频率, 单位秒 frequency: 1 // 令牌桶大小 bucket_size: 1 } // 是否忽略无效的CQ码 // 如果为假将原样发送 ignore_invalid_cqcode: false // 是否强制分片发送消息 // 分片发送将会带来更快的速度 // 但是兼容性会有些问题 force_fragmented: false // 心跳频率, 单位秒 // -1 为关闭心跳 heartbeat_interval: 0 // HTTP设置 http_config: { // 是否启用正向HTTP服务器 enabled: false // 服务端监听地址 host: 0.0.0.0 // 服务端监听端口 port: 5700 // 反向HTTP超时时间, 单位秒 // 最小值为5，小于5将会忽略本项设置 timeout: 0 // 反向HTTP POST地址列表 // 格式: // { // 地址: secret // } post_urls: {} } // 正向WS设置 ws_config: { // 是否启用正向WS服务器 enabled: false // 正向WS服务器监听地址 host: 0.0.0.0 // 正向WS服务器监听端口 port: 6700 } // 反向WS设置 ws_r…

typecho handsome主题侧边栏广告位去除“广告”标题
type: item
date: 2020-12-26T17:22:00+08:00
description: 前言 不得不说handsome这款主题确实还挺美观方便的，只是有部分小问题需要自行修改，比如侧边栏自带广告位很适合拿来放置一些自定义小部件，但他会自带一个“广告”标题在上方（即使放的内容根本就不是广告），让人有点不爽。下面写出如何去除或修改该标题方法。 步骤 来到网站目录，typecho下handsome主题的目录路径为 /usr/themes/handsome/打开该目录下的component目录，修改sidebar.php 如果你未曾修改过该文件的话，待修改内容在文件的第106行附近 <?php if ($this->options->adContentSidebar != ""): ?> <?php _me("广告") ?> <?php $this->options->adContentSidebar(); ?> <?php endif; ?> 如果要删除这个标题，则将 <?php _me("广告") ?> 这一整行删除，如果要修改内容为自定义内容，修改“广告”二字为自己想要内容，最后保存即可。 效果对比 修改前： 修改后

C语言线性单链表的建立与简单使用
type: item
date: 2020-06-07T16:52:00+08:00
description: 实验内容 编写程序完成单链表的下列基本操作： 建立一个长度为n的单链表。 插入新结点。 删除某一个结点。 打印输出La中的结点元素值。 实验方法 数据产生 通过随机数函数获得数据，或通过赋值方法确定数据。 线性表的插入与删除 线性表在本次实验中是动态变化，插入、删除元素，为使线性表任保持有序性，必须要找到元素插入或删除的位置。 源代码 /******************** > File Name: ll.c > Author:Raoby > School:WUST_EEA_1801班 > Myblog:www.raobee.com > Mail:1458096930@qq.com > Created Time: 2020年06月03日 星期三 21时22分23秒 ********************/ #include <stdlib.h> #include <stdio.h> #include <math.h> #include <time.h> typedef struct sNode { int data; struct sNode* next; }Node; int creat(Node* head, int length) //创建新链表 { //根据输入的指针作为头部，创建长度为length，数据为随机数的链表 int i; //计数局部变量 Node* p2,*p1 = head; //局部指针变量 srand((unsigned int)time(NULL)); for (i = 0; i < length; i++) { if (p2 = (Node*)malloc(sizeof(Node))) { //申请内存成功 p2->data = rand(); p2->next = NULL; //此步此处其实可以忽略，因为循环体中都会赋值 p1->next = p2; p1 = p2; } else { //申请内存出现问题，退出循环体，清除已分配的区域并返回-1错误码 break; } } if (i < length) { //未达到循环条件便退出，认为是分配内存错误，清除已分配区域 p1 = head->next; while (p1) { p2 = p1->next; free(p1); p1 = p2; } return -1; } p1->next = NULL; //末尾节点指针设为空 return 0; //创建成功 } int insert(Node* head, int place, int data) //输入插入至第place位，原本place位及之后数据向后移 { int i; Node* p2, * p1 = head; if (place <= 0) //输入数据位置有误 { return -1; } //定位至第place号节点前一位 for (i = 0; i < place-1; i++) { if (!p1->next) { return -1; //输入数据越界 } p1 = p1->next; } p2 = p1->next; p1->next = (Node*)malloc(sizeof(Node)); p1->next->next = p2; p1->next->data = data; return 0; } int delete(Node* head, int place) { int i; Node* p2,*p1 = head; p2 = p1; if (place <= 0) //输入数据位置有误 { return -1; } //定位至第place号节点前一位 for (i = 0; i < place; i++) { p2 = p1; p1 = p1->next; if (!p1) //若p1变为空指针，即输入位置越界，删除失败，返回-1 { return -1; } } p2->next = p1->next; //被删除节点上节点连接至下节点 free(p1); return 0; } int* show(Node* head, int place) //查询指定节点数据函数，查询成功返回指定节点数据指针 { int i; Node* p = head; if (place <= 0) //输入数据位置有误 { return NULL; } for (i = 0; i < place; i++) { p = p->next; if (!p) //若p变为空指针，即输入位置越界，查询失败，返回空指针 { return NULL; } } return &(p->data); } int change(Node* head, int place…

C语言志愿者管理系统
type: item
date: 2020-01-22T20:45:00+08:00
description: 基于C语言的军运会学生志愿者管理系统 关键词：C语言、课程设计、军运会志愿者管理系统 一、背景 基本掌握面向过程程序设计的基本思路和方法； 达到熟练掌握C语言的基本知识和技能； 能够利用所学的基本知识和技能，解决简单的程序设计问题； 独立进行程序的编写，为后续学习及课程做好准备。 二、环境 本程序开发所使用的环境为Visual Studio 2010 Community版 + Windows10 Professional操作系统 三、要求 为了迎接武汉市世界军人运动会，请你学习C语言中相关知识，帮助组委会设计一个军运会志愿者信息管理系统，包含以下主要功能（不限于以下）： 实现对志愿者信息的管理，包括添加志愿者信息（姓名，学号，联系方式等等），查询志愿者信息，删除志愿者信息; 实现军运会场馆的管理，包括添加场馆信息，查询场馆信息，删除场馆信息； 实现通过文件保存志愿者信息； 实现每个场馆对应不同志愿者的分配管理(例如，田径场需要4位志愿者，射击馆需要2位志愿者)； 实现志愿者和场馆信息的快速查询统计功能，可以根据最后志愿服务时间评选最美志愿者; 除以上基本功能外，可根据各位同学自己设定的需求自行添加。 四、数据结构 typedef struct sfield{ //场馆信息结构体 int fieldId; //场馆节点唯一数字id(int) char fieldName[30]; //场馆名字(char[30]) char startTime[20]; //开始时间(char[20]) int lastTime; //持续时间(int) int maxVolunteer; //需要志愿者数量(int) int joinedVolunteer[MAX1]; //保存已加入志愿者信息(int[MAX1]) (MAX1=100) struct sfield* head; //节点头部指针，指向上一个节点(struct sfield*) struct sfield* next; //节点尾部指针，指向下一个节点(struct sfield*) }field; typedef struct svolunteer{ //志愿者信息结构体 int volunteerId; //志愿者节点唯一数字id(int) char volunteerName[30]; //志愿者名字(char[30]) char idNum[20]; //志愿者学号(char[20]) char phoneNum[20]; //志愿者手机号(char[20]) int joinedField[MAX2]; //保存志愿者加入场馆唯一id(int[MAX2]) (MAX2=20) int serviceTime; //志愿服务时长(int) struct svolunteer* head; //节点头部指针，指向上一个节点(struct svolunteer*) struct svolunteer* next; //节点尾部指针，指向下一个节点(struct svolunteer*) }volunteer; 本程序使用两类结构体，分别储存志愿者信息（Volunteer）和场馆信息（Field）。每个结构体准备了指向上一个节点与下一个节点的指针，用于创建动态链表。如果要自行修改为使用数组储存数据，则可以不用这些指针。 五、定义功能函数 void startUp();//初始化函数，将数据链表头结点头尾部初始化，数据部分清零，防止出错 int readFile(); //读取已保存的数据文件，若不存在则建立 int saveFile(); //储存已保存的数据文件，若不存在则建立 void newField(); //新增场馆信息 void newVolunteer(); //新增志愿者信息 void changeField(field*); //修改场馆信息 void changeVolunteer(); //修改志愿者信息 void deleteField(); //删除场馆信息 void deleteVolunteer(); //删除志愿者信息 void bind(); //注册志愿活动 void unbind(); //注销志愿活动 void showMenu(); //显示主菜单 void manageField(); //显示场地管理菜单 void manageVolunteer(); //显示志愿者管理菜单 field* selectFieldById(int); //通过唯一ID查找场馆指针 field* selectFieldByName(char*); //通过场馆名字查找场馆指针 volunteer* selectVolunteerById(int); …