59 | const_char_ptr = c_ptr(my_ptr_int) | 1 Error: Component ‘c_address’ at (1) is a PRIVATE component of ‘c_ptr’ ReadWrite.f90:61:14:
时间: 2024-03-08 16:51:28 浏览: 170
这个错误是因为`c_address`成员是`c_ptr`类型的私有成员,不能直接访问。在你的代码中,`c_address`成员被用来存储指针变量的值,并且你试图直接访问它来修改指针变量的值。因此,当你尝试编译这段代码时,编译器会报错。
要解决这个问题,你可以使用`c_f_pointer`函数来将整数变量转换为指针类型的变量。例如:
```
integer(c_intptr_t), target :: my_ptr_int
type(c_ptr) :: const_char_ptr
type(c_ptr), pointer :: my_ptr
! 将整数变量转换为指针类型的变量
call c_f_pointer(c_loc(my_ptr_int), my_ptr)
! 将指针类型的变量传递给函数
const_char_ptr = my_cpp_read(my_ptr)
```
这样就可以避免直接访问`c_ptr`类型的私有成员的问题了。请注意,在将整数变量转换为指针类型的变量时,需要使用`c_f_pointer`函数,它可以将指针变量的地址存储在一个指向指针变量的指针中。
相关问题
float CornerDetector::shiTomasiScore(const cv::Mat &img, int u, int v) { assert(img.type() == CV_8UC1); float dXX = 0.0; float dYY = 0.0; float dXY = 0.0; const int halfbox_size = 15; const int box_size = 2 * halfbox_size; const int box_area = box_size * box_size; const int x_min = u - halfbox_size; const int x_max = u + halfbox_size; const int y_min = v - halfbox_size; const int y_max = v + halfbox_size; if (x_min < 1 || x_max >= img.cols - 1 || y_min < 1 || y_max >= img.rows - 1) return 0.0; // patch is too close to the boundary const int stride = img.step.p[0]; for (int y = y_min; y < y_max; ++y) { const uint8_t *ptr_left = img.data + stride * y + x_min - 1; const uint8_t *ptr_right = img.data + stride * y + x_min + 1; const uint8_t *ptr_top = img.data + stride * (y - 1) + x_min; const uint8_t *ptr_bottom = img.data + stride * (y + 1) + x_min; for (int x = 0; x < box_size; ++x, ++ptr_left, ++ptr_right, ++ptr_top, ++ptr_bottom) { float dx = *ptr_right - *ptr_left; float dy = *ptr_bottom - *ptr_top; dXX += dx * dx; dYY += dy * dy; dXY += dx * dy; } } // Find and return smaller eigenvalue: dXX = dXX / (2.0 * box_area); dYY = dYY / (2.0 * box_area); dXY = dXY / (2.0 * box_area); return 0.5 * (dXX + dYY - sqrt((dXX + dYY) * (dXX + dYY) - 4 * (dXX * dYY - dXY * dXY)));
这段代码是计算给定图像中某个像素点的Shi-Tomasi角点得分,返回一个浮点数作为角点的响应值。Shi-Tomasi角点检测是一种常用的角点检测算法,它通过计算图像中每个像素点的响应值来确定哪些像素点是角点。该函数的参数包括一个输入图像`img`以及一个像素点坐标`(u,v)`。
这个函数的具体实现包括以下几个步骤:
1. 首先判断输入图像是否为单通道的灰度图像,如果不是则会出现断言失败(assertion failed)的错误。
2. 定义了三个浮点数变量`dXX`、`dYY`、`dXY`,分别表示在某个像素点处计算得到的矩阵M的三个元素。
3. 定义一些常量,包括半个窗口的大小`halfbox_size`、窗口大小`box_size`、窗口面积`box_area`、以及窗口四个边界的坐标。
4. 判断窗口是否太靠近图像边界,如果是则直接返回0,表示该像素点不是角点。
5. 计算图像的步长`stride`,用于在循环中访问图像像素。
6. 对于窗口中的每个像素点,计算该点处的dx和dy,然后计算dXX、dYY和dXY的值。
7. 最后根据上述计算结果得到Shi-Tomasi角点的响应值,并返回该值作为函数的结果。
总体来说,这个函数是计算给定图像中某个像素点的Shi-Tomasi角点响应值的一个实现。
42 | type(c_ptr) :: my_char_ptr = c_loc(file_name) | 1 Error: Argument X at (1) to C_LOC shall have either the POINTER or the TARGET attribute ReadWrite.f90:43:58:
这个错误提示显示在 Fortran 代码的第 42 行,意思是使用 c_loc 函数的参数必须具有 POINTER 或 TARGET 属性。这意味着,在使用 c_loc 函数之前,您需要将 file_name 声明为具有 POINTER 或 TARGET 属性的变量。
您可以尝试将 file_name 声明为具有 POINTER 或 TARGET 属性的变量。例如:
```fortran
use iso_c_binding
! 声明一个具有 POINTER 属性的字符型变量
character(len=:), pointer :: file_name
! 将字符串赋值给变量
file_name => "/mnt/d/Code/fortranRW/TEST.DATJ"
! 将 char 类型的变量转换为 const char* 类型
type(c_ptr) :: my_char_ptr = c_loc(file_name)
```
在上面的示例中,我们首先声明了一个具有 POINTER 属性的字符型变量 file_name,然后使用指针赋值操作符 => 将字符串 "/mnt/d/Code/fortranRW/TEST.DATJ" 赋值给变量。最后,使用 c_loc 函数将 file_name 转换为 c_ptr 类型的指针变量 my_char_ptr。
需要注意的是,在使用指针变量时,需要确保它们所指向的内存区域是有效的,并且在使用完毕后释放它们。另外,需要确保变量的长度和对齐方式与 C 语言相符。
阅读全文