Куда кажет void*?
От: aIex Россия  
Дата: 18.08.03 09:58
Оценка:
Подзабыл чегой-то, как узнать на что указывает указатель void*? Варианты лишь
1. строка с нулевым символом-ограничителем, проще, строка, и тогда
printf(" %s\n", (char*)p_void );

2. или число, тогда так:
printf(" %d\n", (int)p_void );
Re: Куда кажет void*?
От: LaptevVV Россия  
Дата: 18.08.03 10:05
Оценка:
Здравствуйте, 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 — это просто отмена проверки согласованности типов, а содержимое от этого не меняется.
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re: void *
От: aIex Россия  
Дата: 18.08.03 10:08
Оценка:
Немного не так, вот правильная версия:
printf(" %s\n", *(char**)p_void );

printf(" %d\n", (int*)p_void );
Re[2]: Куда кажет void*?
От: aIex Россия  
Дата: 18.08.03 10:11
Оценка:
...вот мне и надо узнать, какой printf выбирать в зависимости
от тех данный, на которые указывает void*, чтобы не "налететь"
на segmentation fault
Re: Куда кажет void*?
От: Vamp Россия  
Дата: 18.08.03 10:20
Оценка:
Никак. Невозможно в принципе.
Да здравствует мыло душистое и веревка пушистая.
Re[2]: Куда кажет void*?
От: aIex Россия  
Дата: 18.08.03 10:29
Оценка: :))) :))
...а если побайтово "пройтись" по тем данным, например с помощью
int isdigit (int C), проверить, нет ли там цифирек,
или поискать \0 где-нибудь в конце?
Re[2]: void *
От: LaptevVV Россия  
Дата: 18.08.03 10:34
Оценка:
Здравствуйте, 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;
}
Хочешь быть счастливым — будь им!
Без булдырабыз!!!
Re[3]: Куда кажет void*?
От: Павел Кузнецов  
Дата: 18.08.03 10:56
Оценка:
Здравствуйте, aIex, Вы писали:

a> ...а если побайтово "пройтись" по тем данным, например с помощью

a> int isdigit (int C), проверить, нет ли там цифирек,
a> или поискать \0 где-нибудь в конце?

То получишь искомый segmentation fault или, еще хуже, будешь думать, что твоя программа "работает".
Posted via RSDN NNTP Server 1.6 RC1
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Куда кажет void*?
От: Кодт Россия  
Дата: 18.08.03 11:54
Оценка:
Здравствуйте, aIex, Вы писали:

I>...вот мне и надо узнать, какой printf выбирать в зависимости

I>от тех данный, на которые указывает void*, чтобы не "налететь"
I>на segmentation fault

А вот с этого места — поподробнее. Что это за разнородные данные, которые ты привел к единому void* ?

Если ты пишешь функцию с переменным числом параметров, то дважды подумай, а не является ли ошибкой воспринимать очередной va_arg как void*? (Является-является!)

Если функция с фиксированным числом параметров — значит, это ошибка в проектировании.
... << RSDN@Home 1.1 beta 1 >>
Перекуём баги на фичи!
Re: Куда кажет void*?
От: Андрей Тарасевич Беларусь  
Дата: 19.08.03 07:12
Оценка:
Здравствуйте, 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>


Никак не узнать. Когда содержимое этой памяти формировалась, тогда было известно, что это — стрка или число. Вот это знание и надо было как-то сохранить.
Best regards,
Андрей Тарасевич
Re[3]: Куда кажет void*?
От: Vamp Россия  
Дата: 19.08.03 08:27
Оценка:
Здравствуйте, aIex, Вы писали:

I>...а если побайтово "пройтись" по тем данным, например с помощью

I>int isdigit (int C), проверить, нет ли там цифирек,
Каких еще цифирек???? Вспоминаем, как числа хранятся в памяти. (Hint — не в виде ASCII-строк.)

I>или поискать \0 где-нибудь в конце?

И жизнерадостно вылететь за границы выделенной памяти или найти какой-нибудь случайный нулевой байт (Hint — например, если там просто хранится целое число — 0).
Да здравствует мыло душистое и веревка пушистая.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.