在处理具有不同结构的相同数据集时避免取消引用

Avoid dereferencing when working on same dataset with different structures

从现在开始,我已经阅读了很长时间的 Whosebug,并且学到了很多东西。

但现在我有一个问题,我在 Whosebug 上找不到,即使它应该是一个“标准”问题。所以如果这个话题已经回答了,请原谅我。

问题:

我正在编写一个模块,其中定义了输入和输出结构的接口。 它应该是某种“多路复用器”,可能具有三个输入和一个输出。 模块应将输入之一切换为输出(取决于某些逻辑)。

此处显示了一个工作示例:

#include <stdio.h>

typedef struct{
 short myVariable1;
 short myVariable2;
} myType;

struct input_type{
   myType Inp1;
   myType Inp2;
   myType Inp3;
};

struct output_type{
   myType Out1;
};

struct input_type input;
struct output_type output;

void main(){
   
   for (int i=0; i<10; i++){ // this for loop simulates a cyclic call of a function where all the inputs are written
       input.Inp1.myVariable1 = i;
       input.Inp2.myVariable1 = i*2;
       input.Inp3.myVariable1 = i*3;
       printf("Inp1: %d | Inp2: %d | Inp3: %d \n",input.Inp1.myVariable1,input.Inp2.myVariable1,input.Inp3.myVariable1);
       output.Out1 = input.Inp2;  // Actual routing is done here, but i want to avoid this copy by working on the same dataset (e.g. input.InpX)
       printf("Out: %d\n",output.Out1.myVariable1);
   }
}

在这个片段中,每个循环都简单地复制了结构。 为避免此步骤,我可以执行以下操作:

#include <stdio.h>

typedef struct{
 short myVariable1;
 short myVariable2;
} myType;

struct input_type{
   myType Inp1;
   myType Inp2;
   myType Inp3;
};

struct output_type{
   myType * Out1;
};

struct input_type input;
struct output_type output;

void main(){
   
   output.Out1 = &input.Inp2; // Actual routing is done here; But in this case, the output structure includes a pointer, therefore all other modules need to dereference Out1 with "->" or "*"
   
   for (int i=0; i<10; i++){ // this for loop simulates a cyclic call of a function where all the inputs are written
       input.Inp1.myVariable1 = i;
       input.Inp2.myVariable1 = i*2;
       input.Inp3.myVariable1 = i*3;
       printf("Inp1: %d | Inp2: %d | Inp3: %d \n",input.Inp1.myVariable1,input.Inp2.myVariable1,input.Inp3.myVariable1);
       
       printf("Out: %d\n",output.Out1->myVariable1);
   }
}

但在这种情况下,输出结构不再与现有接口兼容。 访问 Out1 需要取消引用。

是否可以在不更改界面的情况下避免将结构从一个结构复制到另一个结构?

提前感谢您的回答! 里斯.

Is it possible to avoid copying the structures from one to another without changing my interface?

我认为“现有接口”是指您拥有使用此类对象的代码...

struct output_type{
   myType Out1;
};

...并且您想避免修改该代码。

那样的话,不行,不能代替

struct output_type{
   myType * Out1;
};

。此外,在前一个结构的设计中,填充作为直接成员的 myType 涉及复制您关心的所有数据,无论是在每个成员的基础上还是在整个结构的基础上。

在这一点上,我建议您坚持制作这些副本,直到并且除非您发现这样做会导致性能或内存使用不尽如人意。在这一点上进行更改不仅仅涉及句法更改:还需要仔细审查 struct output_type 的所有用法,以发现并减轻代码依赖于原始结构属性的任何情况(例如确信无锯齿)。