Записки программиста Программирование и не только

22Фев/120

const и все-все-все

char greeting[] = “Hello”;
char *p = greeting; 	// неконстантный указатель,
			// неконстантные данные
*p = "Bye";		// можно
++p;			// можно
const char *p = greeting; 	// неконстантный указатель,
				// константные данные
char const *p = greeting;	// то же самое
*p = "Bye";			// нельзя
++p;				// можно
char * const p = greeting; // константный указатель,
				// неконстантные данные
*p = "Bye";			// можно
++p;				// нельзя
const char * const p = greeting; 	// константный указатель,
					// константные данные
*p = "Bye";				// нельзя
++p;					// нельзя

Для функций-членов есть еще один модификатор

int foo() const	// гарантирует, что функция не модифицирует
			// содержимое класса
Метки записи: Нет комментариев
21Фев/120

QHash и структура в качестве ключа.

Тема легкая, но мне, почему-то далась достаточно напряжно.

Задача: использовать в качестве ключа QHash структуру.
Читаем документацию - для данной операции достаточно в структуре определить оператор "==" и написать глобальную функцию qHash для нашей структуры.

Решение:

struct MyStruct
{
    quint8 a1;
    quint8 a2;
    quint8 a3;
    quint8 a4;
    bool operator==(const MyStruct struc) const
    {
        return (a1 == struc.a1 &&
                a2 == struc.a2 &&
                a3 == struc.a3 &&
                a4 == struc.a4);
    }
};
uint qHash(const MyStruct &struc)
{
    //как-то вычисляем хеш
    //в моём случае в структуре содержалось 4 целых числа и я просто записал их в одно число со сдвигом
    uint result = struc.a1;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a2;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a3;

    result <<=(sizeof(quint8)*8);
    result = result|struc.a4;
    return result;
}

Использование:

QHash < MyStruct, QString > myQHash

Всё работает отлично.

А вот при попытке использовать еще одну структуру в качестве значения QHash

QHash < MyStruct, MyOtherStruct > myOtherQHash

При запросе значения по ключу - всё работает отлично, но при попытке получить ключ по значению получаем надпись:

no match for 'operator==' in 'i.QHash<Key, T>::const_iterator::value [with Key = MyStruct, T = MyOtherStruct]() == avalue'

Страшная надпись, не правда ли? :)

Причина - не хватает операции "==" во второй структуре. Добавляем её и всё работает.
Вот так.

struct, key, qhash

Метки записи: , Нет комментариев
10Фев/121

Получение произвольного бита из числа.

int bit = (c >> i) & 1

Где с - число, i - номер получаемого бита.

Метки записи: 1 комментарий
10Фев/120

Установка произвольного бита в числе.

b |= (1 << i);	// set
b &= ~(1 << i);	// clear

где b - число, а i - номер бита

Метки записи: Нет комментариев
7Фев/120

A Swarm of Nano Quadrotors

Стая мелких четырёхвинтокрыльников выполняют совместные учения.

Experiments performed with a team of nano quadrotors at the GRASP Lab, University of Pennsylvania. Vehicles developed by KMel Robotics. Special thanks to Professor Daniel Lee for his support.

Очень здорово.
Напомнило старый добрый HomeWorld :)

6Фев/120

Ледяной палец. BBC.

BBC: Frozen Planet, 'Brinicle' ice finger of death from Dan Droopy on Vimeo.

Коротко о физике процесса:
Под формирующимся на поверхности льдом собирается концентрированная солёная вода, которая имеет температуру сильно ниже нуля. Крепкий переохлажденный рассол, стекая вниз, в зоне контакта с обычной морской водой, намораживает трубу из пресного льда. Как только эта рассольная сосулька касается дна, всё живое в месте прикосновения оказывается вмороженным в ледяную гробницу.

Метки записи: Нет комментариев
3Фев/120

Pencil

Похожая на Dia утилита для создания диаграмм. Не так удобно, но примитивов побольше.
При этом дополнительно может использоваться для быстрой наброски интерфейсов.

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

Домашняя страница

3Фев/120

Слот. Поиск по QTreeWidget. Еще вариант.

Ищет по листьям. По первому столбцу.
Если дерево одноуровневое, то проверку на childCount можно убрать.

void MyClass::find(QString aFindString)
{
    QTreeWidgetItemIterator it(myTree);
    while (*it)
    {
        if (!(*it)->text(0).contains(aFindString, Qt::CaseInsensitive) && ((*it)->childCount() == 0))
        {
            (*it)->setHidden(true);
        }
        else
        {
            (*it)->setHidden(false);
        }
        ++it;
    }
}

Коннект идентичен.

QLineEdit *findEdit = new QLineEdit(this);
connect(findEdit,SIGNAL(textEdited(QString)),this,SLOT(find(QString)));

Должно работать гораздо быстрее первого варианта :)

Метки записи: , , Нет комментариев