Строки могут использоваться в качестве индекса массива?

Возможным решением является реализация QProxyStyle:

from PyQt5 import QtCore, QtGui, QtWidgets

class RoundPixmapStyle(QtWidgets.QProxyStyle):
    def __init__(self, radius=10, *args, **kwargs):
        super(RoundPixmapStyle, self).__init__(*args, **kwargs)
        self._radius = radius

    def drawItemPixmap(self, painter, rectangle, alignment, pixmap):
        painter.save()
        pix = QtGui.QPixmap(pixmap.size())
        pix.fill(QtCore.Qt.transparent)
        p = QtGui.QPainter(pix)
        p.setBrush(QtGui.QBrush(pixmap))
        p.setPen(QtCore.Qt.NoPen)
        p.drawRoundedRect(pixmap.rect(), self._radius, self._radius)
        p.end()
        super(RoundPixmapStyle, self).drawItemPixmap(painter, rectangle, alignment, pix)
        painter.restore()

if __name__ == '__main__':
    import sys 
    app = QtWidgets.QApplication(sys.argv)
    w = QtWidgets.QLabel(alignment=QtCore.Qt.AlignCenter)
    proxy_style = RoundPixmapStyle(radius=20, style=w.style())
    w.setStyle(proxy_style)
    movie = QtGui.QMovie("foo.gif")
    w.setMovie(movie)
    movie.start()
    w.resize(640, 480)
    w.show()
    sys.exit(app.exec_())

enter image description here

5
задан Stephen 23 August 2011 в 02:10
поделиться

7 ответов

Это могло бы скомпилировать, но это не будет работать.

Не совсем ясно, чего Вы пытаетесь достигнуть. Я думаю, что Вы хотите ассоциативный массив, в этом случае необходимо найти реализацию библиотеки одной.

Если Вы ищете что-то больше как перечислимый тип, и можно полагаться на C89, посмотреть на что-то как:

enum cardsuit {
   CLUBS,
   DIAMONDS,
   HEARTS,
   SPADES
};

Если Вы не можете полагаться на C89, то необходимо попробовать некоторых typedef обман.

17
ответ дан 18 December 2019 в 05:36
поделиться

Можно легко создать справочные таблицы с функцией bsearch() если stdlib.h. Рабочий пример - это:

#include <string.h>
#include <stdlib.h>
#include <stdio.h>

#define count(ARRAY) (sizeof(ARRAY)/sizeof(*ARRAY))

struct item
{
    const char * name;
    int value;
};

static _Bool sorted;

static struct item items[] =
{
    { "one", 1 },
    { "two", 2 },
    { "three", 3 },
    { "ten", 10 }
};

static int compare(const void * p1, const void * p2)
{
    return strcmp(*((const char **)p1), *((const char **)p2));
}

int get(const char * name)
{
    if(!sorted)
    {
        qsort(items, count(items), sizeof(*items), compare);
        sorted = 1;
    }

    struct item * item = bsearch(&name, items, count(items), sizeof(*items),
        compare);

    return item ? item->value : 0;
}

int main(int argc, char ** argv)
{
    int i;
    for(i = 1; i < argc; ++i)
        printf("%i\n", get(argv[i]));

    return 0;
}
3
ответ дан 18 December 2019 в 05:36
поделиться

Необходимо будет записать функцию, которая отображает строки на целые числа, или альтернативно используйте перечисления повсюду (и затем возможно, функция, которая отображает перечисляемые значения на строки).

В целом более хорошо сделать последнего: передать целые числа, так, чтобы реализация не зависела от деталей строк, которые могли бы использоваться в представлении. Например, думайте о том, как Вы справились бы с локализацией (перевод), если когда-нибудь необходимо сделать те строки приемлемыми кому-то говорящему на другом языке.

3
ответ дан 18 December 2019 в 05:36
поделиться

Существуют другие превосходные ответы на то, что необходимо сделать, таким образом, я думал, что объясню, что Вы делаете и почему это компилирует и не работает.

