小编And*_*rew的帖子

gdb 从不同目录中的文件获取预处理器宏信息

我正在尝试使用 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 是使用自制软件安装/构建的。

c macros gcc gdb

6
推荐指数
0
解决办法
627
查看次数

更改 numpy 结构化数组数据类型名称和格式

我正在用 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)

python numpy python-3.x structured-array

5
推荐指数
1
解决办法
4289
查看次数

Fortran和MATLAB之间的数值精度问题

注意: 任何解决方案或解决此问题的方法都需要在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代码是当前可用的代码.

提前致谢,

安德鲁

precision matlab fortran gfortran

0
推荐指数
1
解决办法
351
查看次数

标签 统计

c ×1

fortran ×1

gcc ×1

gdb ×1

gfortran ×1

macros ×1

matlab ×1

numpy ×1

precision ×1

python ×1

python-3.x ×1

structured-array ×1