c/c++ 实现 calendar

需求 c/cpp 在一些嵌入式应用中,需要自己来实现对输入日期的校验和星期几的计算。 解决 日期校验还好说,主要是闰年的判断。 星期几的计算就比较麻烦了,一般是使用蔡勒公式。 蔡勒公式 1582年10月4日之后 w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 - y / 100 + y / 400) % 7 1582年10月4日或之前 w = (d + 1 + 2 * m + 3 * (m + 1) / 5 + y + y / 4 + 5) % 7 解释: w:星期; w对7取模得:0-星期日,1-星期一,2-星期二,3-星期三,4-星期四,5-星期五,6-星期六 c:世纪(注:一般情况下,在公式中取值为已经过的世纪数,也就是年份除以一百的结果,而非正在进行的世纪,也就是现在常用的年份除以一百加一;不过如果年份是公元前的年份且非整百数的话,c应该等于所在世纪的编号,如公元前253年,是公元前3世纪,c就等于-3) y:年(一般情况下是后两位数,如果是公元前的年份且非整百数,y应该等于 cMOD100+100) m:月(m大于等于3,小于等于14,即在蔡勒公式中,某年的1、2月要看作上一年的13、14月来计算,比如2003年1月1日要看作2002年的13月1日来计算) d:日 示例 [ ]代表取整,即只要整数部分。...

<span title='2023-12-15 11:22:00 +0800 CST'>2023-12-15</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;575 words&nbsp;·&nbsp;RamLife

rt-thread hard fault 定位

需求 rt-thread hard fault 定位方式 解决 一般 hard fault 都是 pc 为 0 导致的,处理方法如下: 查看 lr,找到调用的位置 使用 ide 查看汇编,或者打开 map 文件,找到 lr 指向的位置。注意 map 只有函数首地址,所以定位时使用 lr 的前几位。 参考 {RTT} RT-Thread Hard Fault 死机问题定位方法

<span title='2023-12-14 13:58:00 +0800 CST'>2023-12-14</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;33 words&nbsp;·&nbsp;RamLife

stm32 rtc 读取数据不正常

需求 stm32 使用 hal 读取 rtc 数据时,发现数据读取要不是 0,要不就不变,比较奇怪。 解决 经过多次调试并查看源码,才发现,API的注释里面写了,需要先调用 HAL_RTC_GetTime, 再调用 HAL_RTC_GetDate, 才行,否则就不行。因为先读取 time 可以解锁读取。 =You must call HAL_RTC_GetDate() after HAL_RTC_GetTime() to unlock the values in the higher-order calendar shadow registers to ensure consistency between the time and date values.= 参考 HAL库使用RTC设置时间显示日期不符的解决办法 STM32】HAL库 STM32CubeMX教程十三—RTC时钟 STM32电子万年历制作详解(RTC实战) 【经验分享】STM32实例-RTC实时时钟实验③-RTC设置日期时间函数 【STM32】HAL库 STM32CubeMX教程十三—RTC时钟 STM32H750中RTC简介及使用方法 STM32CubeMX学习笔记——STM32H743_RTC

<span title='2023-12-12 17:44:00 +0800 CST'>2023-12-12</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;51 words&nbsp;·&nbsp;RamLife

QT QJson 使用

