Доступ к std :: complex <> из макроса Python GDB - PullRequest
1 голос
/ 19 июля 2011

Я пытаюсь написать скрипт на python, который вычисляет вектор комплексных чисел, чтобы я мог делать такие вещи, как построение графика с помощью 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}

Обновление:Похоже, я могу немного отредактировать строку перед выполнением Typecast:

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...  

Но ... есть ли лучший способ сделать это?

1 Ответ

0 голосов
/ 19 июля 2011
    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]

Если вы действительно хотите обернуть его в попытке ... кроме блока.

Редактировать: Попробуйте complex(x.real() + x.imag()).Что показывает print x.type.fields()

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...