В C ссылка на массив сделана при наличии массива или указателя и какого-то целого числа. (в x [1], x является массивом, и 1 целое число). Пока Вы используете некоторый целочисленный тип, он будет работать, как Вы ожидаете.

Предположим, что у Вас есть что-то, что это не целое число. В этом случае реализация C будет видеть, может ли она преобразовать его в соответствующий тип, таким образом, Вы волнуете с массивом и целым числом. Это - случаи как это, где Вы попадаете в беду (и немного более сложные версии этого в C++ смутили более опытных людей, чем Вы).

В C литеральной строке как "каждый" имеет символ константы типа *, имея в виду указатель на символы, которые Вы не можете изменить. Фактическое значение является адресом памяти того, где строка на самом деле находится в памяти. Обычно, Вы не уделили бы внимания этому значению указателя и посмотрели бы на строковое значение, но здесь существует глюк.

В C любой указатель данных может быть преобразован в своего рода целое число и будет автоматически. Поэтому у Вас есть строка как "одна", и ее значение является любым числом, которое представляет адрес памяти. Используйте его, где C ожидает своего рода целое число, и это будет преобразовано в некоторое интегральное значение или другой.

Поэтому это - то, что происходит с x ["ОДИН"]. Система C должна поместить строку "ОДИН" где-нибудь в памяти, и она не имеет значения где. Это, вероятно, будет где-нибудь с адресом довольно памяти большой емкости, вполне возможно в миллиардах. Когда это видит x ["ОДИН"], это пытается преобразовать то значение в целое число и использует его в качестве нижнего индекса. Поэтому Вы пытаетесь получить доступ к массиву x далеко, далеко вне его границ, и это вызывает проблему. Или Вы пытаетесь использовать память, которой Вас не разрешают, и система просто останавливает Вас, или Вы унавоживаете с блоком памяти, которую необходимо оставлять в покое, и это, вероятно, перестанет работать некоторым таинственным способом позже.

10
ответ дан 18 December 2019 в 05:36
поделиться

То, что Вы ищете, является, вероятно, эквивалентом ассоциативного массива, которому нельзя предоставить тот же синтаксический сахар в C, к сожалению, без некоторых глупых результатов.

Однако то, что можно обеспечить, является hashmap, если данные соответствуют для манипулирования-> пары значения. То, в чем Вы будете нуждаться, является appropiate хеш-функцией.

Существует достойный простой пример хеш-таблицы здесь:

http://www.cl.cam.ac.uk/~cwc22/hashtable/

1
ответ дан 18 December 2019 в 05:36
поделиться

В "плоскости C" можно подражать использованию строки как индекс, но НЕ СОВСЕМ в пути Вы, кажется, желаете. Однако выполнение так редко полезно и главным образом отличный способ сделать Ваш код нечитабельным. То, что Вы, кажется, желаете, должно смочь использовать строковые ключи в словарь (или "хеш-таблица", если Вы предпочитаете) и нет никакой встроенной структуры данных для этого в C. Точный дизайн зависел бы от того, что Вы хотите (и, действительно, если это - часть домашней работы, Вы даже, возможно, не должны использовать законченную реализацию хеш-таблицы, но могли, вероятно, сойти с рук меньше производительного статического кодирования).

Пример с помощью строки (хорошо, массив символов) в "индексном положении) [b] конструкция:

int main (void)
{
  char *str = "This is a test string";
  int x;

  for (x=0; x < 12; x += 3)
    putchar(x[str]);

  printf("\n");

  return 0;
}

Вышеупомянутое, насколько я могу сказать, легальный C, с четко определенным выводом (строка "Tss ssi"). Это полагается на то, которое [b] определяется для совпадения с * (a+b).

-2
ответ дан 18 December 2019 в 05:36
поделиться

Как уже обозначено, Вы нуждаетесь в ассоциативном массиве или хешируете карту или эквивалент. Одним возможным источником для такого кода является Hanson "C Интерфейсы и Реализации" (код в Google Code - условия лицензирования двойной проверки и т.д. перед использованием его.)

0
ответ дан 18 December 2019 в 05:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: