Я знаю, что это может быть дубликат: Вернуть объект «NULL», если результат поиска не найден
НО, есть что-то другое происходит с моим кодом, потому что звездочка не решает мою проблему, а именно:
Normal Sphere::hit(Ray ray) {
//stuff is done here
if(something happens) {
return NULL;
}
//other stuff
return Normal(something, somethingElse);
}
Но я получаю ошибку, ссылающуюся на возвращаемую строку NULL
: требуется преобразование из «int» в несалярный тип «Normal»
И еще одну ошибку и предупреждение о том, что ссылка на последнюю возвращаемую строку: предупреждение: получение адреса временного
и преобразование из «Normal *» в некалярийный тип «Normal» запрошено
Я понимаю, почему я получаю это предупреждение, но не знаю, как его исправить. Как вернуть объект Normal
в последней строке, которая сохраняется после завершения функции, и как вернуть объект NULL
в первый раз? (Если есть термин для этих типов возврата, пожалуйста, дайте мне знать, чтобы я также мог прочитать его подробнее.)
Чтобы прояснить вопрос комментатора, я попробовал следующие вещи:
Я пытался сделать это: Normal * Sphere:: hit (Ray ray)
в файле cpp и Normal * hit (Ray ray);
в файле заголовка, и я получаю эту ошибку: Ошибка: прототип для «Normal * Sphere:: hit (Ray)» не соответствует ни одному из классов «Sphere»
Я также попробовал это: Нормальная сфера:: * попадание (Ray ray)
в файл cpp и Нормальное * попадание (Ray ray);
в файл заголовка, и я получаю эту ошибку для второго оператора возврата: не может преобразовать 'Normal *' в 'Normal Sphere:: *' взамен
Дальнейшее разъяснение: Я не спрашиваю о том, как работают указатели. (Это был не главный вопрос.) Меня интересует синтаксис, касающийся указателей на языке C++. Итак, учитывая функцию, которую я указал выше, я понял, что я должен указать возврат указателя, потому что C++ не имеет нулевых объектов. Понял. НО тогда возникает проблема: как должен выглядеть прототип функции? В файле cpp у меня есть то, что предложил Бала (что и было первоначально, но изменил его из-за следующей ошибки):
Normal* Sphere::hit(Ray ray) {
//stuff is done here
if(something happens) {
return NULL;
}
//other stuff
return new Normal(something, somethingElse);
}
В файле заголовка есть Нормальное * попадание (Ray ray)
, но я все еще получаю следующее сообщение: прототип для 'Normal * Sphere:: hit (Ray)' не соответствует ни одному из классов 'Sphere'
На данный момент мне неясно, почему он не может найти прототип этой функции. Вот файл заголовка:
class Sphere
{
public:
Sphere();
Vector3 center;
float radius;
Normal* hit(Ray ray);
};
Может ли кто-нибудь узнать, почему он жалуется, что не существует соответствующего прототипа для хита
в классе Сфера
? (Я могу перенести это на отдельный вопрос...)
-121--1098578-
Я адаптирую ядро пряника для моей пользовательской платы. Я пытаюсь заменить резистивный сенсорный экран, который использует встроенный контроллер ADC (S5PV210 процессор от Samsung). В своем дизайне мне нужен емкостный контроллер, поддерживаемый драйвером eGalaxyTouch. Он подключен к USB. Драйвер можно легко включить из меню «make xconfig». Это несколько работает, так как я добавил несколько следов на последовательной консоли, и я вижу его установку во время загрузки ядра, и я вижу, что он установить и удалить себя при подключении/отсоединении USB-кабеля. Но он ничего не делает в пользовательском интерфейсе Android. Это устройство типа HID. Проблема в том, что он не подключается к соответствующему программному обеспечению уровню сенсорного экрана Android. Наверное, я что-то пропустил. Для принудительного подключения этого HID к другому программному уровню, управляющему сенсорным экраном, необходимо вызвать что-либо другое.
Драйверы сенсорного экрана расположены в ядре/драйверы/вход/сенсорный экран. Также существует некоторый прямой код в ядре/драйверах/входе.
Есть подсказки о том, как связать это устройство HID со слоем сенсорного экрана Android? Я смотрю, как они сделали старый резистивный, и это не делается через HID, потому что это «заказное» устройство с ADC интегрированы в ЦП, и он не проходит через USB.