我正在开发我的第一个嵌入式应用程序(在Arduino上),它从一些现成组件中获取输入并控制它们。这是一个完全私人的非商业项目。 (为了我自己的利益,只需要一点乐趣/训练。)
Arduino库只是一个C ++源代码的压缩集合,带有一个C ++和.h文件,用于显示库的接口。出于这个问题的目的,只考虑每个库作为我从其他人那里获得的源的集合。
可以使用免费提供的库(具有良好的声誉)来控制两个更复杂的组件,我希望这些库可以避免重新发明轮子。但是,这两个库都声明了许多数组,这些数组占用了非常有限的数据空间。
启动时,我的应用程序将测试一个开关,该开关将确定在下一个电源循环之前将使用哪两个组件。我永远不会同时使用这两个组件。
我想更改库以在RAM中共享相同的空间,但我发现我对C ++的了解太有限了。
库A声明缓冲区如下:
class A
{
public:
char name[50];
char address[100];
}
库B声明缓冲区如下:
class B
{
public:
static char name[];
static char address[];
}
并且B的调用者需要按如下方式定义缓冲区:
char B::name[50];
char B::address[100];
我可以轻松地对库A进行少量更改,以传入指向我的应用程序定义的缓冲区的指针。但是,库B比较棘手,因为缓冲区被声明为静态并被许多静态方法使用。
我可以更改库B,将使用这些缓冲区的所有静态方法转换为非静态方法。但这将是重要的工作,并且偏离原来的更多我想要的。如果我想要一天,这样的更改将使我更难以更新我的应用程序以使用原始作者的更高版本的库。
我假设我可以将B:name []和B :: address []的地址传递给库A,但是将类B的缓冲区传递给A类感觉就像一个粗略的小屋。
鉴于硬件上下文,我不介意定义一个足够大的名称和地址的大缓冲区,然后使用库中缓冲区的偏移量。但是我的主要问题阻止我在库B中这样做。
总之,我的问题是我无法让两个库共享一个在两个类之外完全定义的缓冲区而不更改库B,因此它不使用静态方法。
任何人都可以提出任何语言技巧来解决我的问题,无论是适度数量的代码更改还是可以自动或使用宏进行的更改?
答案 0 :(得分:1)
不太确定您感觉良好的变化程度。
但是如何更改class B
的标题和应用程序,其余部分实现完好无损?
class B
{
public:
static char* name;
static char* address;
}
B的调用者按如下方式定义缓冲区:
char name[50];
char address[100];
char* B::name = name;
char* B::address = address;
然后,您也可以按计划将name
和address
传递给class A
。
所以问题是:为什么这对B中的其他代码起作用?
首先,需要使用相同的标头进行编译。 除此之外,鉴于它实际上无法直接查看数组的大小,它将或多或少地正常工作而无需进一步更改。
可能的问题在于它是否包含期望数组参数但不包含指针的方法或函数。数组衰减到指针但不是相反。 如果是这种情况,您还必须将参数更改为这些功能。
然而,鉴于首先存在单身模式和静态成员,我打赌这个问题并不存在。
答案 1 :(得分:0)
核心问题是sizeof(A)>=150
,但sizeof(B::name) < 150
和sizeof(B::address) <150
。也就是说,B使用的两个数组都不足以容纳单个A对象。因此,对于A来说,您需要一个连续的150+字节分配。
如上所述,并没有真正的需要。没有真正的理由A
需要连续存储;它可以使用char* name
和char* address
。他们可以指向B
的两个缓冲区。是的,这是一个混乱。是的,kludges是你在动力不足的系统上使用的,比如Arduino。在实际系统中,您只需拨打dlopen()
或libA
上的libB
,但不能同时调用两者。未加载的库不会使用内存。