Je suis capable d'obtenir la valeur en utilisant ptr.dereference, mais je n'ai aucune idée de comment incrémenter le pointeur pour obtenir la valeur suivante. Supposons que j'utilise un tableau signé 16 bits. Comment obtenir les 5 premières valeurs ?

class MyArrayPrinter:
    "Print a MyArray"

    def __init__ (self, val):
        self.val = val

    def to_string (self):
        return "Array of"

    def children(self):
        ptr = self.val['array']
        #yield ('0', ptr.address[1].dereference())
        yield ('5', 47)

    def display_hint (self):
        return 'array'
0
Eric Stotch 31 oct. 2020 à 06:59

1 réponse

Meilleure réponse

Pour cette classe de tableau simple, extraite de votre autre question :

template<class T>
struct MyArray
{
    int pos;
    T array[10];
    MyArray() : pos(0) {}
    void push(T val) {
        if (pos >= 10)
            return;
        array[pos++] = val;
    }
};

J'implémenterais la jolie imprimante comme ceci:

class MyArrayPrinter:
    "Print a MyArray"

    class _iterator:
        def __init__ (self, start, finish):
            self.item = start
            self.finish = finish
            self.count = 0

        def __iter__ (self):
            return self

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

        def next (self):
            return self.__next__()

    def __init__ (self, val):
        self.val = val

    def children (self):
        start = self.val['array'][0].address
        return self._iterator(start, start + self.val['pos'])

    def to_string (self):
        len = self.val['pos']
        return '%s of length %d' % (self.val.type, len)

    def display_hint (self):
        return 'array'

pp = gdb.printing.RegexpCollectionPrettyPrinter("mine")
pp.add_printer('MyArray', '^MyArray<.*>$', MyArrayPrinter)
gdb.printing.register_pretty_printer(gdb.current_objfile(), pp)

Qui ressemblerait à ceci:

(gdb) p arr
$1 = MyArray<MyString> of length 2 = {"My test string", "has two"}
(gdb) p arr2
$2 = MyArray<MoreComplex*> of length 1 = {0x22fe00}
2
ssbssa 31 oct. 2020 à 16:20