c/c++ 实现 _gettimeofday

需求 c/cpp 在一些嵌入式应用中,使用 time() 时,编译会报警告 warning: _gettimeofday is not implemented and will always fail 解决 这个警告的原因其实是因为,嵌入式环境中,有些是没有实现 _gettimeofday(), 所以就需要自己来实现这个函数,实现从 rtc 时间到秒之间的转换。 int _gettimeofday(struct timeval *tv, struct timezone *tz) { Rtc::Date date; Rtc::Time time; Rtc::GetRtcValue(date, time); tm time_tm {time.second, time.minute, time.hour, date.day, date.month - 1, date.year - 1900}; time_t time_second = mktime(&time_tm); tv->tv_sec = time_second; tv->tv_usec = 0; // tz->tz_minuteswest = 480; // tz->tz_dsttime = DST_NONE; return 0; } 参考 _gettimeofday_r error come while i am building with latest stm cube ide STM32 之 时间戳的解析与生成 STM32CubeMX使用(六)之RTC及制作时间戳 mktime很慢就自己去实现一个吧 linux几种时间函数总结 时间获取相关函数mktime()、gmtime() 【c/c++】linux时间获取与时间转换函数总结 杂谈:Linux时间管理之gettimeofday实现 gettimeofday()函数的使用方法 linux中time, ctime, gmtime, localtime, gettimeofday和strftime C语言的时间函数(1)gettimeofday,timeval,timezone linux系统中struct timeval结构体、struct timezone结构体以及gettimeofday函数 C 标准库 - <time....

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

mysql error: Cannot delete or update a parent row: a foreign key constraint fails

需求 使用 mysql 在删除数据表时,报错: =“Cannot delete or update a parent row: a foreign key constraint fails” = 解决 这个问题其实很简单,就是需要删除的表关联到了其他副表,想要删除无非就几种方法: 先把其他相关联的副表中的内容给删除掉,再回头删除主表中的内容 先禁用外键约束,等删除好了,再启用外键约束 SET FOREIGN_KEY_CHECKS=0; -- 禁用外键约束 SET FOREIGN_KEY_CHECKS=1; -- 启用外键约束 外键约束中,删除也选择 CASCADE 级联约束。 参考 mysql 删除数据表报错 表删除时 Cannot delete or update a parent row: a foreign key constraint fails 异常处理 删除数据提示1451:cannot delete or update a parent row:a foreign key constraint fails 删除带外键的表【foreign key constraint fails】报错 Mysql - 删除表时出现: Cannot delete or update a parent row: a foreign key constraint fails

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

mysql 多表外键联查视图

需求 使用 mysql,建立了多张表,表之间使用外键进行关联,现在需要通过视图进行多表联查。 多表内容 reagent key_id project type 1 coag gbact itemrange key_id fk_reagent item 1 1 act 2 1 cr 3 1 pf filereportdata key_id fk_item value strip 1 2 1.1 sid01 2 1 2.2 sid02 3 3 3.3 sid03 多表关系 filereportdata.fk_item = itemrange.key_id itemrange.fk_reagent = reagent.key_id 期望结果 strip project type item value sid01 coag gbact cr 1.1 sid02 coag gbact act 2.2 sid03 coag gbact pf 3.3 解决 多表查询 SELECT f....

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

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

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

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

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

c++ 成员变量初始化推断数组大小

需求 cpp 发现直接使用 const char str[] ="test"; 作为成员变量,编译会报错: error: array bound cannot be deduced from an in-class initializer. 解决 这个报错的原因是,作为成员变量,可能会被构造函数中的 类内初始化列表重新初始化。比如: Foo() : str({'a','b', 'c', 'd'}) {} // str ="abcd0". 所以,如果这个成员变量本身是不变的情况,可以使用 constexpr 这个关键字, static constexpr char str[] ="test"; 这样,变成类变量。 参考 关于c ++:不能从成员变量的初始化字符串中推断出数组大小的原因是什么? C++11关键字constexpr看这篇就够了

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

Guix 是否使用显存方案选择

需求 使用 guix,是否需要显存? 显存需要多大? 解决 是否需要显存? gui 显示一般就是两种方式,直驱或者显存刷新。 直驱 直驱的意思是,程序中界面需要变化时,直接向显示设备中对应的区域写入新的数据。 好处是: 不需要显存,那里变化改那里。适合于 RAM 小的情况。 坏处是: 因为没有显存,所以在更新时经历这样的过程: 1. 先清除相关区域; 绘制背景; 3. 绘制前景. 这种多步骤的实现方式,加上小容量 RAM 一般 使用的是接口屏本身的速度限制,很容易会造成整体时间过长,人眼看上去容易有闪烁和撕裂的情况。也就是闪屏的情况。 显存 显存的意思是,程序中界面需要变化时,把需要更新的数据先更新到显存中,然后 gui 会一次把最终结果写入到屏幕。 好处是: 这种情况下屏幕更新需要的时间很短,只有直驱的 1/3,显示稳定,没有闪烁的情况。 坏处是: 需要 RAM 足够大,能够容纳整个屏幕,这样才能作为显示缓冲来工作。 总结 如果 RAM 够大,推荐显存方式,不闪屏,体验好。如果 RAM 小,屏幕小,用户对于显示效果不敏感,就可以使用直驱方案。 显存容量计算 显存占用的 RAM 计算方式: 屏幕长 * 屏幕宽 * 单个像素点字节数。 比如: 320 * 240 的屏幕,使用 16bit 位宽的像素,那么显存大小就是 320 * 240 * 16 / 8 = 153.6 kB. 并且使用 gui + 显存的方案,一般会搭配 DAM2D 来加快数据传输,包括新数据写入显存,以及显存通过 fmc 更新到屏幕。...

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