gpt4 book ai didi

c++ - 从 gdb python 宏访问 std::complex<>

转载 作者:太空宇宙 更新时间:2023-11-04 14:22:02 24 4
gpt4 key购买 nike

我正在尝试编写一个 python 脚本来计算一个 vector 复数,这样我就可以做一些事情,比如通过 matplotlib 绘制它。下面的 Python 代码带有代码中断的注释:

import sys
import gdb
import matplotlib.pyplot as plt
class Plotter (gdb.Command):
""" Plots vector"""
# _iterator pulled directly from
# /usr/share/gdb/python/libstdcxx/v6/printers.py
class _iterator:
def __init__ (self, start, finish):
self.item = start
self.finish = finish
self.count = 0

def __iter__(self):
return self

def next(self):
if self.item == self.finish:
raise StopIteration
count = self.count
self.count = self.count + 1
elt = self.item.dereference()
self.item = self.item + 1
return ('[%d]' % count, elt)

def __init__(self):
super(Plotter, self).__init__("plot_test", gdb.COMMAND_OBSCURE)
def invoke(self, arg, from_tty):
frame = gdb.selected_frame()
try:
val = gdb.Frame.read_var(frame, arg)
if str(val.type).find("vector") != -1:
print "Plot vector:", str(val.type)
if (str(val.type).find("complex") != -1):
self.plot_complex_vector(val)
else:
self.plot_vector(val)
else:
print "Not a vector..."

except:
print "No such variable:", arg
return

def plot_complex_vector(self, val):
try:
it = self._iterator(val['_M_impl']['_M_start'],
val['_M_impl']['_M_finish'])
vector = []
while(True):
x = it.next()
vector.append(complex(x[1])) # doesn't work...
return

except StopIteration:
pass
except:
print sys.exc_info()[0]
print vector
plt.plot(vector)
plt.show()
# works...
def plot_vector(self, val):
try:
it = self._iterator(val['_M_impl']['_M_start'],
val['_M_impl']['_M_finish'])
vector = []
while(True):
x = it.next()
vector.append(float(x[1]))

except StopIteration:
pass
except:
print sys.exc_info()[0]
print vector
plt.plot(vector)
plt.show()
Plotter()

所以问题是,如何访问 std::complex 值的实部/虚部?

看起来像在做一个

打印 x[1]

将打印如下值:{_M_value = 0 + 1 * I}

更新:看起来我可以在进行类型转换之前进行一些字符串编辑:

while(True):
x = it.next()
s = str(x[1]['_M_value'])
# convert string to complex format that python understands.
c = complex(s.replace('I','j').replace(' ','').replace('*',''))
vector.append(c) # Works now...

但是...有更好的方法吗?

最佳答案

    try:
it = self._iterator(val['_M_impl']['_M_start'],
val['_M_impl']['_M_finish'])
vector = []
while(True):
x = it.next()
vector.append(complex(x[1])) # doesn't work...
return

except StopIteration:
pass
except:
print sys.exc_info()[0]

这不是迭代器在 python 中的使用方式。使用

    try:
it = self._iterator(val['_M_impl']['_M_start'],
val['_M_impl']['_M_finish'])
vector = [complex(x[1]) for x in it]
except Exception as e:
print e, sys.exc_info()[0]

如果您真的还想将它包装在 try...except block 中。

编辑:尝试complex(x.real() + x.imag())print x.type.fields() 显示什么?

关于c++ - 从 gdb python 宏访问 std::complex<>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6751176/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com