使struct Array指向另一个struct Array

时间:2015-11-06 07:01:29

标签: c arrays pointers struct

我在库中有两个结构我无法改变。体育课:

struct{
    uint8_t test;
    uint8_t data[8];
}typedef aStruct;

struct{
    uint8_t value;
    uint8_t unimportant_stuff;
    char data[8];
}typedef bStruct;

aStruct a;
bStruct b;

在我的应用程序中,有一个过程可以永久地刷新我的aStruct。 现在我有一个bStruct的缓冲区我想继续更新。 data []数组是重要的字段。我并不真正关心结构的其他值。

我已经确定,在代码运行的特定系统上,“char”也是8Bits。

现在我想让“b.data”数组指向与“a.data”数组完全相同的值。因此,如果进程刷新了我的aStruct,我的bStruct中的值也是最新的。

因此,在C中,数组只是指向第一个元素的指针,我认为这样的事情必须是可能的:

b.data = a.data

但不幸的是,这给了我编译错误:

  

错误:赋值给具有数组类型的表达式

有没有办法做我打算做的事情?

提前致谢

3 个答案:

答案 0 :(得分:1)

好的,根据我们的意见,我认为重新设计我的应用程序可能是最好的选择。

因此,我可以使用aStruct *的缓冲区而不是bStruct的缓冲区。这可以确保我的缓冲区始终是最新的。然后,如果我需要对缓冲区的元素执行某些操作,我将编写一个简短的getter函数,该函数将aStruct *中的数据复制到临时bStruct中并返回它。

感谢您的回复和评论。

答案 1 :(得分:0)

如果您希望b.data[]数组指向完全相同的值,则可以data b char* a并使其指向data {' s struct{ uint8_t value; uint8_t unimportant_stuff; char* data; }typedef bStruct;

这样的东西
b.data = a.data;

b.data

但是,请注意,这意味着a.data指向与b.data相同的内存位置,因此更改a.data的值会更改a.data的值还

还有另一种方法。通过将b.data的所有值复制到b.data。然后,a.data仅包含与for相同的值,但它会指向不同的内存位置。

这可以通过逐个复制来完成。在所有8元素的memcpy()循环中。

或者,使用struct

注意

无法将数组指向另一个内存位置。因为它们是不可修改的l值。如果您无法修改DateTimeZone.GetUtcOffset,则必须使用第二种方法。

答案 2 :(得分:0)

如果无法修改现有的结构定义,则无法提出要求。但您仍然可以使用一些OO样式编程来自动执行功能。以下所有假设结构中的数据字段具有相同的长度并包含相同大小的元素,如示例所示。

基本上,您使用自己的容器包装现有的结构。您可以将其放在头文件中:

/* Forward declaration of the wrapper type */
typedef struct s_wrapperStruct wrapperStruct;
/* Function pointer type for an updater function */
typedef void (*STRUCT_UPDATE_FPTR)(wrapperStruct* w, aStruct* src);
/* Definition of the wrapper type */
struct s_wrapperStruct
{
    STRUCT_UPDATE_FPTR update;
    aStruct* ap;
    bStruct* bp;
};

然后,您可以创建用于创建同步结构对的工厂样式模块,并避免将同步逻辑暴露给不感兴趣的各方。实现几个简单的功能。

/* The updater function */
static void updateStructs(wrapperStruct* w, aStruct* src)
{
    if ( (w != NULL) && (src != NULL) )
    {
        /* Copy the source data to your aStruct (or just the data field) */
        memcpy(w->ap, src, sizeof(aStruct));
        /* Sync a's data field to b */
        sync(w); /* Keep this as a separate function so you can make it optional */
    }
}

/* Sync the data fields of the two separate structs */
static void sync(wrapperStruct* w)
{
    if (w != NULL)
    {
        memcpy(w->bp->data, w->ap->data, sizeof(w->bp->data));
    }
}

然后在您的工厂功能中,您可以创建包裹对。

/* Create a wrapper */
wrapperStruct syncedPair = { &updateStructs, &someA, &someB };

然后,您可以在需要的地方传递该对,例如正在更新aStruct的过程,并按照以下方式使用它:

/* Pass new data to the synced pair */
syncedPair.update( &syncedPair, &newDataSource );

因为C不是设计为OO语言,所以它没有this指针,你需要传递显式的包装器指针。基本上这就是C ++中幕后发生的事情,编译器可以为您节省额外的麻烦。

如果您需要将单个aStruct同步到多个bStruct,那么将bp指针更改为指向数组的指针应该非常简单,并相应地修改其余部分

这可能看起来像一个过于复杂的解决方案,但是当您实施一次逻辑时,它可能会使您免于维护中的一些手工劳动。