2012-06-13 3 views
0

Я меняю некоторые коды в библиотеке базы данных. Как это работает, я отправляю указатель на пустоту, чтобы получить размер его, я вызываю запрос и используя запрос, я вычисляю размер структуры. Теперь проблема в том, что я получаю struct как params, но функция не работает до/в середине первой выборки. После этого мне нужно очистить структуру, но у меня даже нет размера. Я знаю, что лучший способ - отправить размер структуры в качестве параметра, но у меня уже собраны тысячи и тысячи программ, библиотека - с 1996 года, поэтому мне нужно найти способ вычисления размера структуры, даже если тип недействительным.Получить размер структуры, переданной как функция void

Одна идея у меня было вычислить положение следующего элемента, который не в структуре

0x000010    0x000042 
[int|char[30]|int|int][int] 

Так размер 32, потому что 0x00042-0x000010 является 32.

Есть способ узнать, когда я вышел из строя.

прототип функции

int getData(char* fields, void* myStruct) 

Мне нужно узнать размер структуры.

Извините, если я пропустил какую-либо информацию, код ОГРОМНЫЙ и, к сожалению, я не могу опубликовать его здесь.

+0

Вы листинг myStruct для какого-либо типа структуры? Если это так, вы можете просто использовать sizeof этой структуры? – djechlin

+0

Что такое '0x000010 0x000042 [int | char [30] | int | int] [int]'? BTW «0x00042 - 0x000010» - * 0x * 32. – wildplasser

+0

Вы знаете что-нибудь о структуре структуры? Является ли переменный размер, в зависимости от первого поля int? BTW: размер 0x32 (50 десятичных знаков) не очень вероятен, так как ints необходимо выровнять по 4-байтовой границе (при условии, что 4 байта int и т. Д.) – wildplasser

ответ

5

Нет, в общем, нет способа, учитывая void *, чтобы выяснить, что вы после. Единственное, что вы можете сделать, это сравнить его с NULL, что, конечно, здесь не помогает.

Обратите внимание, что ничего нет в void *, что даже говорит, что он указывает на struct, он может точно также указывать на середину массива.

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

+0

Yup, главный недостаток 'void *' заключается в том, что он буквально означает * никакой информации о типе вообще * ... –