SQLITE3 函数接口
简述
sqlite3 接口的核心元素: 两大对象,八大函数;
其中两个对象指的是:
sqlite3_stmt SQL 语句对象
编程流程
打开或创建一个数据库函数(sqlite3_open)
#include <sqlite3.h>
SQLITE_API int sqlite3_open(const char *filename,sqlite3 **ppDb);
sqlite3 * pDB = NULL; //用来表示你打开的数据库
//打开数据库
int ret = sqlite3_open(argv[1],&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象
if(ret != SQLITE_OK)
{printf("open sqlite3 database error\n");return 0;
}
关闭数据库函数(sqlite3_close)
#include <sqlite3.h>
SQLITE_API int sqlite3_close(sqlite3* ppDb);
//关闭数据库
sqlite3_close(pDB); //关闭一个 sqlite3 数据库
准备一条 SQL 语句对象(sqlite3_prepare_v2)
#include <sqlite3.h>
SQLITE_API int sqlite3_prepare_v2(sqlite3 *db, /* 数据库句柄 */const char *zSql, /* SQL 语句,UTF-8 编码 */int nByte, /* zSql 的最大长度,以字节为单位。 */sqlite3_stmt **ppStmt, /* OUT:语句句柄 */const char **pzTail /* OUT:指向 zSql 中未使用部分的指针,一般给 NULL*/
);
int num; //存放 ID
char name[20] = {0}; //存放 name
char Tel[20] = {0}; //存放电话号码
char sql[256] = {0}; //存放 sql 语句
memset(name,0,20);
memset(Tel,0,20);
scanf("%d%s%s",&num,name,Tel);
if(num == 0) //输入 0 结束
{break;
}
memset(sql,0,20);
sprintf(sql,"INSERT INTO STU VALUES(%d,'%s','%s');",num,name,Tel);
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象
if(ret != SQLITE_OK)
{perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;
}
销毁 SQL 语句对象(sqlite3_finalize)
#include <sqlite3.h>
SQLITE_API int sqlite3_finalize(sqlite3_stmt *pStmt);
执行一条 SQL 语句对象(sqlite3_step)
#include <sqlite3.h>
SQLITE_API int sqlite3_step(sqlite3_stmt* pStmt);
//执行准备好的 sql 语句
ret = sqlite3_step(stmt);
if(ret == SQLITE_DONE)
{printf("sqlite3_step success\n");
}else
{printf("sqlite3_step failed,%d\n",ret);
}
普通编程流程示例
#include<stdio.h>
#include<sqlite3.h>
#include<stdlib.h>
#include<string.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL; //用来表示表示你打开的数据库//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象,表的列有 ID,NAME,TELint num; //存放 IDchar name[20] = {0}; //存放 namechar Tel[20] = {0}; //存放电话号码char sql[256] = {0}; //存放 sql 语句while(1){//输入插入表中的数据memset(name,0,20);memset(Tel,0,20);scanf("%d%s%s",&num,name,Tel);if(num == 0) //输入 0 结束{break;}memset(sql,0,20);sprintf(sql,"INSERT INTO JIUYUE VALUES(%d,'%s','%s');",num,name,Tel);sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象ret = sqlite3_prepare_v2(pDB,sql,-1,&stmt,NULL); //准备一个语句对象if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}//执行准备好的 sql 语句ret = sqlite3_step(stmt);if(ret == SQLITE_DONE){printf("sqlite3_step success\n");}else{printf("sqlite3_step failed,%d\n",ret);}//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt); }//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}
添加数据前表中内容:

执行函数后:


回调函数执行接口(sqlite3_exec)
#include <sqlite3.h>
SQLITE_API int sqlite3_exec(sqlite3* ppDb, /* 数据库句柄 */const char *sql, /* SQL 语句 */int (*callback)(void*,int,char**,char**), /* 回调函数 */void *arg1, /* 回调的第一个参数 */char **errmsg /* 保存错误信息*/
);
typedef int(*sqlite_callback)(void* para, int columenCount, char** columnValue, char**columnName);
#include<stdio.h>
#include<sqlite3.h>
int my_callback(void* arg,int ncols,char*col_values[],char*col_names[])
{//打印表头int i;if(*((int *)arg) == 1){for(i = 0;i<ncols;i++) //打印表头{printf("%s\t",col_names[i]);}printf("\n");*((int *)arg) = 0; //表头只打印一次即可}//打印这一条记录的值for(i = 0;i<ncols;i++){printf("%s\t",col_values[i]); //打印表中一行数据}printf("\n");return 0;
}int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}const char *sql = "INSERT INTO JIUYUE VALUES(9,'lishi','17654329987');SELECT * FROM JIUYUE;";int flag = 1; //表头打印标志,为 1 打印,为 0 不打印char *ermsg = NULL; //用来保存出错信息ret = sqlite3_exec(pDB,sql,my_callback,(void *)&flag,&ermsg);if(ret != SQLITE_OK){printf("sqlite3_exec failed:%s\n",ermsg);}//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}
获取结果集的列数(sqlite3_column_count)
#include <sqlite3.h>
SQLITE_API int sqlite3_column_count(sqlite3_stmt *pStmt); 获取表头信息(sqlite3_column_name)
#include <sqlite3.h>
SQLITE_API const char *sqlite3_column_name(sqlite3_stmt *pStmt, int N); //获取结果集的列数
int nCols = sqlite3_column_count(stmt);
int i = 0;
if(flag == 1)
{for(i = 0;i<nCols;i++) //打印一行记录的表头{printf("%s\t",sqlite3_column_name(stmt,i));}printf("\n");flag = 0;
} 获取指定列数据类型(sqlite3_column_type)
#include <sqlite3.h>
SQLITE_API int sqlite3_column_type(sqlite3_stmt *pStmt, int iCol); 获取指定列数据(sqlite3_column_类型名)
#include <sqlite3.h>
SQLITE_API const void *sqlite3_column_blob(sqlite3_stmt*, int iCol);
SQLITE_API double sqlite3_column_double(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_int(sqlite3_stmt*, int iCol);SQLITE_API sqlite3_int64 sqlite3_column_int64(sqlite3_stmt*, int iCol);
SQLITE_API const unsigned char *sqlite3_column_text(sqlite3_stmt*, int iCol);
SQLITE_API const void *sqlite3_column_text16(sqlite3_stmt*, int iCol);
SQLITE_API sqlite3_value *sqlite3_column_value(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes(sqlite3_stmt*, int iCol);
SQLITE_API int sqlite3_column_bytes16(sqlite3_stmt*, int iCol); for(i = 0;i<nCols;i++) //打印一行记录的所有的列
{//获取结果行中第 i 列的类型int vtype = sqlite3_column_type(stmt,i);if(vtype == SQLITE_INTEGER) //如果当前列为整型{ int val = sqlite3_column_int(stmt,i);printf("%d\t",val);}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型{ double val = sqlite3_column_double(stmt,i);printf("%f\t",val);}else if(vtype == SQLITE_TEXT) //如果当前列为字符串{ const char *val = sqlite3_column_text(stmt,i);printf("%s\t",val);}else{printf("\t\t");}
} 采用 column 类函数打印表示例程序
#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象const char *sql = "SELECT * FROM JIUYUE;";ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */); if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}int r; int flag = 1; //表头打印标志,为 1 打印,为 0 不打印do{//3.执行 sql 语句,select 有多少条结果,就可以执行多少次语句r = sqlite3_step(stmt);if(r == SQLITE_DONE){printf("sqlite3_step success\n");break;}//打印 select 语句产生的结果集//获取结果集的列数int nCols = sqlite3_column_count(stmt);int i = 0;if(flag == 1){for(i = 0;i<nCols;i++) //打印一行记录的表头{printf("%s\t",sqlite3_column_name(stmt,i));}printf("\n");flag = 0;}for(i = 0;i<nCols;i++) //打印一行记录的所有的列{//获取结果行中第 i 列的类型int vtype = sqlite3_column_type(stmt,i);if(vtype == SQLITE_INTEGER) //如果当前列为整型{ int val = sqlite3_column_int(stmt,i);printf("%d\t",val);}else if(vtype == SQLITE_FLOAT) //如果当前列为浮点型{ double val = sqlite3_column_double(stmt,i);printf("%f\t",val);}else if(vtype == SQLITE_TEXT) //如果当前列为字符串{ const char *val = sqlite3_column_text(stmt,i);printf("%s\t",val);}else{printf("\t\t");}}printf("\n");} while (r == SQLITE_ROW);//表示 sqlite3_step 产生了一行数据//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt);//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
} 
获取 SQL 语句索引值(sqlite3_bind_parameter_index)
#include <sqlite3.h>
SQLITE_API int sqlite3_bind_parameter_index(sqlite3_stmt * pStmt, const char *zName); char *sql = "INSERT INTO STU(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";
sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象
ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */
);
//1.获取 sql 语句中占位符的索引值
int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值
var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL"); 绑定索引值(sqlite3_bind_类型名)
#include <sqlite3.h>
//常用类型
SQLITE_API int sqlite3_bind_int(sqlite3_stmt*, int, int);
SQLITE_API int sqlite3_bind_text(sqlite3_stmt*,int,const char*,int,void(*)(void*));
SQLITE_API int sqlite3_bind_double(sqlite3_stmt*, int, double);
//其他类型
SQLITE_API int sqlite3_bind_blob(sqlite3_stmt*, int, const void*, int n, void(*)(void*));
SQLITE_API int sqlite3_bind_blob64(sqlite3_stmt*, int, const void*, sqlite3_uint64,void(*)(void*));
SQLITE_API int sqlite3_bind_int64(sqlite3_stmt*, int, sqlite3_int64);
SQLITE_API int sqlite3_bind_null(sqlite3_stmt*, int);
SQLITE_API int sqlite3_bind_text16(sqlite3_stmt*, int, const void*, int, void(*)(void*));
SQLITE_API int sqlite3_bind_text64(sqlite3_stmt*, int, const char*, sqlite3_uint64,void(*)(void*), unsigned char encoding);
SQLITE_API int sqlite3_bind_value(sqlite3_stmt*, int, const sqlite3_value*);
SQLITE_API int sqlite3_bind_pointer(sqlite3_stmt*, int, void*, constchar*,void(*)(void*));
SQLITE_API int sqlite3_bind_zeroblob(sqlite3_stmt*, int, int n);
SQLITE_API int sqlite3_bind_zeroblob64(sqlite3_stmt*, int, sqlite3_uint64); var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");
var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");
var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");
//2.给索引值绑定自己的值
sqlite3_bind_int(stmt,var_index[0],num);
sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);
sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL); 复位操作(sqlite3_reset)
#include <sqlite3.h>
SQLITE_API int sqlite3_reset(sqlite3_stmt *pStmt); 采用绑定的方式从文件中添加数据到数据库程序示例
#include<stdio.h>
#include<sqlite3.h>
int main(int argc, char const *argv[])
{sqlite3 * pDB = NULL;//打开数据库int ret = sqlite3_open("1.db",&pDB);//打开或者创建一个数据库,返回一个数据库的连接对象if(ret != SQLITE_OK){printf("open sqlite3 database error\n");return 0;}//准备一条 sql 语句对象sqlite3_stmt *stmt = NULL;//指针,指向一条语句对象const char *sql = "INSERT INTO JIUYUE(ID,NAME,TEL)VALUES(@ID,@NAME,@TEL);";ret = sqlite3_prepare_v2(pDB, /* 数据库的连接句柄,打开的数据库对象 */sql, /* 要执行的原始的 SQL 语句 */-1, /*zSql 指向的 SQL 语句的长度 */&stmt, /* OUT:准备之后的 SQL 语句对象,把准备好的语句使用 ppstmt 指向它 */NULL /*指针,指向元素 SQL 语句中未使用的部分,一般给 NULL */); if(ret != SQLITE_OK){perror("sqlite3_prepare_v2 failed");sqlite3_close(pDB);return -1;}//打开文件FILE * fp = fopen("table.txt","r");if(fp == NULL) //打开失败{perror("fopen error");sqlite3_finalize(stmt); //打开失败,释放语句对象sqlite3_close(pDB); //关闭数据库return -1;}//获取 sql 语句中占位符的索引值int var_index[3] = {0};//保存@ID,@NAME,@TEL 在语句对象中的索引值var_index[0] = sqlite3_bind_parameter_index(stmt, "@ID");var_index[1] = sqlite3_bind_parameter_index(stmt, "@NAME");var_index[2] = sqlite3_bind_parameter_index(stmt, "@TEL");while (1){int num = 0; //保存 IDchar name[20] = {0}; //保存名字char tel[20] = {0}; //保存电话int r = fscanf(fp,"%d%s%s",&num,name,tel); //从文件中获取数据if(r!=3){if(feof(fp)) //如果文件读到末尾{fclose(fp); //关闭文件break;}continue;}//给索引值绑定自己的值sqlite3_bind_int(stmt,var_index[0],num);sqlite3_bind_text(stmt,var_index[1],name,strlen(name),NULL);sqlite3_bind_text(stmt,var_index[2],tel,strlen(tel),NULL);r = sqlite3_step(stmt);if(r == SQLITE_DONE){printf("sqlite3_step success\n");}else{printf("sqlite3_step failed,%d\n",ret);}//复位 sql 语句对象,方便下一轮的绑定sqlite3_reset(stmt);}//释放 sql 语句资源,销毁 sql 语句对象sqlite3_finalize(stmt);//关闭数据库sqlite3_close(pDB); //关闭一个 sqlite3 数据库return 0;
}
相关文章:
SQLITE3 函数接口
简述 sqlite3 接口的核心元素: 两大对象,八大函数; 其中两个对象指的是: sqlite3 数据库连接对象 数据库的连接句柄(数据库的文件描述符) 代表你打开的那个 sqlite3 的数据库文件,后序对数据库的操作都需要用到这个对象 sqlite3_stmt SQL 语句对象…...
RISC-V IDE MRS无感远程协助模块详解
RISC-V IDE MRS无感远程协助模块详解 一、说明 1.1 概述 针对RISC-V/ARM等内核MCU的嵌入式集成开发环境MRS(MounRiver Studio)从V1.90版本开始内置无感远程协助模块(Sensorless Remote Assistant Module,以下简称SRA模块)。SRA模块是一款支…...
APA技术方案及关键点
APA即我们平时用的最多的基础泊车功能(自动泊车辅助),按照功能来分,有下列子功能: 1.AVM(全景影像),四路环视鱼眼动态拼接,去畸变,提供给用户车身周围360的环境图像信息,有2D(单路鱼眼图)&…...
WordPress外链页面安全跳转插件
老白博客我参照csdn和腾讯云的外链跳转页面,写了一个WordPress外链安全跳转插件:给网站所有第三方链接添加nofollow标签和重定向功能,提高网站安全性。插件包括两个样式,由于涉及到的css不太一样,所以分别写了两个版本…...
【牛客网】安全—加密和安全
每日一练 Day1: 1.信息安全的基本属性是( D ) A.保密性 B.完整性 C.可用性,可靠性,可控性 D.A、B、C都是 信息安全的基本属性通常可以归纳为以下几个方面: 保密性(Confidentiality…...
Mybatis基础操作
基础操作 增删改查 Select 是查询类的注解,所有的查询均使用这个Result 修饰返回的结果集,关联实体类属性和数据库字段一一对应,如果实体类属性和数据库属性名保持一致,就不需要这个属性来修饰。Insert 插入数据库使用ÿ…...
Java实验二类编程实验
1.编写一个代表三角形的类(Triangle.java)。 其中,三条边a,b,c(数据类型为double类型)为三角形的属性,该类封装有求三角形的面积和周长的方法。分别针对三条边为3、4、5和7、8、9的两个三角形进行测试&…...
css文本溢出省略号多行单行例子详细
在 CSS 中,可以使用 text-overflow: ellipsis; 属性来实现文本溢出时自动省略号的效果。但是该属性只能用于单行文本溢出的情况,对于多行文本溢出的情况,需要使用一定的技巧才能实现相应的效果。下面将分别介绍单行和多行文本溢出时的实现方法…...
android auto
测试面向汽车的 Android 应用 | Android 开发者 | Android Developers (google.cn)...
opengl基础笔记1
1、opengl运行模式及opengl规范 运行模式:核心模式与立即渲染模式(弃用) 由于OpenGL的大多数实现都是由显卡厂商编写的,当产生一个bug时通常可以通过升级显卡驱动来解决。这些驱动会包括你的显卡能支持的最新版本的OpenGL…...
Flutter中的各种刷新小部件
1.FutureBuilder 用于处理异步操作和构建界面的非常有用的小部件。它通常与 Future 对象一起使用,用于在异步操作完成后构建界面。 import package:flutter/material.dart;void main() > runApp(MyApp());class MyApp extends StatelessWidget {overrideWidget…...
DataxWeb安装部署及使用--真香警告
DataxWeb安装部署及使用–真香警告 文章目录 1.Datax简介1.1 Datax是什么?1.2 Datax的架构1.3 设计理念1.4 DataX3.0框架设计1.5 DataX3.0插件体系1.6 DataX3.0核心架构1.6.1 核心模块介绍1.6.2 DataX调度流程 2.DataxWeb简介2.1 DataxWeb是什么?2.2 Dat…...
OpenCV 笔记(4):图像的算术运算、逻辑运算
Part11. 图像的算术运算 图像的本质是一个矩阵,所以可以对它进行一些常见的算术运算,例如加、减、乘、除、平方根、对数、绝对值等等。除此之外,还可以对图像进行逻辑运算和几何变换。 我们先从简单的图像加、减、逻辑运算开始介绍。后续会有…...
创建ABAP数据库表和ABAP字典对象-使用已存在的数据元素增加城市字段04
基于内置域增加一个字段 1.在编辑器中,输入字段的名称,后跟冒号:city:。暂时忽略这个错误。2. 输入/MOC/C并使用自动补全(**Ctrl空格**),输入类型。3. 然后添加一个分号:city: /moc/city;4.在SAP GUI中查看,字段已经新增...
Centos7上安装 Node.js
文章目录 一、前言二、步骤三、涉及nodejs,centos还是少用吧 一、前言 centos7安装nodejs如果直接安装较高版本会包错误,无法运行npm node: /lib64/libm.so.6: version GLIBC_2.27‘ not found (required by node)二、步骤 网上说的下载升级编译器的方…...
栈及其栈的模拟实现和使用
1. 栈(Stack) 1.1 概念 栈 :一种特殊的线性表,其 只允许在固定的一端进行插入和删除元素操作 。进行数据插入和删除操作的一端称为栈顶,另一端称为栈底。栈中的数据元素遵守后进先出LIFO ( Last In First Out )的原则…...
HarmonyOS开发:开源一个刷新加载组件
前言 系统Api中提供了下拉刷新组件Refresh,使用起来也是非常的好用,但是风格和日常的开发,有着巨大的出入,效果如下: 显然上面的效果是很难满足我们实际的需求的,奈何也没有提供的属性可以更改,…...
XSSFWorkbook读取模板,批量填充并导出文件
1、pom文件导入 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.0</version> </dependency> <dependency><groupId>org.apache.poi</groupId><artifactId>…...
Lazada新店运营秘籍自养号测评技术
跨境行业的前途虽然大好,但要想真正从中分一杯羹并非易事。东南亚市场前景大好,而作为其主流在线购物网站之一,Lazada吸引了众多卖家和买家。作为新手来说,注册好Lazada之后,店铺下一步该怎么做呢?赶紧来看…...
python:逐像素处理遥感数据时间序列数据(求时间序列最大值、最大值所对应的索引、最大值所在的时间)
作者:CSDN @ _养乐多_ 本文记录了使用gdal、ras、numpy 库实现遥感时间序列数据逐像素处理的代码。并以求NADVI时间序列最大值为例。代码可扩展到其他多种对时间序列的处理,比如MK趋势分析,求时间序列中值、众数、标准差、和,时间序列拟合、异常检测、机器学习预测等多种应…...
ESP32/ESP8266固件备份全攻略:esptool与flash_download_tool实战详解
1. 项目概述:为什么我们需要备份ESP32/8266的固件? 在嵌入式开发或者物联网项目中,ESP32和ESP8266这两款芯片的应用已经非常普遍了。无论是做智能家居、数据采集还是各种DIY小玩意儿,我们经常会在上面编写和烧录固件。但不知道你…...
APT32F110 RTC实战:从配置校准到低功耗应用全解析
1. 项目概述与核心价值最近在捣鼓爱普特APT32F110这块开发板,发现它内置的RTC(实时时钟)模块挺有意思。对于很多嵌入式项目来说,时间戳记录、定时唤醒、低功耗运行这些功能都离不开一个靠谱的RTC。APT32F110作为一款主打高性价比和…...
别再重复造轮子了!这个开源论坛小程序(Java+Uniapp)一套代码搞定 App/小程序/H5/PC,私域流量神器
你是否有过这些想法? 我想做个类似“知识星球”的圈子小程序,但外包报价动辄 5 万起…… 公司要做私域社区,需要同时支持微信小程序和 App,难道要养两个开发团队? 想靠“付费帖子 会员 打赏”变现,去哪…...
5-8倍加速:ncnn 3×3卷积模块
5-8倍加速:ncnn 33矩阵卷积模块 我把腾讯ncnn的33卷积从手工循环替换成了自己的算法(Im2Col GEMM),实测加速5到8倍。 适用于大通道数(inch≥16, outch≥32)、大分辨率特征图、服务端推理场景。小通道建议…...
RTX51实时系统中os_wait延时问题与解决方案
1. RTX51实时系统中的os_wait延时问题解析在嵌入式开发领域,RTX51作为经典的实时操作系统内核,广泛应用于8051系列微控制器的任务调度。最近我在调试一个需要精确延时的项目时,遇到了一个看似简单却容易踩坑的问题:os_wait(K_TMO,…...
量子纠错码与硬件定制逻辑门的优化实现
1. 量子纠错码与硬件定制逻辑门概述量子纠错码(QECC)是容错量子计算的核心组件,其核心思想是通过编码将量子信息分布在多个物理量子比特上,利用稳定子(stabilizer)测量来检测和纠正错误。在众多QECC中&…...
量子计算与人工智能融合:技术原理与应用前景
1. 量子计算与人工智能融合的技术全景量子计算与人工智能(AI)的交叉领域正在重塑计算技术的边界。作为一名长期跟踪量子计算发展的技术研究者,我见证了从早期理论构想到如今实验室原型机的演进历程。量子计算利用量子比特的叠加与纠缠特性&am…...
hccl:昇腾 NPU 的“多卡通信库”
hccl:昇腾 NPU 的“多卡通信库” 之前帮朋友看多 NPU 训练的代码,发现他自己手写了很多通信算子(AllReduce/Broadcast/AllGather 等)——在多 NPU 之间传数据,光写通信层就写了 3,000 行,而且还不稳定&…...
原神祈愿数据分析终极方案:genshin-wish-export架构革命与效能倍增
原神祈愿数据分析终极方案:genshin-wish-export架构革命与效能倍增 【免费下载链接】genshin-wish-export Easily export the Genshin Impact wish record. 项目地址: https://gitcode.com/GitHub_Trending/ge/genshin-wish-export 你是否曾在多设备间苦苦同…...
本地视频怎么去水印?2026本地视频去水印软件推荐与方法合集
不少朋友都会碰到一个烦恼:从抖音、快手、小红书下载的视频都带着水印,自己录制的视频也会被社交平台自动添加水印。想要去掉这些水印用于素材库或后期编辑,却不知道该怎么办。别急,今天就给你盘点2026年最实用的本地视频去水印方…...
