- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我之前问过这个,但是没有人回答所以修改我的问题。我试图分析这些代码,但对我来说没有意义。这次希望有人给我一个想法或纠正我的误解。
char * p
指向 command
数组在通过几个函数后被类型转换为 CMD_BLOCK *
。
extern CHGR_CMD command[96]
+---+---+---+---+
(CMD_BLOCK *(char *p)) -> | CHGR_CMD | command[0]
+---+---+---+---+
| CHGR_CMD | command[1]
+---+---+---+---+ ....
| .... | command[95]
+---+---+---+---+
这里是CMD_BLOCK
和 union CHGR_CMD
的结构
typedef struct cmd_block {
struct cmd_block *next;
short type;
short unused;
CHGR_CMD c; //Union
} CMD_BLOCK;
typedef union chgr_cmd {
NET_HDR n; //struct
CHGR_SC_SETUP su;//struct
CHGR_SC_START st;//struct
CHGR_SC_STOP sp;//struct
....
} CHGR_CMD;
cmd_init()
中使用了以下变量
#define CMD_OFFSET (sizeof(struct cmd_block *) + 2*sizeof(short))
block_size = sizeOf(CHGR_CMD)
size = 96*sizeOf(CHGR_CMD)
特别是,我没有得到下面的 for 循环:
int cmd_init(register char* p, register long size, int block_size)
{
int i;
if((size <= 0) || (block_size <= 0) || (block_size > size))
return(-1);
cmd_out_head = NULL;//extern var
cmd_out_tail = NULL;//extern var
cmd_free_space = NULL;//extern var
block_size += CMD_OFFSET;// turn to be size of CMD_BLOCK
cmd_blocks_free = 0;
cmd_blocks_used = 0;
for(i=0; size >= block_size; size-=block_size, i++, p+=block_size) {
((CMD_BLOCK *)(p))->next = cmd_free_space;
cmd_free_space = (CMD_BLOCK *)(p);
cmd_blocks_free++;
}
cmd_b = NULL;
status_seq_clear();
return(i);
}
for 循环
迭代直到 96
,这是 command
数组的大小。
p+=block_size
不断增加 CMD_BLOCK
的大小 ---> 我不明白这是怎么回事? 数组的初始类型是 CHGR_CMD
并类型转换为 char *
然后另一个转换为 CMD_BLOCK *
然后增加 CMD_BLOCK
的大小for 循环??
我不确定,但假设经过几次类型转换后,命令数组的类型现在变成了 CMD_BLOCK
。
我不明白的另一件事是这段代码:
((CMD_BLOCK *)(p))->next = cmd_free_space;
cmd_free_space = (CMD_BLOCK *)(p);
好像没有联系在一起。 cmd_free_space 似乎指向数组的最后一个元素,而 * p
增加了 CMD_BLOCK
的大小。
最佳答案
关于从 char*
到 CMD_BLOCK*
的转换,如果不查看更多代码很难判断,但很可能是原始程序员想给一些不透明性p
参数,也就是说,他/她可能不想暴露函数正在接收 CMD_BLOCK
结构数组的事实。
有时会在某些 API 上使用这种不透明性,以尽量减少程序员绕过测试 API 直接操纵数据结构的可能性。
参见 here有关不透明指针的更多详细信息。
为了消除不透明性,程序员需要将不透明指针显式转换为实际传递的具体类型。这似乎是通过行 ((CMD_BLOCK *)(p))->next = cmd_free_space;
至于for
block 是做什么的,它实际上是从一个连续的CMD_BLOCK
结构数组构建一个反向链表。第一个节点的next
指针初始化为NULL
,成为链表的尾部,第二个节点的next
指针指向第一个节点依此类推,直到最后一个 block 成为列表的头部并且似乎可以通过您指出的 cmd_free_space
变量访问。
** 编辑 **为了更好地说明列表是如何构建的,我将尝试逐步完成前两次迭代。
iteration 1
State at the beginning of the iteration:
cmd_free_space is NULL;
p is pointing to the first element of the array.
Execution:
p->next = cmd_free_space; p->next becomes NULL;
cmd_free_space = p; cmd_free_space is pointing to the first element of the array
p += block_size; p is now pointing to the second element of the array
iteration 2
State at the beginning of the iteration:
cmd_free_space is pointing to the first element of the array
p is pointing to the second element of the array.
Execution:
p->next = cmd_free_space; p->next = first element of the array (link is done)
cmd_free_space = p; cmd_free_space is now pointing to the second element of the array
p += block_size; p is now pointing to the third element of the array
等等……
** 编辑结束 **
我将从 for
block 中删除 i
变量,因为它没用(它既不控制迭代次数也不索引任何内容)。
** 编辑:**我没有注意到“i”变量是从函数返回的,所以它很可能在函数之外有一个目的。该函数实际上是返回在 for 循环中实际处理的元素数。** 编辑结束 **
blocksize
是一个可变参数而不是简单的 sizeof(CMD_BLOCK)
这一事实也可能表明该函数可以使用包含的结构数组初始化链表作为第一个成员 CMD_BLOCK
结构,但它也携带额外的数据。通过将 blocksize
添加到遍历数组的指针,for
循环将有效地跳过额外的数据。
将数组初始化为链表似乎是一件奇怪的事情,但我猜想程序员需要在列表中间插入命令的灵 active ,而不必复制/移动原始数组中的元素腾出空间。
关于c - 一种Linked List但不完全理解,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22205046/
我通常从以下位置获取代码:https://www.w3schools.com .这个代码还有一个 Accordion ; 但是,当我使用链接 -> 到 Accordion 时, Accordion 不
我见过的所有 JNI 指南(例如 JNI runtime linking )都建议我将 JNI 库链接到 libjvm.so: $ gcc -I${JAVA_HOME}/include -c -o t
实现以下目标的正确 URL 格式是什么: 使用 Universal Link 在 iOS 上的另一个应用程序中打开 Google map 应用程序。 根据两个坐标设置目的地:纬度和经度,并让用户选择交
我已经查看了 Microsoft 的 MSDN 和整个网络,但我仍然无法很好地了解它是什么。 这是否意味着已完成的程序在执行期间的不同时间加载 DLL,而不是在启动时一次性加载所有 DLL? 我完全偏
我有一个看起来像这样的 css: .browse-link A:link { color: #F6CA4C; text-decoration: none; } .browse-link
当我点击“产品”链接时,它突然指向#link。我怎样才能使它的外观看起来像滚动然后转到产品?请帮帮我。 vStudy function big(x){
我想在保存之前更改从输入字段中获取的值。 params[:link]['url'] = "www.facebook.com/redbull" 现在我只想将“redbull”放入数据库。以下代码失败,因
我正在使用链表编写程序(真是一场噩梦)。 无论如何,该程序的目的是输入 8 个字符,然后让程序将字符打印回给您,并以相反的顺序打印回字符,当然是使用链表。 到目前为止我已经明白了。它有很多错误(我认为
基本上,我删除了 anchor 按钮,因此链接窗口中不应该有指向 anchor 选项的链接。 有什么方法可以删除该下拉选项 ? 最佳答案 想通了 if ( dialogName == 'link' )
我的本地(和远程)SQL SERVER 2005 管理员都声称“允许链接服务器是一个安全问题”并禁止在此处使用它们。 (哈?) 无论如何,有没有办法在没有链接服务器的情况下做类似的事情? SELE
如果我有: linkedlist1= 1,2,3,4; 和 linkedlist2= 5,6,7; 如果我调用: linkedlist2.set(0,9999) 它会更改为 linkedlist2 =
首先,如果这个问题看起来很愚蠢,我很抱歉,但我仍在学习 React 和 html。所以问题是我的 react 代码中有一个按钮标签,它为我提供了一些关于进入我提供的特定链接的逻辑。我的 Button.
我将制作一个文本 block ,这样如果您单击一个单词,它就会被词汇替代品所替换。 例如“fearful-of-cats”是“ailurophobic”的词汇替代品,因为如果您在任何文本中将后者替换为
我有以下代码 Can you click me? 目标是我可以点击“你能点击我吗”框并转到 google 并在包含 div 的任何其他地方
这是一个案例: 默认情况下,如果我点击#2、#3、#4、#5,我将被重定向到#1。 如果我想在没有 #1 激活的情况下点击输入,我该如何修复 CSS? 提前
有没有什么快速的方法可以使 :visited 链接的颜色与链接本身的颜色相同? 例如: * {color:black} a:link {color:blue} a:visited {color:inh
我读到从 iOS 9 开始,引入了通用链接。请解释深层链接和通用链接之间的区别。我的目标是,一个链接将通过邮件发送给客户。让邮件说有一个项目 A 的报价和一个链接。单击链接时 如果安装了该应用程序,则
因此我们需要对 CSS anchor 伪类使用以下顺序 a:link { color: red } a:visited { color: blue } a:hover { color
我组件的当前路径是http://localhost:3000/dashboard/questionnaire/5bf79ff4c45a150015cef7a9在这个组件里面有 Financials 如
我 rsync 目录“Promotion”包含两台具有不同目录结构的机器之间的绝对符号链接(symbolic link)。因此绝对符号链接(symbolic link)在两台机器上都不起作用。为了使它
我是一名优秀的程序员,十分优秀!