我的程序包含几个只有一个共同参数的结构。例如:
struct first {
var a;
var b;
var common_var;
var c;
};
struct second {
var d;
var common_var;
var e;
var f;
};
“common_var”是所有结构具有共同点的参数,但它对于不同的结构不会以相同的顺序出现。在第一个结构中,它是第3个变量,在第二个结构中,它是第2个变量。
现在,我有一个函数,它将指向void的指针作为参数。我想将指针传递到这些结构中的任何一个,指向此函数,并根据“common_var”变量执行操作。
void main()
{
struct first * pFirst;
theFunctionIMentioned(pFirst);
}
void theFunctionIMentioned(void * p)
{
/* Get hold of "common_var" parameter somehow. */
/* Do something based on the "common_var" parameter. */
}
如果“common_var”是所有结构中的第一个条目,那就不会有问题。不过,我真的想避免这样做。
所以问题是:我能否以某种方式找出函数参数(void * p)是指向第一结构的指针还是指向第二结构的指针?
编辑1: 问题是这个程序有一个UI,它可以(间接地,当然)让用户“决定”将哪个结构指针发送给该函数。如果用户执行操作A,则程序将指针传递给函数。如果用户执行动作B,则它将指针传递给该函数。但是,程序不能(在任何情况下)知道用户是否已执行动作A或动作B.所以基本上,我在编程时唯一“知道”的是传递给“theFunctionIMentioned()”的参数是一个指向包含“common_var”的结构的指针。我习惯于编程面向对象,在这种情况下,我会通过使用某种接口机制来解决这个问题。我想我有点希望在C中有类似的代码技术。
答案 0 :(得分:2)
不,程序运行时指针只是一个内存地址,而指向的内存只是位。没有隐藏的类型标签。
(如果您知道结构中的不同字段可以包含哪些值,并且位模式恰好是独特的,则可能可能编写可以从原始位确定的代码指针指向什么类型的结构。类似于类型字段,但是偶然。这将是复杂的,容易出错,易碎和混乱,所以我几乎不会推荐它。)
您可以更改结构,还是修复它们?如果可以更改它们,则可以创建一个新结构,其中包含类型字段和由两个结构组成的联合。或者,您可以在两个结构的开头插入一个类型字段。
如果您无法更改结构,则需要一个额外的参数来告诉函数您要发送给它的内容。
答案 1 :(得分:1)
提到的两个结构不可互换。指向第一个的指针无法转换为指向第二个的指针。即使您对其进行类型转换,也无法更改基础数据组织。
我建议您将公共参数common_var
作为参数添加到函数中并以此方式使用它。
void theFunctionIMentioned(var common_var)
void main()
{
struct first * pFirst;
theFunctionIMentioned(pFirst->common_var);
}
答案 2 :(得分:1)
在C中,变量名仅在编译和链接步骤中出现,但在运行时它们不可用。您必须考虑使用不同的解决方案来访问该值。一个这样的案例可能是
void main()
{
struct first * pFirst;
theFunctionIMentioned(pFirst, pFirst->common);
}
void theFunctionIMentioned(void * p, var common)
{
/* Get hold of "common_var" parameter somehow. */
/* Do something based on the "common_var" parameter. */
}
答案 3 :(得分:1)
所以问题是:我能否以某种方式找出函数参数(void * p)是指向第一结构的指针还是指向第二结构的指针?
不,一般来说,没有这样的方法。转换为Console.WriteLine
时,类型信息会丢失。
听起来需要重写UI。要使using namespace cv;
using namespace std;
void main()
{
Mat rImg;
vector< Mat > vImg;
vImg.push_back( imread("Img1.jpg") );
vImg.push_back( imread("Img2.jpg") );
vImg.push_back( imread("Img3.jpg") );
vImg.push_back( imread("Img4.jpg") );
vImg.push_back( imread("Img5.jpg") );
Stitcher stitcher = Stitcher::createDefault(0);
stitcher.stitch(vImg, rImg);
imshow("Stitching Result", rImg);
waitKey(0);
}
接受几种不同结构的函数已经表明程序设计有缺陷 - 对于不同的情况应该有不同的函数。 (函数指针可用于创建一致的接口。)
解决此问题的解决方法取决于您可以更改代码的哪一部分。
答案 4 :(得分:0)
结构first
和second
是由您定义的不同类型的结构。 您无法将其更改为另一个。当您声明指向其中一个的指针时,您可以将其传递给theFunctionIMentioned
。但是你会知道它的类型,就像你已经宣布它一样。
此外,无论是传递指向struct first
还是struct second
的指针,您都可以使用pFirst->variable;
访问其任何变量,其中pFirst
是指针声明并variable
您想要的变量。
答案 5 :(得分:-1)
我相信你可以修改功能参数。在那种情况下,
void main() {
struct first * pFirst;
theFunctionIMentioned(pFirst, 1);
}
void theFunctionIMentioned(void * p, var decider) // decider = 1 for first
// = 2 for second
// = 3 for third
{
if (decider == 1)
{
struct first * pFirst = (struct first*) p;
}
else
{
}
}