objectArx --- ADS篇
目录
- 一、基本概念
- 1.1 基本定义
- 1.2 关键类型
- 二、数据类型
- 2.1 ads数据类型
- 2.2 类型转换
- 2.2.1 浮点数 与 字符串
- 2.2.2 角值 转换
- 2.2 结果缓冲区
- 2.2.1 定义
- 2.2.2 结果类型码
- 2.2.3 简单使用
- 2.2.4 链表命令
- 三、用户交互
- 3.1 函数返回码
- 3.2 常用
- 3.3 acedGetXXX函数
- 3.3.1 常规
- 3.3.2 acedInitGet
- 3.3.3 选择实体
- 3.4 选择集
- 3.4.1 常用函数
- 3.4.2 acedSSGet函数详解
- 四、系统变量
一、基本概念
1.1 基本定义
- ADS:autocad design system 简称,早期CAD面向过程编程系统,现在整合入objectarx中
- 功能:对CAD全局参数编辑,提供与用户交互函数,头文件:adslib.h、adsdlg.h,默认已加入
1.2 关键类型
类型定义
类型名 特性 对象id
AcDbObjectId在一个CAD进程中管理多个CAD文件,所有打开的数据库对象在内存中都有唯一的id,每个对象在每次加载后id值都不同,此对象是以下各类型的中介 实体名
ads_name为ADS存储实体对象的临时变量,关闭文件即丢失,此对象通常用来接收用户选择实体或选择集 句柄
AcDbHandle数据库文件dwg真实标记实体的数据类型,每次打开文件,同一实体,句柄不变 转换关系
二、数据类型
2.1 ads数据类型
- 包含:浮点型、整型、字符串、点、实体名
- 代码
// 整形 int num = 5; // 打印写法:跟C语言printf一样 acutPrintf(_T("%d\n"), num);// 浮点型:typedef double ads_real; ads_real r1=3.14; acutPrintf(_T("%0.3f\n"), r1);// 字符串型:以下二者可相互转换 ACHAR * str = _T("兼容性最好\n"); CString cstr = _T("此类为mfc项目默认字符串,函数更友好\n"); acutPrintf(str); acutPrintf(cstr);// 点:typedef ads_real ads_point[3]; ads_point pt1, pt2; // 三个坐标不可留空 pt1[X] = pt1[Y] = pt1[Z] = 1.0; // 点覆盖式赋值:用pt1赋值pt2 ads_point_set(pt1, pt2); acutPrintf(_T("%0.3f\n"),pt2[X]);// 实体名(由鼠标选择赋值),通常由其获得对象id // typedef int64_t ads_name[2]; ads_name en, en1; // 将en0深拷贝给en1 ads_name_set(en0, en1);
2.2 类型转换
2.2.1 浮点数 与 字符串
- 代码示例
ads_real rel = 1.23456789; ACHAR str[12]; // 浮点数转字符串:浮点数、转换模式、小数位数、待接收字符串 // 转换正常ret为RTNORM,否则见第3.1节 int ret = acdbRToS(rel, 1, 3, str); acutPrintf(str);// 字符串转浮点数:字符串、转换模式、浮点数(注意取地址符) ACHAR str_a[12]= _T("9.87654"); // ret用于存储结果类型码(本篇3.1) 判断是否正常转换:RTNORM为正常 // 转换正常ret为RTNORM,否则见第3.1节 ret = acdbDisToF(str_a,1,&rel); acutPrintf(_T("\n%f"),rel);
转换模式:
- 1科学记数法:结果为1.235E+00
- 2十进制:结果为1.235
- 3工程、4建筑:略
- 5分数:结果为1 1/4
2.2.2 角值 转换
- 弧度 转 字符串(由控制符 控制 转换格式)
// 函数acdbAngToS参数:弧度值、控制符、精度、字符串指针 // 转换正常ret为RTNORM,否则见第3.1节ACHAR str[12]; // 0弧度转角度 int ret = acdbAngToS(MathUtil::PI() / 4, 0, 4, str); // 返回:45.0000,0都省略了 acutPrintf(_T("\n%s"),str);// 1弧度转角度 ret = acdbAngToS(MathUtil::PI()/4, 1, 4, str); // 返回:45d0'0" acutPrintf(_T("\n%s"), str);// 2弧度转工程 ret =acdbAngToS(MathUtil::PI() / 4, 2, 4, str); // 返回:50g acutPrintf(_T("\n%s"), str);// 3弧度(ads_real)转弧度(字符串)(带r标识) ret =acdbAngToS(MathUtil::PI() / 4, 3, 4, str); // 返回:0.7854r acutPrintf(_T("\n%s"), str);
- 角 转 浮点数
// 函数acdbAngToF参数:字符串(弧度/角度值)、控制符、浮点数 // 转换正常ret为RTNORM,否则见第3.1节ads_real rel; // 0:百分角度 转弧度 int ret = acdbAngToF(_T("45"), 0, &rel); acutPrintf(_T("\n%.4f"),rel);// 1:度分秒角度 转弧度 ret = acdbAngToF(_T("45d0'0\""), 1, &rel); acutPrintf(_T("\n%.4f"), rel);// 2:工程 转弧度 ret = acdbAngToF(_T("50g"), 2, &rel); acutPrintf(_T("\n%.4f"), rel);// 3:弧度(带r标识) 转弧度(不含r标识) ret = acdbAngToF(_T("0.7854r"), 3, &rel); acutPrintf(_T("\n%.4f"), rel);
关系:acdbAngTo与acdbAngToS为互补函数
2.2 结果缓冲区
- 功能:CAD中数据种类多样,需要有一个进行数据临时交换与存储的媒介
2.2.1 定义
- 源文件声明
// 结果缓冲区节点为结构体 struct resbuf { // 用于构造单链表,未设置则为NULL struct resbuf *rbnext; // 用于定义ads_u_val 的类型short restype;// 联合体:用于存储具体值union ads_u_val resval; };// 联合体ads_u_val的定义 union ads_u_val {// 浮点型:常用ads_real rreal;// 点:常用ads_real rpoint[3];// 短整型:常用short rint;// 字符串:常用ACHAR *rstring;// 剩下不常用略,可以转到结果缓冲区查看 };
2.2.2 结果类型码
- 类型码列表
#define RTNONE 5000 /* 无结果 */ #define RTREAL 5001 /* 浮点型 */ #define RTPOINT 5002 /* 2D点 */ #define RTSHORT 5003 /* 短整型 */ #define RTANG 5004 /* 角度 */ #define RTSTR 5005 /* 字符串 */ #define RTENAME 5006 /* 实体名 */ #define RTPICKS 5007 /* 选择集 */ #define RTORINT 5008 /* 方向*/ #define RT3DPOINT 5009 /* 3D点 */ #define RTLONG 5010 /* 长整型 */ #define RTVOID 5014 /* 空白符号 */ #define RTLB 5016 /* 列表开始 */ #define RTLE 5017 /* 列表结束 */ #define RTDOTE 5018 /* 点对 */ #define RTNIL 5019 /* 零*/ #define RTDXF0 5020 /* DXF码,仅供ads_buildlist使用 */ #define RTRESBUF 5023 /* 结果缓冲区 */
用于指定结果缓冲区节点的值类型
- 组码:特殊的类型码,≤1071的类型码有特殊含义,传送门
2.2.3 简单使用
- 结果缓冲区链表
void test() { // 自制结果缓冲区的迭代器,提取链表每个节点resbuf* rb_iter;resbuf* cmdlist;ads_point pt1 = { 1,1,1 };int num = 3;// 函数:构建结果缓冲区链表cmdlist = acutBuildList(RTSTR, _T("test"), RTPOINT,pt1, RTSHORT,num, RTNONE);// 拷贝 链表 首节点 的 指针 给 迭代器rb_iter = cmdlist;// rb_iter的指针不为空while (rb_iter != NULL){acutPrintf(_T("结果类型码:%d\n"), rb_iter->restype);switch (rb_iter->restype){case RTSTR:acutPrintf(_T("值为:%s\n"), rb_iter->resval.rstring);break;case RTPOINT:acutPrintf(_T("值为:%f\n"), rb_iter->resval.rpoint[X]);break;case RTSHORT:acutPrintf(_T("值为:%d\n"), rb_iter->resval.rint);break;}rb_iter = rb_iter->rbnext;}acutPrintf(_T("执行完毕\n"));// 手动释放结果缓冲区acutRelRb(rb_iter);acutRelRb(cmdlist); }
- 效果
2.2.4 链表命令
- 函数用法
// 必须包含头文件 #include "acedCmdNF.h"// 模拟人工输入命令:隐式构建结果缓冲区链表 acedCommandS(RTSTR, _T("circle"), RTSTR, _T("0,0"), RTSTR, _T("300"), RTNONE);
三、用户交互
3.1 函数返回码
- 功能:用于标识函数执行情况
- 常用返回码列表(重要)
#define RTNORM 5100 /* 正常 */#define RTERROR (-5001) // 其他错误 #define RTCAN (-5002) // 用户按Ctl-C或ECS #define RTREJ (-5003) // AutoCAD拒绝的请求--无效 #define RTFAIL (-5004) // 连接失败 -- Lisp脚本可能崩溃了 #define RTKWORD (-5005) // 来自 getxxx() 的关键字 #define RTINPUTTRUNCATED (-5008) // 输入不完全适合缓冲区
3.2 常用
- 弹出警告框:
acedAlert(_T("弹出警告框"));
- 命令行打印:
acutPrintf(_T("跟C语言printf函数一样\n"));
- 捕捉离光标最近的中点、端点、中心点(最好关掉对象捕捉)
acedOsnap(pt, _T("midp,endp,center"), pt1);
,pt是传入的点,pt1是返回的点 - 遍历全图实体(包括隐藏实体)
ads_name en0, en1;// 遍历全图:首参数为null,则获取第一个元素的ads_name if (acdbEntNext(NULL, en0) != RTNORM)return; // acdbEntNext遍历链表,以首参数为参照,获取第二个参数ads_name do { // 从ads_name获取对象idAcDbObjectId id;acdbGetObjectId(id, en0);// ld 长整型acutPrintf(_T("\n对象id为:%ld"), id);// acedUsrBrk()用于判断用户是否按下esc键if (acedUsrBrk())return;// 将en0深拷贝给en1ads_name_set(en0, en1); // en1变为参考点,en0值被覆盖,从而获取下一个链表节点的ads_name } while (acdbEntNext(en1, en0) == RTNORM);
3.3 acedGetXXX函数
3.3.1 常规
获取整型:acedGetInt
// 获取整型:提示字符串、变量地址(看函数头文件) int num; if (acedGetInt(_T("\n请输入整数:"), &num) == RTNORM)acutPrintf(_T("\n整数为:%d"),num);
获取浮点数:acedGetReal
// 获取浮点数:提示字符串、变量地址 ads_real num_real; if (acedGetReal(_T("\n请输入浮点数:"), &num_real) == RTNORM)acutPrintf(_T("\n浮点数为:%0.3f"), num_real);
获取字符串:acedGetString
// 获得字符串:是否允许空格(1允许)、提示字符串、字符串指针、字符串变量长度(包括结尾\0) // 如果超出长度ret返回RTINPUTTRUNCATED,超出的字符串丢弃,正常返回RTNORM ACHAR str[6]; int ret = acedGetString(0, _T("\n请输入字符串:"), str, 6); if ( ret == RTNORM)acutPrintf(_T("\n字符串为:%s"), str); else {acutPrintf(_T("\n结果返回码为:%d"), ret); }// 字符串正则匹配函数:待校验字符串指针、匹配规则 if (acutWcMatch(str, _T("ro*b"))==RTNORM) {acedAlert(_T("此字符串匹配了定义的正则表达式")); }
获取点坐标:acedGetPoint
// 获取点坐标:是否允许空格(1允许)、提示字符串、点变量 ads_point pt; if (acedGetPoint(0, _T("\n请选取点:"), pt) == RTNORM)acutPrintf(_T("\n点为:%f,%f"), pt[X],pt[Y]);// 极坐标法获得点坐标:基点ads_point、弧度ads_real,极半径ads_real,返回点ads_point acutPolar(pt,ang, 100.0, pt3);
获取夹角弧度:acedGetAngle
// 获取与三点钟方向夹角弧度:基准点(若为NULL则在屏幕上点)、提示字符串、接收弧度值 ads_point pt_ang = { 0,0,0 }; ads_real ang; if (acedGetAngle(pt_ang, _T("\n请角度点:"), &ang) == RTNORM)acutPrintf(_T("\n角弧度为:%f"), ang);// 方法2:直接计算pt与pt1线段与x轴正向夹角弧度 ads_real ang = acutAngle(pt, pt1);
方框内角度:非弧度,会跟着十字光标动态变化
获取两点间距离:acedGetDist
// 返回屏幕上两点间距离:基准点(若为NULL则在屏幕上点)、提示字符串, ads_real distance; if (acedGetDist(NULL, _T("\n请选择点:"), &distance) == RTNORM)acutPrintf(_T("\n距离为:%f"), distance);
3.3.2 acedInitGet
功能一:循环检测用户非法输入
关键字代码:
// 过滤用户非法输入,输入符合要求才能通过,可esc退出 acedInitGet(RSG_NONEG + RSG_NOZERO + RSG_NONULL, NULL); int num; if (acedGetInt(_T("\n请输入整数:"), &num) == RTNORM)acutPrintf(_T("\n整数为:%d"),num);
控制位开关:
- 非负:RSG_NONEG ,非零 RSG_NOZERO,非空RSG_NONULL
- 开启橡皮筋或虚矩形追踪RSG_DASH
- 去掉Z坐标:RSG_2D,仅用于acedGetDist
特点:仅对紧跟着的那个acedGetXXX函数起效
功能二:关键字选项控制
// 禁止输入空,并明确关键字为以下四个(空格分隔) acedInitGet(RSG_NONULL, _T("1 2 3 4")); ACHAR kw[5]; // 这是控制关键字显示:见下面效果图 acedGetKword(_T("\n选择一个关键字[ONE(1)/TWO(2)/THREE(3)]:"), kw); switch (tc) {case RTCAN:acutPrintf(_T("\n你取消了输入"));break; case RTNORM:if (_tcscmp(kw, _T("1")) == 0){ // 可以通过关键字跳转其他程序处理后续acutPrintf(_T("\n你选择了1"));break;}else if (_tcscmp(kw, _T("2")) == 0){acutPrintf(_T("\n你选择了2"));break;}else if (_tcscmp(kw, _T("3")) == 0){acutPrintf(_T("\n你选择了3"));break;} default:break; } acutPrintf(_T("\n程序结束"));
效果
3.3.3 选择实体
- 功能:获取实体ads_name和选择点
- 代码示例
// 获取与三点钟方向夹角弧度:基准点(若为NULL则在屏幕上点)、提示字符串、接收弧度值 ads_point pt; ads_name en; if (acedEntSel(NULL, en, pt) == RTNORM)acutPrintf(_T("点选处为:%f,%f"), pt[X], pt[Y]);
- 常用函数
ads_name en1, en2; ads_point pt1, pt2;acedEntSel(NULL, en1, pt1); acedEntSel(NULL, en2, pt2);// 判断ads_name是否相等 if (acdbNameEqual(en1, en2))acutPrintf(_T("\n选择了同一个实体")); elseacutPrintf(_T("\n选择了两个实体"));// 清空ads_name值 acdbNameClear(en2); // 判断ads_name是否为空,为空则为true if (acdbNameNil(en2))acutPrintf(_T("\n清除成功"));// 用en2给en1赋值 acdbNameSet(en1,en2); if (acdbNameEqual(en1, en2))acutPrintf(_T("\n赋值成功"));
- 效果
3.4 选择集
- 定义:实体的有名集合
- 特性:
- 非互斥性:一个实体可以包含在不同选择集中
- 唯一性:多次选择一个实体,选择集中只包含一次
- 易用性:可空,可手动框选添加实体进选择集
3.4.1 常用函数
- 代码示例
// 图上框选创建选择集 ads_name en1, en2, ss1; acedSSGet(NULL, NULL, NULL, NULL, ss1);// 获得选择集长度 int len; acedSSLength(ss1, &len); acutPrintf(_T("\n初始选择集实体个数为%d"), len);// 获取 选择集 首元素 的ads_name赋值en:一般用在for循环里 acedSSName(ss1,0,en1); // 判断实体是否在选择集里 if(acedSSMemb(en1, ss1))acutPrintf(_T("\n实体在选择集中"));// 获取实体en2 acedEntSel(NULL, en2, NULL); // 将实体添加进现有选择集:第2、3参数均为选择集 acedSSAdd(en2,ss1,ss1); acedSSLength(ss1, &len); acutPrintf(_T("\n新增后选择集实体个数为%d"), len);// 从选择集中删除实体,实体还在图中 acedSSDel(en1, ss1); acedSSLength(ss1, &len); acutPrintf(_T("\n删除后选择集实体个数为%d"), len);// 释放选择集:选择集数量有上限,及时释放 acedSSFree(ss1); acutPrintf(_T("\n程序结束"));
- 效果
3.4.2 acedSSGet函数详解
- 常用
写法 注释 acedSSGet(_T("A"), NULL, NULL, NULL, ss1);
选择全部实体 acedSSGet(_T("W"), pt1, pt2, NULL, ss1);
矩形框选window:包住的、跟边线重合的实体 acedSSGet(_T("C"), pt1, pt2, NULL, ss1);
矩形叉选crossing:包住的、跟边线重合、相交的实体 - 围区点列表
点列表框选:acedSSGet(_T("WP"), pointlist, NULL, NULL, ss1); 点列表叉选:acedSSGet(_T("CP"), pointlist, NULL, NULL, ss1);
// 图上框选创建选择集 ads_name ss1; ads_point pt1 = { 0,0,0 }, pt2 = { 100,100,0 }, pt3 = { 100,0,0 }, pt4 = { 0,100,0 }; // 点列表构建 resbuf * pointlist; pointlist = acutBuildList(RT3DPOINT, pt1, RT3DPOINT, pt3, RT3DPOINT, pt2, RT3DPOINT, pt4, RTNONE); // 必须有这个,否则cad崩溃 // CP可以换成WP或F(栏选:仅选择跟边线交叉的实体), // 点列首尾自动闭合,P为Polygon acedSSGet(_T("CP"), pointlist, NULL, NULL, ss1); // 显示选择集内实体个数 int len; acedSSLength(ss1, &len); acutPrintf(_T("\n选择集内实体个数为%d"), len); // 释放选择集、释放结果缓冲区 acedSSFree(ss1); acutRelRb(pointlist); acutPrintf(_T("程序结束"));
- 过滤选择集
- 常规过滤
ads_name ss1; resbuf * filter; // 构建筛选器:RTDXF0为实体类型组码、8为图层组码、结尾要有RTNONE filter = acutBuildList(RTDXF0, _T("CIRCLE"), 8, _T("0"), RTNONE); // X 开启筛选器,filter为筛选器缓冲区指针 acedSSGet(_T("X"), NULL, NULL, filter, ss1); // 打印选择集内实体数 int len; acedSSLength(ss1, &len); acutPrintf(_T("\n选择集内实体个数为%d"), len);acedSSFree(ss1); acutRelRb(filter); acutPrintf(_T("程序结束"));
- 关系过滤 filter写法
// -4:条件运算符,40:圆半径组码(必须是100.0有小数) filter = acutBuildList(RTDXF0, _T("CIRCLE"), -4, _T(">="), 40, 100.0, RTNONE);
- 条件过滤 filter写法
// 为了好读,加了缩进:选取所有0层上的直线和所有半径为100的圆 filter = acutBuildList(// or内为或关系:内部有一个就选择-4, _T("<OR"),// and内为与关系,一个整体-4, _T("<AND"), RTDXF0, _T("LINE"), 8, _T("0"), -4, _T("AND>"),// and内为与关系,一个整体-4, _T("<AND"), RTDXF0, _T("CIRCLE"), 40, 100.0, -4, _T("AND>"),-4, _T("OR>"),RTNONE);
- 常规过滤
四、系统变量
浮点型
// 对结果缓冲区 浮点型 操作 resbuf rb, rb1; // 获取系统变量:圆角半径 acedGetVar(_T("FILLETRAD"), &rb); acutPrintf(_T("系统变量值为:%.3f"), rb.resval.rreal);// 给自定义结果缓冲区变量赋值,rb1.next默认为null rb1.restype = RTREAL; rb1.resval.rreal = 1.0;// 提取并操作系统变量值 if (rb.resval.rreal < 1.0)// 设置系统变量值:传入自定义结果缓冲区变量if (acedSetVar(_T("FILLETRAD"), &rb1) != RTNORM)return;
整型
// 对结果缓冲区 整型 操作 resbuf rb2, rb3; acedGetVar(_T("CMDECHO"), &rb2); acutPrintf(_T("\n当前的CMECHO变量的值为%d."), rb2.resval.rint); // 给自定义结果缓冲区变量赋值,rb1.next默认为null rb3.restype = RTSHORT; rb3.resval.rint = 0; if (acedSetVar(_T("CMDECHO"), &rb3) == RTNORM) {acutPrintf(_T("\n系统变量值CMDECHO,已修改,现在的值为%d"), rb3.resval.rint); } elseacutPrintf(_T("\n设置系统变量值失败!"));
字符串型
// 对结果缓冲区 字符串 操作 resbuf rb4, rb5; // 获取系统变量:字体样式 acedGetVar(_T("TEXTSTYLE"), &rb4); if (rb4.resval.rstring != NULL) { // 打印当前字体样式、随后释放结果缓冲区acutPrintf(_T("\n当前的文字样式是%s"), rb4.resval.rstring);acdbFree(rb4.resval.rstring);// 自定义结果缓冲区rb5,类型rb5.restype = RTSTR;// C语言的分配内存空间,判断分配成功// 指针自身 = (指针类型*)malloc(sizeof(指针类型)*数据数量)// mallo函数返回的实际是一个无类型指针,必须在其前面加上指针类型强制转换才可以使用if ((rb5.resval.rstring = (ACHAR *)malloc(20)) != NULL){ // 给结果缓冲区赋值_tcscpy(rb5.resval.rstring, _T("STANDARD"));// 用自定义的设置结果缓冲区acedSetVar(_T("TEXTSTYLE"), &rb5);acutPrintf(_T("\n新修改的文字样式是:%s"), rb5.resval.rstring);acdbFree(rb5.resval.rstring);}elseacedAlert(_T("内存不足!")); }
点坐标
// 对结果缓冲区点 坐标 操作 resbuf rb6, rb7; ads_real lx, ly; // 获取系统变量:当前图形最大点、最小点 acedGetVar(_T("EXTMAX"), &rb6); acedGetVar(_T("EXTMIN"), &rb7); // 结果缓冲区点提取 lx = rb6.resval.rpoint[X] - rb7.resval.rpoint[X]; ly = rb6.resval.rpoint[Y] - rb7.resval.rpoint[Y]; acutPrintf(_T("\n当前图形的水平长度和垂直长度分别为<%.3f , %.3f>"), lx, ly);
总体效果
传送门 返回 列表
objectArx --- ADS篇相关推荐
- 【3.3 ads篇(重点)】
3.3 ads篇(重点) 提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言 一.基本概念 1.1 基本定义 1.2 关键类型 二.数据类型 2.1 ads数据类型 2. ...
- [ObjectARX系列]
ObjectARX系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如: ObjectARX学习入门 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 ...
- 基于ObjectARX的DWG文件访问初探
刘兴权 尹彦(中南大学地学院GIS研究中心,湖南 长沙 410083) 摘 要 AutoCAD的DWG格式文件是其它图形软件的主要数据源,常常需要将其转换成其它格式.本文在讨论了DWG文件 ...
- ObjectARX目录页
目录页 一.环境配置 二.命令注册.表结构 三.封装代码 3.1 工具类封装 3.2 简单交互 3.3 ads篇(重点) 3.4 AcGe几何类篇 四.数据库实体类 4.1 圆.圆弧.多段线 4.2 ...
- CAD2020-objectArx开发笔记---目录
目录页 一.环境配置 二.命令注册.表结构 三.封装代码 3.1 工具类封装 3.2 简单交互 3.3 ads篇(重点) 3.4 AcGe几何类篇 四.数据库实体类 4.1 圆.圆弧.多段线 4.2 ...
- Google Ads买量基础篇:Google如何展示App广告系列
App初启动时,如果没有找到好的用户来源渠道,最简单的方式就是通过买量来实现用户增长,覆盖更多关键词并提高应用排名. 对比市面上最大的两大广告投放渠道,Google显然要比Facebook更易于操作, ...
- ARM裸机篇---启动代码分析
ARM裸机篇---启动代码分析 先搞清楚启动代码和Bootloader的区别,启动代码是指CPU复位后到进入C语言的main函数之前需要执行的那段汇编代码. 下面的代码先暂且这样吧,没啥注释的,时间关 ...
- 阿里巴巴大数据之路——数据模型篇
阿里巴巴大数据之路--数据模型篇 一.概述 1.什么是数据模型? 数据模型就是数据的组织和存储方法.主要关注的是从业务.数据存取和使用角度合理存储数据. 2.典型数据仓库建模方法论 ER模型 纬度模型 ...
- 史上最全的stm32资料库4---常见问题及编译工具篇
[常见问题解答 (Frequently Asked Questions) STM32常见问题解答(基本篇) ST-Link2使用指南 STM32 ISP 下载工具 编译工具介绍篇 1.RealView ...
最新文章
- (JAVA学习笔记) 类的继承,super,方法的重写,多态
- 直接输出代码_C语言入门 | 优秀代码(四)A—F
- python分布式框架有哪些_Python并行分布式框架Celery详解
- Android应用程序签名详解
- ffmpeg源码分析四:transcode_step函数 (转4)
- iOS开发--UITableView
- LeetCode 1844. 将所有数字用字符替换
- 指北针邮件工具 v1.5.6.1
- 字符串includes_字符串操作大全:面试准备和日常编码所需一文打尽
- idea 自动生成补全变量名 快捷键
- Cesium:去除原生自带右上角弹窗
- 11.凤凰架构:构建可靠的大型分布式系统 --- 虚拟化容器
- c++早绑定和晚绑定
- 华为电脑安装双系统linux,华为MateBook笔记本安装Win10与Ubuntu双系统
- 使用切换器导致一台电脑分辨率被降低的解决方法
- Maya如何渲染序列帧
- 字节一面不知道是不是凉经(总结千万别装逼,装逼遭雷劈)
- 声卡自动修补appleHDA,支持AMD平台
- Maven快速理解使用
- 各种英文翻译汇总(包含pdf翻译,主要针对英文论文)