需求 Qt 如何使用 QJson 解析 json 解决 int NetworkDataParse::Parse(const QByteArray& data, QJsonObject& obj) { QJsonParseError error; QJsonDocument doc = QJsonDocument::fromJson(data, &error); if (doc.isNull()) { return -1; } obj = doc.object(); int type = obj.value("type").toString().toInt(); // QJsonValue type_value = obj.value("type"); // QString type_string = type_value.toString(); // qDebug() << "Parse: " << type_string << ", " << type; // switch (type) { // case kTypeAlive: // return ParseAlive(obj); // break; // default: // break; // } // return 0; return type; } 参考 Qt平台下使用QJson解析和构建JSON字符串 Qt 学习之路 :使用 QJson 处理 JSON JSON Support in Qt QJson的生成和解析 QJson读取及写入 使用fastjson解析JSON数据 QJsonArray....

<span title='2023-12-11 21:41:00 +0800 CST'>2023-12-11</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;100 words&nbsp;·&nbsp;RamLife

android 引入 fastjson 解析 json

需求 android 如何使用 fastjson ? 解决 注意: fastjson 的版本号,有些版本不合适。 implementation 'com.alibaba:fastjson:1.1.76.android' AliveBean.java package com.tianze.coagulationanalyzer.network; public class AliveBean { private String type; private String ip; private String sn; private String time; private String reagentId; public String getType() { return type; } public void setType(String type) { this.type = type; } public String getIp() { return ip; } public void setIp(String ip) { this.ip = ip; } public String getSn() { return sn; } public void setSn(String sn) { this....

<span title='2023-12-10 07:49:00 +0800 CST'>2023-12-10</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;161 words&nbsp;·&nbsp;RamLife

android 获取 IP 地址

需求 android 获取本机 ip 地址 解决 public class NetworkHelper { private static final String TAG = "NetworkHelper"; private Context context; public NetworkHelper(Context context) { this.context = context; } // 获取ip地址 @RequiresApi(api = Build.VERSION_CODES.M) public String getLocalIpAddress() { // ConnectivityManager netManager = (ConnectivityManager) getApplicationContext().getSystemService(CONNECTIVITY_SERVICE); ConnectivityManager netManager = (ConnectivityManager) context.getApplicationContext().getSystemService(CONNECTIVITY_SERVICE); // NetworkInfo info = netManager.getActiveNetworkInfo(); // // 网络是否连接 // if (info != null && info.isConnected()) { // // wifi类型 // if (info.getType() == TYPE_WIFI) { // return getWifiIpAddress(); // } else { // // 其他类型 // return getEthIpAddress(); // } // } try { NetworkInfo info = netManager....

<span title='2023-12-03 07:49:00 +0800 CST'>2023-12-03</span>&nbsp;·&nbsp;3 min&nbsp;·&nbsp;436 words&nbsp;·&nbsp;RamLife

QT5 升级到 Qt6, QRegExp 不能用

需求 Qt5 的工程升级到 Qt6 之后,找不到 QRegExp 等一系列类。 解决 QRegExp -> QRegularExpression QRegExpValidator -> QRegularExpressionValidator // Qt5 QRegExp version(QLatin1String("(.+)_v(\\d+)")); if (version.exactMatch(completeBaseName/*QString*/)) { // some code } // Qt6 QRegularExpression version(QLatin1String("(.+)_v(\\d+)")); QRegularExpressionMatch match = version.match(completeBaseName); if (match.hasMatch()) { // Find exact match or not } 参考 QT6找不到QRegExpValidator类问题解决办法 关于QRegExpValidator头文件不存在的问题 Qt6中的端口QRegExp::exactMatch()

<span title='2023-12-02 21:41:00 +0800 CST'>2023-12-02</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;47 words&nbsp;·&nbsp;RamLife

android EditText 限制输入

需求 android EditText 限制输入,只能输入 ip 地址 解决 IPSectionFilter.java package com.tianze.platform.utils; import android.text.InputFilter; import android.text.Spanned; public class IPSectionFilter implements InputFilter { /** * @param source 新输入的字符串 * @param start 新输入的字符串起始下标,一般为0 * @param end 新输入的字符串终点下标,一般为source长度-1 * @param dest 输入之前文本框内容 * @param dstart 新输入的字符在原字符串中的位置 * @param dend 原内容终点坐标, * @return 输入内容 */ @Override public CharSequence filter(CharSequence source, int start, int end, Spanned dest, int dstart, int dend) { String sourceText = source.toString(); String destText = dest....

<span title='2023-12-02 07:49:00 +0800 CST'>2023-12-02</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;143 words&nbsp;·&nbsp;RamLife

printf 格式化输出

需求 printf 格式话输出具体有哪些? 解决 控制符 控制符 说明 %d 十进制整形输出 %ld 长整形 %md 指定宽度至少 m 输出,宽度不够就空格补,宽度超过就按照实际输出 %u 无符号整形 %c 单个字符 %f 浮点数,小数为6位,超过6位四舍五入 %s 字符串 格式 具体格式: %[flags][width][.precision][length]specifier 整形 %d, 整形 %4d, 大于等于4位宽度,补空格 %04d, 大于等于4位宽度,补0 浮点数 %f, 浮点数,小数6位 %.4f, 小数4位 %6.2f, 大于等于6位,小数2位,不足补空格 %06.2f, 大于等于6位,小数2位,不足补0 字符串 %s, 字符串 %6s, 大于等于6位,不足补空格 参考 C语言printf指定宽度的格式化输出

<span title='2023-11-30 16:40:00 +0800 CST'>2023-11-30</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;49 words&nbsp;·&nbsp;RamLife

Guix text_button 设置文字,报错 0x30

需求 需要设置 text_button 上面显示的文字的时候,报错 "GX_SYSTEM_MEMORY_ERROR : (0x30) 未定义内存分配器或内存分配失败。" 解决 分析 debug 仔细追查,发现 _gx_text_button_text_set_ext 这个函数里面会判断有没有设置 private text copy, 如果设置了,那么再检查有没有开启 _gx_system_memory_allocator, 如果没有,那么就会报错 0x30 了。 解决方法 有两种解决方法: 无 private text copy + 无 gx_system_memory_allocator_set(memory_allocate, memory_free), 会直接使用传入进去的字符串参数,只要传入进去的不是局部变量,就没有必要勾选 private text copy. 有 private text copy + 有 gx_system_memory_allocator_set(memory_allocate, memory_free), 也可以,会多复制一份数据。 参考 第 4 章 - GUIX 服务说明 {ThreadX全家桶} GUIX sample 错误–>gx_prompt_text_set_ext大坑,必须正确指定有效字符串长度才可以使用

<span title='2023-11-30 16:32:00 +0800 CST'>2023-11-30</span>&nbsp;·&nbsp;1 min&nbsp;·&nbsp;56 words&nbsp;·&nbsp;RamLife