Здравствуйте, aIex, Вы писали:
I>Подзабыл чегой-то, как узнать на что указывает указатель void*? Варианты лишь I>1. строка с нулевым символом-ограничителем, проще, строка, и тогда I>
I>printf(" %s\n", (char*)p_void );
I>
I>2. или число, тогда так: I>
I>printf(" %d\n", (int)p_void );
I>
Туда же, куда и все другие указатели — в память. void — это просто отмена проверки согласованности типов, а содержимое от этого не меняется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
...а если побайтово "пройтись" по тем данным, например с помощью
int isdigit (int C), проверить, нет ли там цифирек,
или поискать \0 где-нибудь в конце?
Здравствуйте, aIex, Вы писали:
I>Немного не так, вот правильная версия: I>
I>printf(" %s\n", *(char**)p_void );
I>
I>
I>printf(" %d\n", (int*)p_void );
I>
Без классов — никак нельзя. Никакой информации о встроенном типе на этапе выполнения не остается. Поэтому по указателю узнать тип — невозможно.
Тут, видимо, самый простой способ — использовать большой switch.
Вроде этого
enum Type {Int, Long, UnsignedLong, Float, Double };
int NumberToASCII(Type t, void *n, char buffer[])
{ switch (t)
{ case Int:
{ int k = *(int *)n; //--«обман» компилятора
buffer = _itoa(k, buffer,10); break; }
case Long:
{ long k = *(long *)n; //--«обман» компилятора
buffer = _ltoa(k, buffer,10); break; }
case UnsignedLong:
{ unsigned long k = *(unsigned long *)n;
buffer = _ultoa(k, buffer,10); break; }
case Float:
{ double k = *(float *)n; //--«обман» компилятора
buffer = _gcvt(k, 4, buffer); break; }
case Double:
{ double k = *(double *)n; //--«обман» компилятора
buffer = _gcvt(k, 16, buffer); break; }
default:
cout << "Wrong types"<< endl;
return -1;
}
return 0;
}
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Здравствуйте, aIex, Вы писали:
a> ...а если побайтово "пройтись" по тем данным, например с помощью a> int isdigit (int C), проверить, нет ли там цифирек, a> или поискать \0 где-нибудь в конце?
То получишь искомый segmentation fault или, еще хуже, будешь думать, что твоя программа "работает".
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, aIex, Вы писали:
I>...вот мне и надо узнать, какой printf выбирать в зависимости I>от тех данный, на которые указывает void*, чтобы не "налететь" I>на segmentation fault
А вот с этого места — поподробнее. Что это за разнородные данные, которые ты привел к единому void* ?
Если ты пишешь функцию с переменным числом параметров, то дважды подумай, а не является ли ошибкой воспринимать очередной va_arg как void*? (Является-является!)
Если функция с фиксированным числом параметров — значит, это ошибка в проектировании.
Здравствуйте, aIex, Вы писали:
I>Подзабыл чегой-то, как узнать на что указывает указатель void*? Варианты лишь I>1. строка с нулевым символом-ограничителем, проще, строка, и тогда I>
I>printf(" %s\n", (char*)p_void );
I>
I>2. или число, тогда так: I>
I>printf(" %d\n", (int)p_void );
I>
Никак не узнать. Когда содержимое этой памяти формировалась, тогда было известно, что это — стрка или число. Вот это знание и надо было как-то сохранить.
Здравствуйте, aIex, Вы писали:
I>...а если побайтово "пройтись" по тем данным, например с помощью I>int isdigit (int C), проверить, нет ли там цифирек,
Каких еще цифирек???? Вспоминаем, как числа хранятся в памяти. (Hint — не в виде ASCII-строк.)
I>или поискать \0 где-нибудь в конце?
И жизнерадостно вылететь за границы выделенной памяти или найти какой-нибудь случайный нулевой байт (Hint — например, если там просто хранится целое число — 0).