Как разрешить это предупреждение "отбрасывать на указатель из типа разного размера"?

78
8

У меня есть две программы, которые обмениваются данными по D-Bus. В одной из них есть функция, которая принимает два параметра: const char* data и int size а в другой - функцию, возвращающую значение типа unsigned char. Я function((char*)program2->function().value(), 1) вызов функции в первую программу, подобную этой 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 и т.д.

спросил(а) 2014-05-02T01:53:00+04:00 5 лет, 9 месяцев назад
1
Решение
70

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

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

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

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

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

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

Если вы получаете подписанное-vs-unsigned, несоответствие, попробуйте

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

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

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

ответил(а) 2014-05-02T02:05:00+04:00 5 лет, 9 месяцев назад
49

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

ответил(а) 2014-05-02T01:57:00+04:00 5 лет, 9 месяцев назад
35

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

char value = program2->function();
function(&value, 1);

ответил(а) 2014-05-02T02:04:00+04:00 5 лет, 9 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема