У меня есть две программы, которые общаются через 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
и т.п.
Вам нужен адрес данных … который будет выглядеть
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 );
Конечно, это большая работа, чтобы избежать присвоения переменной имени, так как Капитан Облиус сделал.
1 Если не function2
сохраняет этот указатель на потом, но если это так, то вам не следует использовать локальную переменную для хранения значения, но следует очень внимательно следить за временем жизни объекта.
Я не думаю, что то, что вы делаете, безопасно, поэтому ваш код может вообще не работать. Если ваша функция () возвращает «unsigned char», она собирается сделать ее копию и вернуть. В то же время ваша другая функция () принимает «const char *». Я предлагаю изменить вашу программу2-> function (), чтобы она возвращала «char *».
Преобразование целого числа в указатель не очень хорошая идея, особенно если вы не знаете, почему преобразование необходимо и что именно оно делает. Похоже, что преобразование даже не нужно, и вам действительно нужно решение для правильного вызова функции вместо исправления предупреждения о приведении. Из предоставленного вами кода и описания видно, что вы хотите отправить один байт, возвращенный вызовом program2->function()
, Поскольку значение, возвращаемое этой функцией, является значением, вы не можете напрямую получить его адрес. Вместо этого вы можете сохранить его в переменной и затем вместо этого передать на него указатель. Что-то вроде приведенного ниже кода должно позволить вам делать то, что вы хотите.
char value = program2->function();
function(&value, 1);