有没有办法找出指针指向的结构类型?

时间:2016-03-31 08:00:32

标签: c pointers struct ansi

我的程序包含几个只有一个共同参数的结构。例如:

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中有类似的代码技术。

6 个答案:

答案 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)

结构firstsecond是由您定义的不同类型的结构。 您无法将其更改为另一个。当您声明指向其中一个的指针时,您可以将其传递给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
     {
      }
}