Как разрешить это приведение к указателю из типа предупреждения о другом размере?

У меня есть две программы, которые общаются через D-Bus. В одном из них есть функция, которая принимает два параметра, а именно const char* data и int size, а в другом у меня есть функция, которая возвращает значение типа unsigned char. Я помещаю вызов функции в первую программу, подобную этой function((char*)program2->function().value(), 1), но получаю предупреждение приведение к указателю из целого числа другого размера [-Wint-to-pointer-cast]. как мне разрешить это предупреждение? также я использую библиотеки Qt.

РЕДАКТИРОВАТЬ:

на самом деле в функции, которая принимает const char* и int, я добавляю данные к QByteArray, который принимает const char* и размер типа int в его конструкторе, как это предусмотрено Qt, а другая программа должна возвращать число в диапазоне 0-255, следовательно unsinged char. Если то, что я делаю, неправильно, как лучше всего получить желаемый результат?

Также вызов функции program2-> вызывает следующее:

inline QDBusPendingReply<uchar> type()
    {
        QList<QVariant> argumentList;
        return asyncCallWithArgumentList(QLatin1String("type"), argumentList);
    }

этот класс имеет функцию с именем value(), которая вызывает:

inline typename Select<0>::Type value() const
    {
        return argumentAt<0>();
    }

ПРИМЕЧАНИЕ: моя основная цель этого вопроса заключалась в том, чтобы найти способ создать ссылку на возвращаемый результат вызова функции, определенной в прокси-классе, а не как преобразовать ее во что-то приемлемое для создания QByteArray поэтому, пожалуйста, прекратите добавлять несвязанные теги, такие как QByteArray или QtCore и т. д.


person moki    schedule 01.05.2014    source источник
comment
Предупреждение кажется довольно ясным; тип int отличается от типа char *, поэтому выполняемое вами преобразование не будет иметь никакого смысла.   -  person Oliver Charlesworth    schedule 02.05.2014
comment
@Oli: Кажется, unsigned char и unsigned char* имеют разный размер. Фактический аргумент 1 для параметра int работает просто отлично.   -  person Ben Voigt    schedule 02.05.2014
comment
Почему не просто auto const p = program2->function();, а просто (&p, 1)?   -  person David Schwartz    schedule 02.05.2014


Ответы (3)


Вам нужен адрес данных... который будет выглядеть так

function2(& program2->function().value(), 1);

и было бы совершенно безопасно, так как время жизни временной переменной равно концу полного выражения, которое достаточно 1, чтобы function2 мог его использовать.

К сожалению, вы не можете использовать оператор адреса & для rvalue. Но есть обходной путь, так как вы можете привязать ссылку const lvalue к rvalue, и вам все равно нужен указатель на const данные:

template<T>
const T* get_addr(const T& v) { return &v; }

function2( get_addr(program2->function().value()), 1 );

Если вы получаете несоответствие между подписанными и неподписанными, попробуйте

function2( get_addr<char>(program2->function().value()), 1 );

Конечно, это большая работа, чтобы не давать переменной имя, как это сделал Captain Obvlious.


1 Если только function2 не сохранит этот указатель на потом, но если это так, то вам также не следует использовать локальную переменную для хранения значения, но уделите очень пристальное внимание времени жизни объекта.

person Ben Voigt    schedule 01.05.2014
comment
пожалуйста, взгляните на класс QDBusPendingReply и просмотрите свой ответ. также проверьте обновление описания моего вопроса - person moki; 02.05.2014
comment
@MoKi: Итак, program2->function() в вашем вопросе это someobj->type()->value()? В моем ответе ничего не меняется. Только если function2 хранит копию указателя, возникнут проблемы. - person Ben Voigt; 02.05.2014
comment
@laszlo: меняется, нет, определенно нет. Возможно, добавление еще одной перегрузки функции2, которая принимает один байт. - person Ben Voigt; 03.05.2014
comment
@LaszloPapp: Вы действительно думаете, что это единственный вызов во всей программе его function2? Думаю, если это правда, ваше предложение имело бы смысл. Но это кажется маловероятным. - person Ben Voigt; 03.05.2014
comment
@LaszloPapp: Где изменение на const char&? Единственное место, которое я предложил, было в шаблонной вспомогательной функции, которая имеет const T&. function2 сохраняет свою read()-подобную подпись const char*, size_t - person Ben Voigt; 03.05.2014
comment
@LaszloPapp: Итак... эта функция, к которой вы так не любите, настолько плоха, что ее версия была стандартизирована как std::address_of ... Почему вы рекомендуете не писать программу на C++ на C++ только потому, что Qt является одним из зависимости? - person Ben Voigt; 03.05.2014
comment
@LaszloPapp: Мой ответ был дан на вопрос с тегом c++, а Qt был упомянут как запоздалая мысль. Ясно, что MoKi искал способ сделать это на C++. Я не вижу причин менять свой ответ в ответ на рассматриваемое изменение, поскольку он по-прежнему будет работать нормально. - person Ben Voigt; 03.05.2014
comment
@LaszloPapp: я упомянул недостатки в своем ответе. это много работы, чтобы не давать переменной имя - person Ben Voigt; 03.05.2014

Я не думаю, что то, что вы делаете, безопасно, поэтому ваш код может вообще не работать. Если ваша функция () возвращает «беззнаковый символ», она сделает его копию и вернет ее. В то же время ваша другая функция () принимает «const char*». Я предлагаю изменить вашу программу2-> function(), чтобы она возвращала "char *".

person aalimian    schedule 01.05.2014
comment
Это звучит как рецепт для оборванного указателя. Где первая функция будет хранить свой результат, который будет действительным при запуске второй функции? - person Ben Voigt; 02.05.2014
comment
Это, пожалуй, самая странная идея. Зачем вам делать это для простого char, который затем преобразуется в QByteArray? - person lpapp; 03.05.2014

Преобразование целого числа в указатель не очень хорошая идея, особенно если вы не знаете, зачем это преобразование необходимо и что именно оно делает. Похоже, что преобразование даже не нужно, и вам действительно нужно решение для правильного вызова функции вместо исправления предупреждения о приведении. Судя по предоставленному вами коду и описанию, вы хотите отправить один байт, возвращаемый вызовом, на program2->function(). Поскольку значение, возвращаемое этой функцией, является значением r, вы не можете напрямую получить его адрес. Вместо этого вы можете сохранить его в переменной, а затем вместо этого передать указатель на нее. Что-то вроде приведенного ниже кода должно позволить вам делать то, что вы хотите.

char value = program2->function();
function(&value, 1);
person Captain Obvlious    schedule 01.05.2014
comment
пожалуйста, проверьте мое обновленное описание вопроса. Вызов program2->function() возвращает объект QDBusPendingReply. - person moki; 02.05.2014