我正在尝试使用 gdb 调试我对一个相当大的 c 程序所做的一些添加。我尝试调试的程序广泛使用#define语句来设置在整个代码中使用的不同值。我需要能够看到这些值是什么,以帮助我进行调试(因为它们包含一些非常重要的信息。
经过一番挖掘后,我发现如果将选项(也尝试了和标志)传递给编译器(如此处所述)info macro FOO ,则和macro expand FOO命令应该能够打印这些值。然而,每当我尝试使用这个我得到-g3-gdwarf-2-ggdb3
The symbol `FOO' has no definition as a C/C++ preprocessor macro
at <user-defined>:-1
Run Code Online (Sandbox Code Playgroud)
现在,我确信宏已定义,否则前一行代码将无法运行。此外,我确信我已将-g3标志传递给编译器。我对问题可能出在哪里有一个想法,那就是定义宏的位置。目前,宏是在头文件中定义的,该头文件与其余文件不在同一目录中(即,如果源文件位于,则/foo/bar/blam/..宏在 中定义/def/mac/here/。考虑到这一点,我想问题可能是 gdb 没有知道要在这个目录中查找,所以我尝试directory在 gdb 中发出命令,并给它包含头文件的目录的路径(基于此)。这仍然没有解决问题。
有谁知道如何获取这些宏的值?如果相关的话,我正在运行 gdb 版本 7.11 并使用
cc和gcc都使用Apple LLVM version 7.0.2 (clang-700.1.81). 此外,gdb 是使用自制软件安装/构建的。
我正在用 numpy 中的结构化数组做一些工作(我最终将转换为 Pandas 数据帧)。
现在,我通过读取一些数据(实际上是对一些数据进行内存映射)然后通过用户指定的约束对其进行过滤来生成这个结构化数组。然后,我想将这些数据从我读入的形式(所有内容都是 int 以节省我从中读取的文件中的空间)转换为更有用的格式,以便我可以进行一些单位转换(即向上转换为一个浮点数)。
在改变结构化数据类型的过程中,我注意到了一个有趣的工件(或其他东西)。假设读取数据会产生与以下创建的相同的结构化数组(请注意,在实际代码中,dtype 更长且更复杂,但这对于 mwe 来说就足够了):
import numpy as np
names = ['foo', 'bar']
formats = ['i4', 'i4']
dtype = np.dtype({'names': names, 'formats': formats})
data = np.array([(1, 2), (3, 4)], dtype=dtype)
print(data)
print(data.dtype)
Run Code Online (Sandbox Code Playgroud)
这造成
[(1, 2) (3, 4)]
[('foo', '<i4'), ('bar', '<i4')]
Run Code Online (Sandbox Code Playgroud)
作为结构化数组
现在,假设我想将这两个 dtype 上转换为 double,同时重命名第二个组件。这似乎应该很容易
names[1] = 'baz'
formats[0] = np.float
formats[1] = np.float
dtype_new = np.dtype({'names': names, 'formats': formats})
data2 = data.copy().astype(dtype_new)
print(data2)
print(data2.dtype)
Run Code Online (Sandbox Code Playgroud)
但结果出乎意料
(1.0, 0.0) (3.0, 0.0)]
[('foo', '<f8'), …Run Code Online (Sandbox Code Playgroud) 注意: 任何解决方案或解决此问题的方法都需要在MATLAB中进行,它是出现问题的代码.使fortran与MATLAB匹配是适得其反的,因为这两段代码都不会起作用......我理解差异是因为fortran编译器的方式和MATLAB所做的不同代替编译单个与双精度的解释漂浮,但我希望有人可以帮我提出解决方案来解决这个问题.
我正在调试一些我从Fortran转换成MATLAB的代码,并且遇到了令我难过的东西.在fortran和MATLAB中,我有以下几行
pcnt = 0.9999*(-0.5+z2)
Run Code Online (Sandbox Code Playgroud)
哪里z2 = 0.51482129528868548.我遇到的问题是2.4594e-10在MATLAB中计算的pcnt和在fortran中计算的pcnt 有所不同.我已经确认z2完全相同(即z2_matlab-z2_fortran=0),所以我很难过.real*8在Fortran和MATLAB中,z2和pcnt都是双精度(对于fortran),所以就我而言,它们应该具有完全相同的精度(因为它在同一台机器上运行).
通常情况下我不会关心这个小的差异,但是z2最终会得到一个大数字,然后用于计算一个索引,稍后差异最后是数组索引后差为2,在算法的后期导致巨大的错误(对于最多只有1e7的数字,大约为1e6).
有谁知道为什么会出现这个问题以及某种方法来解决它?我正在MATLAB R2011a上执行这项工作,并使用gfortran编译器在64位MacBook pro上使用I5(我认为的第三代)处理器编译fortran.
如果有人有任何建议请告诉我,因为如果我找不到解决方案,那么过去两周我执行的大约5000行代码的翻译将毫无价值.
此外,任何解决方案都必须是MATLAB代码,因为Fortran代码是当前可用的代码.
提前致谢,
安德鲁