Использование пустых указателей в расчетах - PullRequest
3 голосов
/ 05 июля 2011

Это довольно длинное введение в простой вопрос, но в противном случае возникнут вопросы типа «Почему вы хотите обрабатывать пустые указатели в C ++? Вы ужасный человек!».Что я предпочел бы (а) void. :)

Я использую библиотеку C, из которой я извлекаю список полигонов, с которыми она будет работать.Функция, которую я использую, дает мне массив указателей (PolygonType**), из которых я создаю std::vector<MyPolyType> моего собственного класса многоугольников MyPolyType.Это, в свою очередь, используется для создания boost::graph с идентификаторами узлов, заданными индексом в векторе.

В более позднее время выполнения я хочу вычислить путь между двумя полигонами.Эти полигоны даны мне в виде двух PolygonType*, но я хочу найти соответствующие узлы на моем графике.Я могу найти их, если я знаю индекс, который они имели в предыдущей векторной форме.

Теперь вопрос: структура PolygonType имеет void* к «внутреннему идентификатору», тип которого, кажется, мне неизвестен.Однако я знаю, что указатель увеличивается с фиксированным шагом (120 байт).И я знаю значение указателя, который будет смещением первого объекта.Могу ли я использовать это для вычисления моего индекса с помощью (p-p0)/120, где p - это адрес многоугольника, который я хочу найти, а p0 - это смещение первого многоугольника?Мне бы пришлось перевести адреса на int с, это портативный?(Приложение можно использовать на Windows и Linux)

Ответы [ 2 ]

6 голосов
/ 05 июля 2011

Вы не можете вычесть два пустых указателя. Компилятор будет кричать, что он не знает размер. Сначала вы должны привести их к указателям на символы (char*), а затем вычесть их, а затем разделить на 120. Если вы абсолютно уверены, что размер вашего объекта на самом деле равен 120, то это безопасно (хотя и некрасиво) при условии, что p и p0 указывают на объекты в одном и том же массиве

Я до сих пор не понимаю, почему смещение p0? Я бы сказал, что p - это адрес вашего многоугольника, а p0 - это адрес первого многоугольника ... Я что-то неправильно понимаю?

2 голосов
/ 05 июля 2011

Учитывая, что указатель указывает на «внутренний идентификатор», я не думаю, что вы можете делать какие-либо предположения о фактических значениях, хранящихся в нем.Если указатель может указывать на кучу, возможно, вы просто видите один из возможных наборов значений, и в будущем он будет слегка (или явно) сломан.

Почему бы просто не создать одноразовое обратное отображение * 1003?* -> index и использовать это?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...