我正在使用一个单独的GUI程序来创建.c和.h文件。我正在尝试使用这些预先存在的变量创建结构。到目前为止,我发现的最佳解决方案是创建一个指针结构,然后将预先存在的变量的地址分配给这些struct成员。
但是,由于我需要通过几个不同的函数来访问此结构,所以我发现的唯一方法是全局定义这些结构。 (我无法更改函数参数。)这不可避免地导致全局定义指针(结构成员)。这确实可以始终如一地工作,但是我知道这是不好的做法。还有其他方法可以实现这一目标吗?
编辑: 基本上,我需要一种在创建结构时使用预先存在的变量的方法。我有一个滑块的结构,并包含指向不同变量(滑块长度,百分比等)的指针。
void UpdateSlider(SLIDER_TEMPLATE * pSliderStruct, uint16_t XTouchValue, uint16_t YTouchValue)
{
int16_t SliderStart = (pSliderStruct->origin) + (pSliderStruct->handle_size / 2);
int16_t SliderEnd = (pSliderStruct->length) + (pSliderStruct->origin) - ((pSliderStruct->handle_size) / 2);
int16_t SliderUsableLength = (pSliderStruct->length) - pSliderStruct->handle_size;
int16_t TempSliderLevel;
int16_t TempSliderPercent;
uint8_t SliderFivePercent = SliderUsableLength / 20;
if ((XTouchValue <= SliderEnd) && (XTouchValue >= SliderStart) && (YTouchValue <= 760) && (YTouchValue >= 400) )
{
TempSliderLevel = (XTouchValue - (pSliderStruct->origin));
TempSliderPercent = (int)((*pSliderStruct->level - (pSliderStruct->handle_size / 2)) / ((float)SliderUsableLength / 100) );
*pSliderStruct->level = ROUND_TO_NEAREST(TempSliderLevel, SliderFivePercent);
*pSliderStruct->percentage = ROUND_TO_NEAREST(TempSliderPercent,5);
}
}
头文件中的声明:
typedef const struct {
int16_t origin;
int16_t length;
int16_t * level;
uint8_t * percentage;
uint8_t handle_size;
}SLIDER_TEMPLATE;
void UpdateSlider(SLIDER_TEMPLATE * pSliderStruct, uint16_t XTouchValue, uint16_t YTouchValue);
用于多种功能,例如:
void UpdateVars( GUI_DATA_STRUCT* GuiData )
{
if (ACTIVE_VSWITCH == 5005)
{
UpdateSlider( &Slider4, X_TOUCH_VALUE, Y_TOUCH_VALUE);
}
.
.
.
}
答案 0 :(得分:0)
这不可避免地导致全局定义指针(结构成员)。这确实可以始终如一地工作,但是我知道这是不好的做法。还有其他方法可以实现这一目标吗?
如果您需要访问函数内部的那些变量,并且不能更改函数参数以添加这些变量,则访问变量的唯一方法是将它们声明为全局变量。
如果可能的话,您可以在编译单元中将它们声明为静态,以便其他编译单元无法使用它们。
简而言之:在给出限制的情况下,唯一的解决方案是使用全局变量。