- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
在一个结构中,我需要一些空间来放置一些东西。这个空间必须能够收集所有数据类型,所以我想定义一个 union 。空间限制为 n 个字节(unsigned char)。
我必须如何定义我的 union ,以便它可以包含 char、int、float 等等?
我必须这样做吗?
#define SIZE (128)
union {
unsigned char uchar[SIZE];
char schar[SIZE];
unsigned int uint[SIZE/sizeof(unsigned int)];
int sint[SIZE/sizeof(int)];
float flt[SIZE/sizeof(float)];
double dbl[SIZE/sizeof(double)];
}memory;
或者是否可以只定义 unsigned char 数组的大小,然后自动定义 int 数组的大小?如果 SIZE
不能被 4 整除,会发生什么?
编辑:(与评论相关)
我想构建类似定时事件处理程序的东西。这意味着,我有一个包含事件数组的结构。每个事件都有一个执行时间和一个相关的函数(存储为一个指针)。当事件处理程序的定时器计数器与事件执行时间匹配时,我调用相关函数。在我知道的函数中,需要参数,所以我不需要保存标签值。问题是,事件是在一个函数中创建的,因为我不想让事件成为静态的(为了节省内存),我在我的事件处理程序中添加了一些内存(环形缓冲区),所有函数都可以在其中放入一些数据.每个事件都有一个变量,其中包含指向(第一个)数据的指针。数据类型只是原生数据类型,没有自己的结构。
这是我当前的代码:
startSystemClock()
将在启动时调用
executeSystemEvent()
将通过设置 sysEventHandler.execute=TRUE
和 while(1)
由定时器 1 的中断服务例程调用>-loop 检查这个标志然后调用 executeSystemEvent()
// typedefs requird for timed events
typedef union __attribute__ ((packed)){
int *i; // pointer, where data is stored
int value; // if there is a pointer assigned, value differs from zero
}systemEventData_u;
typedef union __attribute__ ((packed)){
int value; // if there is a pointer assigned, value differs from zero
void (*voidFct_noData)();
void (*voidFct_data)(systemEventData_u);
}systemEventFct_u;
typedef struct{
int time;
unsigned int id;
systemEventFct_u fct;
systemEventData_u data;
}systemEvent_t;
#define SYSTEM_EVENT_HANDLER_BUFFER_SIZE (10)
#define SYSTEM_EVENT_HANDLER_MEMORY_SIZE (10)
typedef struct{
unsigned int actualCnt;
unsigned int nextEventCnt;
unsigned char execute;
systemEvent_t events[SYSTEM_EVENT_HANDLER_BUFFER_SIZE];
systemEvent_t* write;
// create some persistent memory usable by all functions
int* memWrite;
union __attribute__ ((packed)){
unsigned char uchar[0];
char schar[0];
unsigned int uint[0];
int sint[SYSTEM_EVENT_HANDLER_MEMORY_SIZE];
float flt[0];
double dbl[0];
}memory;
}systemEventHandler_t;
void startSystemClock(){
// initialize event handler
sysEventHandler.actualCnt=0;
sysEventHandler.nextEventCnt=-1;
sysEventHandler.execute=FALSE;
sysEventHandler.write=sysEventHandler.events;
sysEventHandler.memWrite=sysEventHandler.memory.sint;
unsigned int i=SYSTEM_EVENT_HANDLER_BUFFER_SIZE;
systemEvent_t *ptr=sysEventHandler.events;
while(i--){
ptr->fct.value=0;
ptr->data.value=0;
ptr->time=0;
ptr++;
}
// initialize timer 1
TMR1 = 0x00;
T1CON = T3_OFF | T3_IDLE_CON | T3_GATE_OFF | T1_PS_1_8 | T1_SOURCE_INT;
IPC1SET = (INTERRUPT_PRIOR_TIMER1 << _IPC1_T1IP_POSITION) | (INTERRUPT_SUB_PRIOR_TIMER1 << _IPC1_T1IS_POSITION);
IFS0CLR = (1 << _IFS0_T1IF_POSITION);
IEC0SET = (1 << _IEC0_T1IE_POSITION);
PR1 = PR_TIMER1;
T1CONSET = (1 << _T1CON_ON_POSITION);
print_text("timer1 started\n\r");
}
void executeSystemEvent(){
asm("di");
int time=sysEventHandler.actualCnt;
asm("ei");
unsigned int i=SYSTEM_EVENT_HANDLER_BUFFER_SIZE;
unsigned int nextEventCnt=-1;
systemEvent_t *ptr=sysEventHandler.events;
while(i--){
// do not investigate, if there is no function pointer
// no function pointer means no event action
if(ptr->fct.value){
if(time>=ptr->time){
// execute function
if(ptr->data.value){
(*ptr->fct.voidFct_data)(ptr->data);
}else{
(*ptr->fct.voidFct_noData)();
}
ptr->fct.value=0;
}
}
ptr++;
}
// determine next event
// iterate again through whole queue to take added events into account also
i=SYSTEM_EVENT_HANDLER_BUFFER_SIZE;
ptr=sysEventHandler.events;
while(i--){
if(ptr->fct.value){
// get execution time to determine next one
if(ptr->time<nextEventCnt){
nextEventCnt=ptr->time;
}
}
ptr++;
}
asm("di");
sysEventHandler.nextEventCnt=nextEventCnt;
sysEventHandler.execute=FALSE;
asm("ei");
}
void addSystemEvent(systemEvent_t event){
// check, if this event will be the first event to execute
asm("di");
// get event execution time
event.time+=sysEventHandler.actualCnt;
// check, if it will be the next one to execute
if(sysEventHandler.nextEventCnt>event.time){
sysEventHandler.nextEventCnt=event.time;
}
asm("ei");
*sysEventHandler.write=event;
if(++sysEventHandler.write>=sysEventHandler.events+SYSTEM_EVENT_HANDLER_BUFFER_SIZE){
sysEventHandler.write=sysEventHandler.events;
}
}
int * storeSystemEventData(int data){
int *ptr=sysEventHandler.memWrite;
*ptr=data;
if(++sysEventHandler.memWrite>=sysEventHandler.memory.sint+SYSTEM_EVENT_HANDLER_MEMORY_SIZE){
sysEventHandler.memWrite=sysEventHandler.memory.sint;
}
return ptr;
}
要添加事件,我在任何函数中编写:
systemEvent_t event;
event.fct.voidFct_data=&enablePinChangeInterrupt_wrapper;
event.data.i=storeSystemEventData((int)PUSHBUTTON_CN_BIT);
event.time=10;
addSystemEvent(event);
我知道,storeSystemEventData
功能还不完整。但对于我的第一个目的,我只需要 int,所以它可以工作。
最佳答案
除最大数组外,您无需指定数组大小。只是越界访问其他类型。
#include "stdio.h"
union memory {
unsigned char uchar[128];
char schar[0];
unsigned int uint[0];
int sint[0];
float flt[0];
double dbl[0];
} ;
int main (void)
{
union memory my_mem;
my_mem.schar[5] = 'A';
my_mem.schar[6] = 'B';
my_mem.schar[7] = 'C';
my_mem.schar[8] = 'D';
printf ("%d\n", my_mem.uint[1]);
return 0;
}
C 不提供任何一种数组边界检查,因此如果您尝试访问内存对象之外的内存,您就不太走运了。
关于C 联盟定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34399500/
一段时间以来,我一直在努力理解 hadoop 中的联邦。我的问题是假设我有两个 NameNode NN1 和 NN2,NN1 管理金融命名空间 NN2 管理 IT 命名空间。如果 NN1 出现故障,我
我想翻译 winnt.h 中的一些类型定义,其中包含一些与位域的联合。然而,这是正确的做法吗?我特别不确定 _TP_CALLBACK_ENVIRON_V3 中的联合。 typedef struct
这个问题已经有答案了: PDO binding values for MySQL IN statement [duplicate] (8 个回答) 已关闭 7 年前。 $prepare=$text->
什么时候应该使用 union ?为什么我们需要它们? 最佳答案 union 通常用于在整数和 float 的二进制表示之间进行转换: union { int i; float f; } u;
什么时候应该使用 union ?为什么我们需要它们? 最佳答案 union 通常用于在整数和 float 的二进制表示之间进行转换: union { int i; float f; } u;
不久前宣布 Office 365 将支持 SAML 联合 Office 365 and SAML我想知道如何集成我们的内部 SSO 服务器来使用它?是否需要事件目录?我们所有的用户数据都存储在数据库中
我在 Users 和 UsersProjects 之间建立关系。 UserProjects.UserId 引用 Users.UserId 我想找到 UserProjects 中的用户,UserProj
在我的 Android SQLite 数据库中,我有一列是日期时间,格式为 YYYY-MM-DD HH:MM。我想要一个查询(或实际上是一个游标),它会给我所有的行,比如说 2015 年 5 月。排序
我的概念可能听起来有点神秘,但我提供了一些启动信息,说明我们在编译程序时如何使用 GCC 在程序中使用 GDB API/调试技术。我们绝对可以告诉 gcc 也链接 GDB 库。最终的帮助是当编译的程序
据说:“union 是一种特殊的类类型,一次只能保存一个它的非静态数据成员。”(http://en.cppreference.com/w/cpp/language/union ) 但它怎么能容纳不止一
Java/SpringBoot 中是否有 GraphQL 联合网关。在java中找不到任何实现。看到几个带有联合图的例子,但网关在 native 节点上。 检查了 Apollo 和 netflix D
我有一个非常大的表(将近 2,000,000 条记录)拆分为 2 个较小的表。一张表只包含上周的记录,另一张表包含所有其余的(很多......) 现在我得到了一些存储过程/函数,用于在拆分之前查询大表
我有 2 个由 UNION 组合的 SELECT 语句。我不想将所有结果按从一行到下一行的顺序堆叠,而是希望将第二个 SELECT 语句的结果/列添加到第一个 SELECT 语句的结果/列旁边: 以下
我使用 NestJS 和 Apollo Federation 有一段时间了,似乎自从上次更新以来我得到了 “(node:19113) DeprecationWarning:‘buildFederate
运行composer require league/flysystem-aws-s3-v3时,我得到:league/flysystem-aws-s3-v3[2.0.0, ..., 2.x-dev] r
我有两个表treeview_items和file_up treeview_items file_up 还有一个查询(不是我写的) SELECT * FROM treeview_items UNION
不确定我到底应该寻找什么,所以我正在寻求帮助。 我有两个表,通过查询我需要吐出一个。两张表如下: 交易: TransactionID SiteID EmployeeName 520
我需要向查询中添加文字值。我的尝试 var aa = new List(); aa.Add(0); var a = Products.Select(p => p.sku).Distinct().Uni
下面的前三个查询返回正确的数字,而最后一个返回错误的数字。它应该返回 153,而不是返回 8193。我不知道这个数字是从哪里来的。 遍历查询正确返回 153 条记录。 >>> Project.sele
我知道对于下面的代码,下面的“非法”是未定义的(虽然有些编译器允许它),因为 union 成员“a”是事件的,然后我们从 union 成员“b”读取。问题是,“AmILegal”中的代码是否修复了它,
我是一名优秀的程序员,十分优秀!