早就想写篇PID应用的文章,可是一直以来受限于自己的知识水平和能力,未能如愿。整个暑假在做一个激光电源的控制程序,核心思想又是PID控制。看来在整个控制领域,PID 的市场可是无处不在啊。
关于PID的理论分析这里不在赘述,可以在一般的资料上查到。这里主要讨论利用PID算出的结果如何转化到实际中应用。为了方便分析,这里拿个示例说明。一个温度控制系统,控制方式是开关控制,即在一个周期通过改变导通的占空比来调节输出功率,以此加热水温,调压法也是一种控制方法。根据离散后的PID公式 u(k)=Kp*e(k)+Ki*sum(e(k))+Kd*(e(k)-e(k-1)),编写对应的控制程序,这个一般很简单,关键问题就出来了,我们算出来u(k)后,怎么把u(k)变换成输出的占空比。(PID参数的确定一般根据实际调整,初值是根据大概估算得到,不在详细说明)。先来说明下我们计算出的u(k)的意义,他表示了PID控制器的控制力度,数值大,说明此时输出与设定值偏差较大,需要PID产生较大的输出去矫正输出,使其快速趋向设定值,如果值比较小,那么表示此时输出已经接近设定值了,PID调节器产生较小的输出。怎么转换成有用的占空比呢?我们可以这么做,先大概估算下,当你的系统偏差最大时,u(k)是多大,取稍小于最大值为PID的上限(该例程u(k)的最大是50,取其上限值为40),下限根据实际情况确定,这里是0,我们把实际计算出的u(k),如果其值大于上限,取上限,小于下限,取下限,处于中间的值除于上限值得到一个百分数,这个百分数就是我们要的占空比。然后根据这个占空比来计算一个固定周期多长时间导通,多长时间截止。然后拿他控制输出电路,达到控制温度的目的。
PID的计算值转换成实际的值,一般是首先选定输出的上下限,也就是一般的限幅处理,然后把中间的值作为线性变化部分输出到控制对象,也就是PID计算量大,对应的控制度就大。
如果有什么疑问,可以给我留言,我会尽可能解答
目录 什么是dockerOCI&OCFOCIOCF docker架构docker镜像与镜像仓库docker对象安装及使用dockerdocker安装docker加速 docker常用操作docker searchdocker pulldocker imagesdocker createdocker startdocker restartdocker rundocker psdocker logsdocker rmdocker execdocker infodocker inspect docker event state 什么是docker docker中的容器:
lxc --> libcontainer --> runC
OCI&OCF OCI Open Container-initiative
由Linux基金会主导于2015年6月创立
旨在围绕容器格式和运行时制定一个开放的工业化标准
包含两个规格
运行时规范(runtime-spec)
形象规范(image-spec)
OCF 打开容器格式
runC是一个CLI工具,用于根据OCI规范生成和运行容器
容器作为runC的子进程启动,可以嵌入到各种其他系统中,而不需要运行守护进程
runC是基于libcontainer构建的,同样的容器技术为数百万的Docker引擎安装提供了动力
docker提供了一个专门容纳容器镜像的站点:https://hub.docker.com
docker架构 docker镜像与镜像仓库 为什么镜像仓库名字是Registry而不是repository?在docker中仓库的名字是以应用的名称取名的。
镜像是静态的,而容器是动态的,容器有其生命周期,镜像与容器的关系类似于程序与进程的关系。镜像类似于文件系统中的程序文件,而容器则类似于将一个程序运行起来的状态,也即进程。所以容器是可以删除的,容器被删除后其镜像是不会被删除的。
docker对象 当你使用docker时,你正在创建和使用镜像、容器、网络、卷、插件和其他对象。
镜像
映像是一个只读模板,它带有创建docker容器的指令。
通常,一个映像基于另一个映像,并具有一些额外的自定义。
您可以创建自己的映像,也可以只使用其他人创建并在注册表中发布的映像。
容器
容器是映像的可运行实例。
您可以通过docker API或CLI创建、运行、停止、移动或删除容器。
您可以将容器连接到一个或多个网络,将存储连接到它,甚至根据它的当前状态创建一个新映像。
安装及使用docker docker安装 [root@localhost ~]# cd /etc/yum.repos.d/ [root@localhost yum.repos.d]# curl -o docker-ce.repo https://mirrors.tuna.tsinghua.edu.cn/docker-ce/linux/centos/docker-ce.repo % Total % Received % Xferd Average Speed Time Time Time Current Dload Upload Total Spent Left Speed 100 1919 100 1919 0 0 3748 0 --:--:-- --:--:-- --:--:-- 3740 [root@localhost yum.
冒泡排序 排序的效果图 解法 当前解法为升序
冒泡排序的特点,是一个个数进行处理。第i个数,需要与后续的len-i-1个数进行逐个比较。
为什么是 `len-i-1`个数?
因为数组末尾的i个数,已经是排好序的,确认位置不变的了。
为什么确认位置不变,因为它们固定下来之前,已经和前面的数字都一一比较过了。
function bubbleSort(arr){ const len = arr.length; for(let i = 0; i < len - 1; i++){ for(let j = 0; j < len - i - 1; j++){ if(arr[j] > arr[j+1]){ const tmp = arr[j+1]; arr[j+1] = arr[j]; arr[j] = tmp; } } } return arr; } 快速排序 概要 快速排序,使用的是分治法的思想。
通过选定一个数字作为比较值,将要排序其他数字,分为 >比较值 和 <比较值,两个部分。并不断重复这个步骤,直到只剩要排序的数字只有本身,则排序完成。
效果图 解法 function quickSort(arr){ sort(arr, 0, arr.
IDE 本来好好的,但是后来突然间闪退,然后发现再也打不开,本想着重新下载一个 安装包,然后删除原本的,就可以打开,后来发现还是不行。
大概的错误信息可以双击一下studio
/Applications/Android Studio.app/Contents/MacOS/studio 然后会显示出大概
Last login: Sat Nov 13 09:11:44 on ttys002 xx@xxMacBook-Pro ~ % /Applications/Android\ Studio.app/Contents/MacOS/studio ; exit; 2021-11-13 09:18:19.381 studio[1819:30514] allVms required 1.8*,1.8+ 2021-11-13 09:18:19.383 studio[1819:30518] Current Directory: /Users/xx 2021-11-13 09:18:19.383 studio[1819:30518] fullFileName is: /Applications/Android Studio.app/Contents/bin/studio.vmoptions 2021-11-13 09:18:19.383 studio[1819:30518] fullFileName exists: /Applications/Android Studio.app/Contents/bin/studio.vmoptions 2021-11-13 09:18:19.383 studio[1819:30518] Value of STUDIO_VM_OPTIONS is (null) 2021-11-13 09:18:19.383 studio[1819:30518] Processing VMOptions file at /Applications/Android Studio.app/Contents/bin/studio.vmoptions 2021-11-13 09:18:19.383 studio[1819:30518] Done 2021-11-13 09:18:19.
问题分析 要想知道这个问题为什么会产生,首先还是应该搞明白单页面应用与Vue-router的本质:
什么是单页面应用(SPA)
单页面应用(Single Page Web Application)的本质其实就是一个外壳页面加上不同的页面组件(也就是构成页面本体的不同片段)。与传统的多页面应用(MPA,Multiple Page Web Application)每次跳转都是一次HTTP请求不同,单页面应用的页面跳转只是页面的局部刷新——使用JavaScript等操作DOM的工具将页面的一部分显示或者隐藏,达到“看起来像是页面跳转了”的效果。
vue-router本来是使用“hash模式”(也就是url前面有个“#”,这个部分不改变页面就不会重新加载)的,但是为了美观和与我们以往的经验相同,可以使用“history模式”去掉这个“#”,这样我们看到的单页面应用的url就和多页面应用的url相差无几了。
正因为没有使用“hash模式”,所以url跟正常的多页面应用的url一模一样。当输入url、刷新页面时这个虚假的url也会被后端解析,但它的本质只是与页面不同组成部分之间的映射关系,所以肯定是不可能真正存在于服务器上的,被后端解析之后,返回404 Not Found也就不是奇怪的事情了。
解决方法 配置后端时,除了接口之外,无论我们请求什么,都返回原来的index.html就可以
from django.contrib import admin from django.urls import path, re_path from django.views.generic import TemplateView urlpatterns = [ path('admin/', admin.site.urls), path('', TemplateView.as_view(template_name='index.html')), re_path(r'.*', TemplateView.as_view(template_name='index.html')) ] 这样做又会引来新的问题:无论我们访问什么都不返回404了。
这个问题也不难解决,开发一个专门的404组件,并且在vue-router里配置一下:在配置完所有的url之后,配置上这个404组件。
转载请标明出处:http://blog.csdn.net/donkor_/article/details/124859100
文章目录 前言Array对象数组属性Array 对象方法forEach与map的区别相同点不同点forEach()使用场景map()使用场景 find与filter区别 前言 在JavaScript开发中,JavaScript对象包含Array对象,Boolean对象,Date对象,Math对象,Number对象,String对象,RegExp对象,全局属性与函数,运算符,Error。Array对象在开发过程中比较常用。以下将针对该对象进行讲解分析。
Array对象 Array 对象用于在变量中存储多个值,
在存储的过程中,数据类型可以不同。
当然第一个数组元素的索引值为 0,第二个索引值为 1,以此类推。
例:var cars = ["aa", "bb", "cc"]; 例:var cars = ["aa", "bb", 1]; 例:var cars = ["aa", true, 1]; 要不,尝试一下>
数组属性 属性描述constructor返回创建数组对象的原型函数length设置或返回数据元素的个数prototype允许你向数组对象添加属性或方法 Array 对象方法 方法描述concat()连接两个或更多的数组,并返回结果。copyWithin()从数组的指定位置拷贝元素到数组的另一个指定位置中。entries()返回数组的可迭代对象。every()检测数值元素的每个元素是否都符合条件。fill()使用一个固定值来填充数组。filter()返回符合传入测试(函数)条件的数组元素。find()连接两个或更多的数组,并返回结果。findIndex()返回符合传入测试(函数)条件的数组元素索引。forEach()数组每个元素都执行一次回调函数。from()通过给定的对象中创建一个数组。includes()判断一个数组是否包含一个指定的值。indexOf()搜索数组中的元素,并返回它所在的位置。isArray()判断对象是否为数组。join()把数组的所有元素放入一个字符串。keys()返回数组的可迭代对象,包含原始数组的键(key)。lastIndexOf()搜索数组中的元素,并返回它最后出现的位置。map()通过指定函数处理数组的每个元素,并返回处理后的数组。pop()删除数组的最后一个元素并返回删除的元素。push()向数组的末尾添加一个或更多元素,并返回新的长度。reduce()将数组元素计算为一个值(从左到右)。reduceRight()将数组元素计算为一个值(从右到左)。reverse()反转数组的元素顺序。shift()删除并返回数组的第一个元素。slice()选取数组的一部分,并返回一个新数组。some()检测数组元素中是否有元素符合指定条件。sort()对数组的元素进行排序。splice()从数组中添加或删除元素。toString()把数组转换为字符串,并返回结果。unshift()向数组的开头添加一个或更多元素,并返回新的长度。valueOf()返回数组对象的原始值。 forEach与map的区别 相同点 都是循环遍历数组中的每一项每次执行匿名函数都支持三个参数,参数分别为item(当前每一项),index(索引值),arr(原数组)匿名函数中的this都是指向window只能遍历数组 不同点 map()会分配内存空间存储新数组并返回,forEach()不会返回数据forEach()允许callback更改原始数组的元素。map()返回新的数组 forEach()使用场景 并不打算改变数据的时候,而只是想用数据做一些事情 ,比如存入数据库或则打印出来
var arr = [0,2,4,6,8]; var newArr = arr1.forEach(function(item,index,arr1){ arr[index] = item/2; },this); document.write(arr); document.write(newArr); 输出结果
0,1,2,3,4 undefined map()使用场景 适用于你要改变数据值的时候。不仅仅在于它更快,而且返回一个新的数组
var arr = [0,2,4,6,8]; var newArr = arr.
目录 安装pg数据库pg数据库主从配置从库安装安装停掉从库准备data目录root用户下修改权限同步主库的数据文件创建recovery.conf文件修改从库postgresql.conf文件启动从库 主从复制测试 安装pg数据库 环境:
OS:CentOs 7
Postgres-11.2 源码编译
[root@localhost ~]# wget https://ftp.postgresql.org/pub/source/v11.2/postgresql-11.2.tar.gz --no-check-certificate --2022-05-06 11:30:27-- https://ftp.postgresql.org/pub/source/v11.2/postgresql-11.2.tar.gz 正在解析主机 ftp.postgresql.org (ftp.postgresql.org)... 147.75.85.69, 72.32.157.246, 217.196.149.55, ... 正在连接 ftp.postgresql.org (ftp.postgresql.org)|147.75.85.69|:443... 已连接。 警告: 无法验证 ftp.postgresql.org 的由 “/C=US/O=Let's Encrypt/CN=R3” 颁发的证书: 颁发的证书已经过期。 已发出 HTTP 请求,正在等待回应... 200 OK 长度:25779561 (25M) [application/octet-stream] 正在保存至: “postgresql-11.2.tar.gz” 100%[=======================>] 25,779,561 6.26MB/s 用时 5.0s 2022-05-06 11:30:33 (4.96 MB/s) - 已保存 “postgresql-11.2.tar.gz” [25779561/25779561]) [root@localhost ~]# 安装依赖包
yum -y install readline yum -y install gcc yum -y install -y readline-devel yum -y install zlib-devel 编译安装
参考 astype()函数 - 云+社区 - 腾讯云
astype()函数可用于转化dateframe某一列的数据类型
如下将dateframe某列的str类型转为int,注意astype()没有replace=True的用法,想要在原数据上修改,要写成如下形式。
注意只有当该列的字符串全是由纯数字构成时才可以这样写,如果混有字母,会报错:ValueError: invalid literal for int() with base 10:
利用int()函数转字符串也类似
app_train[['uid','index']] = app_train[['uid','index']].astype('int') isdigit()用于判断一个字符串是否由纯数字构成,如果是返回True,否则False。
环境: Win 10专业版
HP台式机
问题描述: 安装IE11失败错误代码0x80070490,点击“添加功能”,找到 Internet Explorer 11 进行添加,安装失败
解决方案: 1.sfc /scnanow 扫描修复(未解决)
2.扫描计算机中系统映像文件与官方系统文件不一致的情况:Dism /Online /Cleanup-Image /ScanHealth(未解决)
查看映像文件损坏的程度。如果映像文件可以修复,修复系统映像文件:Dism /Online /Cleanup-Image /CheckHealth(未解决)
修复系统映像文件:DISM /Online /Cleanup-image /RestoreHealth(未解决)
3.在 PowerShell 中执行如下命令来卸载 IE11:
Disable-WindowsOptionalFeature -FeatureName Internet-Explorer-Optional-amd64 -Online -NoRestart (未解决)
4.重新新建一个本地管理员账号,登陆新账号,看下是否正常:
鼠标右键单击开始菜单→Windows PowerShell (管理员),输入:
(WIndows11中可能显示Windows 终端(管理员))
net user Pondsi 666 /add
(按下Enter键)
(PK是新建账户名字,666是密码,可以自行设置希望的名字和密码,注意空格)
net localgroup administrators PK /add
(按下Enter键)
(赋予该账号管理员权限,注意此处PK是名字,需要和上述命令中的名字保持一致)
重启电脑登陆新账号
(未解决)
5.按Windows+X键,选择命令提示符(管理员)
输入命令进行卸载Internet Explorer 11:
FORFILES /P %WINDIR%\servicing\Packages /M Microsoft-Windows-InternetExplorer-*11.*.mum /c "cmd /c echo Uninstalling package @fname && start /w pkgmgr /up:@fname /norestart"
一、安装dev tools 使用anaconda新建一个虚拟环境,假设叫openvino,使用这个虚拟环境下载页我的选择是这样的,安装命令在最下面,如果出现超时问题,可以再加一个--default-timeout=10000安装结束后,可以用mo -h检验一下 二、模型下载和转换 以yolox-tiny为例omz_downloader --name yolox-tiny -o /home/lwd/Downloadsomz_converter --name yolox-tiny -d /home/lwd/Downloads -o /home/lwd/Downloads 如果转换自己的模型,可能会出现类别数不等的问题,需要修改/home/lwd/anaconda3/envs/openvino/lib/python3.6/site-packages/openvino/model_zoo/models/public/yolox-tiny/model.py中的类别数,这个文件在报错信息里有。 转换后的模型在/home/lwd/Downloads/public/yolox-tiny的F16和F32中,他俩是不同的precision查看模型信息:omz_info_dumper --name yolox-tiny评估模型:benchmark_app -m /home/lwd/Downloads/public/yolox-tiny/F16/yolox-tiny.xml -api sync 安装OpenVINO Runtime 还是前面的虚拟环境和下载页我的选择是这样的点击download下载l_openvino_toolkit_p_2022.1.0.643_offline.sh进入下载目录sudo chmod 777 l_openvino_toolkit_p_2022.1.0.643_offline.sh./l_openvino_toolkit_p_2022.1.0.643_offline.sh默认会安装在用户目录下,intel文件夹cd intel/openvino_2022/install_dependenciessudo -E ./install_openvino_dependencies.sh使用前记得source intel/openvino_2022/setupvars.sh 参考 官网安装
模型下载与转换
Morris遍历二叉树: 指针建立:左子树最右结点指向当前结点,第二次访问该结点时还原,指向null
结点访问过程:
Morris算法流程: 1.如果当前结点没有左树,则当前结点右移,如果也没有右树,则右移后当前结点为空,直接退出 2.当前结点有左树时,遍历到左树的最右结点. 2.1 如果是第一次来到左子树最右结点,则将其右指针指向cur结点,cur左移(一次性将左子树上的回溯指针建立好) 2.2 如果第二次来到左子树最右结点,则将指针还原为空。cur右移(该左树已访问完成,继续到右树上遍历) 代码: 参靠左神代码编写:
#include <iostream> #include <queue> using namespace std; struct Node { int value; Node *left; Node *right; Node() : value(0), left(nullptr), right(nullptr) {} Node(int a) : value(a), left(nullptr), right(nullptr) {} Node(int a, Node *p1, Node *p2) : value(a), left(p1), right(p2) {} }; //初始化二叉树 Node *Initial_Tree(queue<int> &qu) { int data = qu.front(); qu.pop(); if (data == -1) { return nullptr; } Node *head = new Node(data); head->left = Initial_Tree(qu); head->right = Initial_Tree(qu); return head; } //先序遍历 void morris_pre(Node *head) { if (head == nullptr) { return; } Node *cur = head; //当前结点 Node *most_right = nullptr; //左子树最右结点 while (cur !
在计算机中,ELF文件是一种主要用于二进制,可执行文件,目标代码格式的文件,
ELF文件主要由四个部分组成 1.ELF头(ELF header),2.程序头表(Program header),3.节(Section),4节头表(Section header table)。
ELF文件头
#define EI_NIDENT 16
typedef struct{
unsigned char e_ident[EI_NIDENT];
Elf32_Half e_type;
Elf32_Half e_machine;
Elf32_Word e_version;
Elf32_Addr e_entry;
Elf32_Off e_phoff;
Elf32_Off e_shoff;
Elf32_Word e_flags;
Elf32_Half e_ehsize;
Elf32_Half e_phentsize;
Elf32_Half e_phnum;
Elf32_Half e_shentsize;
Elf32_Half e_shnum;
Elf32_Half e_shstrndx;
}Elf32_Ehdr;
e_ident作为开头主要用装一些标示信息,固定值来判断ELF文件的合法性,其开头4个字节固定为0x7f, ELF三个字符。
e_type是用来标志文件类型的比如有1.可重定位文件,2.可执行文件,3.共享目标文件。
e_machine来用标志运行文件的机器类型,
e_version表示文件的版本
e_entry 程序的入口的虚拟地址,作为执行文件可以作为执行向量地址
e_phoff 表示程序表头相对于文件头的偏移量
e_shoff 表示节头表相对于文件头的编移量
e_flags 与文件相关的,特定处理器的标志
e_ehsize 表示ELF头部的大小(单位字节)
e_phentsize 表示每个程序头表条目大小(单位字节)
e_phnum 表示有多少个程序头条目
e_shentsize 表示每个节头表的条目大小 e_shnum 表示有多少个节头表条目
e_shstrndx 包含节名称的字符串,作为一个符号表
e_phoff 的作用
Mybatis获得字段部分值为null: 使用MyBatis获取数据库数据时,封装为对象,但是得到的对象有的属性值为null,如图:
原因分析: 在mybatis-config.xml里面设置驼峰命名转换, “goods_id----->goodsId”,
让数据库字段值,和entity实体类字段值匹配,下划线变成驼峰命名转换.这样就和自己实体类中设置的字段一致了.
<configuration> <settings> <setting name="mapUnderscoreToCamelCase" value="true"/> </settings> </configuration>
VTK绘制三维图像 一、程序框架二、使用方式参考资料 一、程序框架 基于VTK开发包,编写了一个用于显示三维图像的函数,主要用于调试过程中显示三维医学图像的语义信息。流程图如图1-1所示,代码详见github仓库,给个star再走哩!
github仓库链接 HappySleeepy的仓库
二、使用方式 def plot_3D(_img, setting_color='silver', Spacing=None) 函数有三个输入参数:_img、setting_color和Spacing
参数 _img: 用于绘制的三维数据。注意,输入要求是numpy数组,数据类型为np.uint8,取值为255或0(表示前景或背景) setting_color : 设置前景颜色,默认为"silver",可设置为"red"、“green"和"blue” Spacing:设置原始图像采样间距,默认为None,当不为None时,会对原图像进行重采样,将采样间距统一为[1.0, 1.0, 1.0]. 注意,要求输入数据为numpy数据 环境要求 numpy scipy Simpleitk vtk 安装
pip install Plot-3D-Medical-Image 使用实例
from Medical_Image_Plot import plot_3D import numpy as np # 自定义几何体 image = np.zeros((64, 64, 64), dtype=np.uint8) for i in range(64): image[i, i:64-i, i:64-i]=255 # 调用库绘制三维图像 plot_3D(image) 效果图
图2-1 3D绘制效果图 参考资料 1: MedicalDemo1
2: VTKWithNumpy
3: 发布自定义Python开发包
本文按照mars3d提供的在线例子,自己实现了类似功能。
模型的拆解其实是将模型组装的各个部分模块以延迟动画方式进行位置重置,从而能够单独浏览,更直观的看到内部结构。
实现思路很简单
1、模型的加载
使用primitives 加载模型
2、通过modelMatrix控制位置
直接上代码,可根据实际需求自行扩展。
JS
/* * @Descripttion: * @version: * @Author: xiongz * @Date: 2022-05-12 11:31:46 * @LastEditors: Please set LastEditors * @LastEditTime: 2022-05-12 19:37:04 */ /// // 模块描述:房屋模型移动拆分 /// define([ "dojo/_base/declare", "dojo/_base/lang", 'dojo/_base/html', "dojo/_base/fx", 'jimu/BaseWidget', ], function ( declare, lang, html, fx, BaseWidget ) { return declare("jimu.widget.ModelSplit", [BaseWidget], { baseClass: "jimu-widget-ModelSplit", name: 'ModelSplit', models: [], point: null, timers: [], floorCount: 6, floorScale: 1, floorHeight: 3, // 不缩放情况下楼层高度 point: { lng: 115.
1.二叉树的前序遍历 题目:给你二叉树的根节点 root ,返回它节点值的 前序 遍历。
输入:root = [1,null,2,3]
输出:[1,2,3]
这个前序遍历和前文自己写的遍历的不同点:他的返回值是一个List集合,需要用到动态数组来保存元素,而不是简单的打印。
这道题的数组创建要变为成员变量,不能放在方法中,要不每次递归的时候都会开辟一个子数组,答案就不对了
class Solution { //要注意一点,在leetcode上做题,成员变量和方法不能使用static关键字 List<Integer> list = new ArrayList<>(); public List<Integer> preorderTraversal(TreeNode root) { if (root == null){ return list; } //先根 list.add(root.val); //递归访问左子树 preorderTraversal(root.left); //递归访问右子树 preorderTraversal(root.right); return list; } } 2.二叉树的中序遍历 给定一个二叉树的根节点 root ,返回 它的 中序 遍历 。
输入:root = [1,null,2,3]
输出:[1,3,2]
和前序遍历类似
class Solution { List<Integer> list = new ArrayList<>(); public List<Integer> inorderTraversal(TreeNode root) { if (root == null){ return list; } inorderTraversal(root.
1.迭代器
2.C++11 新增关键字auto
3.数组遍历法
4.基于范围的for循环
5.利用成员函数 at()进行访问
注意:[]与at()既可以取值也可以赋值,但是建议用at(),因为超出索引会报错,但是要牺牲性能的损耗
#include <vector> #include <iostream> using namespace std; int main() { vector<int>obj; for(int i=0;i<10;i++) { obj.push_back(i); cout<<obj[i]<<","; } cout << endl << "vector size is :" << obj.size() << endl; //iterator遍历 for(vector<int>::iterator it = obj.begin(); it != obj.end(); it++) { cout << *it << ","; } cout << endl; //数组循环遍历 for(int i=0;i<obj.size();i++) { cout<<obj[i]<<","; } cout << endl; //基于at()成员函数的遍历 for(int i=0;i<obj.size();i++) { cout<<obj.
主要针对一些使用较多、但本人并不十分清楚其作用的stm32官方.c/.h文件进行系统的梳理。贴上官网标准库下载地址(操作如下图),或是直接下载这个附件。
目录 简介工程目录1、misc.c/h2、startup_stm32f10x_hd.s3、system_stm32f10x.c/h5、stm32f10x_conf.h6、stm32f10x_it.c/h7、core_cm3.c/h8、stm32f10x.h9、stm32f10x_xx.c/.h 简介 首先要搞清楚文件之间的关系。上图。
打开固件库文件。Libraries 文件夹下面有CMSIS和 STM32F1xx_StdPeriph_Driver 两个目录,这两个目录包含固件库核心的所有子文件夹和文件。
Libraries
1)CMSIS存放的是符合CMSIS规范的文件。包括STM32F1核内外设访问层代码,DSP 软件库,RTOS API,以及 STM32F1 片上外设访问层代码等。
2)STM32F1xx_StdPeriph_Driver放的是 STM32F1 标准外设固件库源码文件和对应的头文件。inc 目录存放的是 stm32f1xx_ppp.h 头文件,无需改动。src 目录下面放的是 stm32f1xx_ppp.c 格式的固件库源码文件。每一个.c 文件和一个相应的.h 文件对应,每个外设对应一组文件。
***Project ***
1)STM32F1xx_StdPeriph_Examples 文件夹下面存放的的 ST 官方提供的固件实例源码,日后开发可修改这个官方提供的实例来快速驱动自己的外设。
2)STM32F1xx_StdPeriph_Template 文件夹下面存放的是工程模板。
Utilities
存放官方评估板的对应源码。
CMSIS共三层:核内外设访问层Core Peripheral Access Layer(CPAL),中间件访问层Middleware Access Layer(MWAL),设备访问层Device Peripheral Access Layer(DPAL)。
CPAL用于访问内核的寄存器和组件,如NVIC,调试系统等。
MWAL用于对中间件的访问。
DPAL用于定义一些硬件寄存器的地址和一些外设访问函数。由芯片制造商实现。
CPAL层的实现——Core_cm3.c文件,DPAL层的实现——system_stm32f10x.c文件
STM32全部的标准外设名称如下表所示。
工程目录 比较喜欢这样建工程
1、STARTUP----启动文件 startup_stm32f10x_hd.s 2、CMSIS------CMSIS标准文件 core_cm3.h 内核功能定义 system_stm32f1xx.c 系统,c文件 system_stm32f1xx.h 系统.h文件 stm32f10x.h 头文件 3、FWLIB------库文件 misc.c/.h stm32f10x_rcc.c/.h 库函数源文件及对应头文件 stm32f10x_gpio.c/.h .... 4、HARDWARE---外设文件 oled、key文件.
链表——《C语言程序设计》浙江大学mooc翁恺 从数组到链表一、可变长度数组缺点:二、指针复习 理解最初的链表一、理解最初的链表二、 链表的函数 链表的基本操作 从数组到链表 代码和思路来自中国大学慕课网站的《数据结构》——浙江大学,翁恺老师的公开课程。学数据结构的时候总是学不明白链表,而可变长度数组的学习有助于后面链表的学习,来总结一下。
非常啰嗦的一篇笔记开始了
一、可变长度数组 数组按道理都是不可变长度,这里也不是说真的能让数组一会儿长一会儿短,而是通过自定义结构体和函数实现让人直观感受无需声明新的长度数组来实现数组长度的变化。这里特别注意要和链表区分开。
图示:
(将数组a增长为a’)
函数:
//the interface:
Array array_create(int init_size);//初始化
void array_free(Array *a);//释放
int array_size(const Array a);//数组大小计算
int array_at(Array *a, int index);//访问数组某个位置的元素
void array_inflate(Array *a,int more_size);//变长
结构体:
typedef struct {
int size;
int* array;
}Array;
函数和结构体的声明放在array.h文件中
array.h
//可变长度数组代码练习 //《C语言程序设计(mooc)》 浙江大学 翁恺 #ifndef _ARRAY_H_ #define _ARRAY_H_ typedef struct { int size; int* array; }Array; //the interface: Array array_create(int init_size);//初始化 void array_free(Array *a);//释放 int array_size(const Array *a);//数组大小计算 int* array_at(Array *a, int index);//访问数组某个位置的元素 void array_inflate(Array *a,int more_size);//变长 #endif **
项目场景: 提示:这里简述项目相关背景:
解决latex 出现 File ended while scanning use of \BR@@bibitem.
问题描述 提示:这里描述项目中遇到的问题:
latex出现 File ended while scanning use of \BR@@bibitem.
原因分析: 可能是出现了文字溢出
解决方案: 要在\begin{document}后加上\begin{sloppypar}
\begin{document}
\begin{sloppypar}
内容
\end{sloppypar}
\end{document}
如: