【问题标题】:Malloc, Pointers and VariablesMalloc、指针和变量
【发布时间】:2018-02-02 08:04:58
【问题描述】:

首先,感谢您抽出宝贵时间。我试图了解下面显示的特定代码试图将它们转换为 python 的目的。第一行是将内存分配给我知道python没有的指针(aPointContour)。第二行是在 iContourLenght 中获取随机数。第三行将值 (2*aPointContour[iRandomPoint1].x + aPointContour[iRandomPoint1].y) 分配给第 0 行第 0 列的矩阵 (pMatA)。

我的问题:

1) "aPointContour[iRandomPoint1].x" 试图做什么?

2) .x .y 的用途?

我的想法:

1) 访问指针“aPointContour”内位于“iRandomPoint1”的内存。需要放入矩阵“pMatA”的值为“2*iRandomPoint1”,根据下面的代码访问内存不应该给我们“iRandomPoint1”的值吗?

2) .x 和 .y 是 Cvpoint 的一部分还是一般用作指针“aPointContour”的成员?如果它是一个成员,它将仅用于参考目的还是具有实际数学意义?

我很抱歉发了这么长的帖子,真的希望有人能帮助我。谢谢你任何好心的先生或女士! :)

// C++
CvPoint *aPointContour = (CvPoint *) malloc(sizeof(CvPoint) * iContourLength);
iRandomPoint1 = (int)((double)rand() / ((double)RAND_MAX + 1) * iContourLength);
cvmSet(pMatA, 0, 0,2* aPointContour[iRandomPoint1].x + aPointContour[iRandomPoint1].y)

【问题讨论】:

    标签: c++ pointers malloc member-function-pointers


    【解决方案1】:
    1. aPointContour 是指向CvPoint 对象数组的指针。 aPointContour[iRandomPoint1].x 使用iRandomPoint1 作为数组的索引,然后访问该对象中的x 成员变量。

    2. .x 和 .y 访问对象的成员变量。这类似于在 Python 中访问对象属性。这些是CvPoint 类的成员。在代码中的某处(可能在头文件中)查找class CvPoint 或struct CvPoint 的声明,它将声明所有成员变量和函数。

    这段代码唯一真正的问题是它使用了数组元素的未初始化值。 malloc() 分配内存,但它没有用任何可预测的东西填充它。因此,除非您遗漏了填充数组的代码,否则当它访问 aPointContour[iRandomPoint1].x 和 aPointContour[iRandomPoint1].y 时,会发生未定义的行为。

    【讨论】:

    • 嗨,Barmar,非常感谢您的详细解释!我确实觉得数组 CvPoint 中没有任何值很奇怪。我会进一步研究它,看看我是否遗漏了什么。再次,干杯! :)
    【解决方案2】:

    1) "aPointContour[iRandomPoint1].x" 试图做什么?

    让我们从 iRandomPoint1 开始。它是一个介于 0 和 iContourLength 之间的整数,即数组 aPointContour 的大小。因此 aPointContour[iRandomPoint1] 是由第一行初始化的随机 CvPoint。 aPointContour[iRandomPoint1].x 正在访问 CvPoint 的 x 值。

    在您的示例的上下文中,老实说,它没有多大意义,因为它还没有被初始化。内存已创建,但在分配空间之前,这些值都是内存的内容(出于所有意图和目的,毫无意义)。

    2) .x .y 的用途?

    ".x" 表示返回由类型 CvPoint 表示的 x 的值。同样在此代码的上下文中,它将是未分配的,因此是荒谬的。将 aPointContour[iRandomPoint1].x 与 aPointContour[iRandomPoint1].y 添加同样是荒谬的。如果传入的是指针,人们可能会争辩说它正在被传递给要分配的方法,但事实并非如此。

    如果不先将这些值分配给某物,这没有多大意义。这就像把一个黑盒子里的东西倒进你的面糊里做蛋糕一样。谁知道这样的东西会做出什么样的蛋糕呢?

    【讨论】:

    • 嗨,尼尔,非常感谢您的详细解释和可能的故障排除。感谢您的努力和时间!我一定会更深入地研究它,看看我是否错过了任何细节。干杯! :)
    • @Marrior 乐于助人。 :)
    猜你喜欢
    • 1970-01-01
    • 2012-12-11
    • 1970-01-01
    • 2018-02-10
    • 2016-07-05
    • 2016-09-29
    • 2014-04-12
    • 1970-01-01
    • 2017-05-13
    相关资源
    最近更新 更多