извеняюсь стормозил, думал он будет на типы ругаца, пример неудачный,
ща попробывал и правда все ровно...это не может не радовать
попытка 2
Сообщение от :
int main()
{
void* a= new int;
int* b= a;
return 0;
}
здесь все коректно но ругаеца, как отключить(если возможно)
[Ответ]
The_God 13:41 20.03.2008
эта проверка типов - ключевая особенность языка с++, если "отключиш" её, то это уже будет бейсик, луа, перл, но точно не с++.
ps а че за задача где потребовалось такое ?
[Ответ]
xxx-men 14:02 20.03.2008
Сообщение от The_God:
ps а че за задача где потребовалось такое ?
"поторебовалось"-это не совсем то слово, просто так в коде букваф будет меньше[Ответ]
The_God 15:16 20.03.2008
Сообщение от xxx-men:
в коде букваф будет меньше
лучше когда больше так проще будет через некоторое время понять что в коде делаецца. если влом много писать то ставь visual assistent? он клёво всё подсказывает и дописывает за тебя [Ответ]
xxx-men 15:25 20.03.2008
кстате интересно как будет красивее
Сообщение от :
void* _offScript(void* v)
{
(*((LISTSCRIPT**)v))=((*((LISTSCRIPT**)v))->pNext)->pNext;
return 0;
};
........
void* a new LISTSCRIPT;
_offScript(&a);
...........
Сообщение от :
void* _offScript(void* v)
{
LISTSCRIPT** temp = (LISTSCRIPT**)v;
*temp=(*temp)->pNext)->pNext;
return 0;
};
........
void* a new LISTSCRIPT;
_offScript(&a);
...........
или забить (если это возможно) на контроль типов и
Сообщение от :
void* _offScript(LISTSCRIPT** v)
{
*v=((*v)->pNext)->pNext;
return 0;
};
........
void* a new LISTSCRIPT;
_offScript(&a);
...........
в третьем вариенте почемубы не сделать переменную 'а' типа LISTSCRIPT* ?
LISTSCRIPT* a = new LISTSCRIPT;
_offScript(&a);
[Ответ]
xxx-men 16:40 20.03.2008
Сообщение от The_God:
в третьем вариенте почемубы не сделать переменную 'а' типа LISTSCRIPT* ?
void* a new LISTSCRIPT, ды такой строчки в программе нет, это просто пример
допустим
большая пачка указателей ,всяких разных типов, лежит где нибуть в массиве/списке....
в конце концов void* не просто же так придумали[Ответ]
The_God 17:01 20.03.2008
а ты представь что ты про него не знаеш и не используй его будет код понятнее и красивее
указатели на коекакие хитрые классы нельзя получить обратно из void*
т.е.
среди предков CMyClass есть CParentMyClass.
CMyClass * OrigClass = ...;
void * p = OrigClass;
...
CParentMyClass* ReferenceClass = (CParentMyClass*)( p );
может получиться так что ReferenceClass будет указывать совсем не тудаже куда и OrigClass.
не спасёт даже и dynamic_cast.
ps пример может и не очень удачный, но суть в том что при хитром множественном виртуальном наследовании будут глюки при присваивании к void* а потом обратно.
[Ответ]
xxx-men 17:48 20.03.2008
Сообщение от The_God:
при хитром множественном виртуальном наследовании
дык у меня нету подобной жести
Сообщение от The_God:
при присваивании к void* а потом обратно
там наверно просто хитро присвоить нада....
на счет возможности\невозможности отрубить контроль типов, вопрос открыт[Ответ]
Ivan XXX 18:06 20.03.2008
аргумент функции типа указатель на воид очень напоминает потоки посикс.
преобразовывается туда-обратно все ок. че угодно можно запихать и потом в функции получить. имхо, для того и сделан такой аргумент
Сообщение от The_God:
среди предков CMyClass есть CParentMyClass.
CMyClass * OrigClass = ...;
void * p = OrigClass;
...
CParentMyClass* ReferenceClass = (CParentMyClass*)( p );
истественно так низя. надо к CMyClass * и преобразовывать
пример который показывает для чего нужен контроль типов если его "отключить" то получится не с++.
void* _offScript(void* v)
{ ... }
void* _offScript(LISTSCRIPT* v)
{ ... }
LISTSCRIPT* a = new LISTSCRIPT;
_offScript( a );
[Ответ]
The_God 18:11 20.03.2008
Сообщение от Ivan XXX:
истественно так низя. надо к CMyClass * и преобразовывать
при обычном наследовании можно, при виртуальном низя както так
[Ответ]
Ivan XXX 18:13 20.03.2008
The_God, ну имелось в виду про данный случай, т.е. про void *
[Ответ]
The_God 18:14 20.03.2008
я уверен что ( при желании ) любую такую задачу где хочется заюзать преобразование к void* а потом преобразование обратно можно решить не используя void*.
это из тойже оперы что и использование goto - если религия позволяет, то используют, если нет - то не используют.
[Ответ]
The_God 18:16 20.03.2008
Сообщение от xxx-men:
большая пачка указателей ,всяких разных типов, лежит где нибуть в массиве/списке....
а где лежит информация об оригинальных типах, к которым нужно преобразовывать те элементы void* чтобы их вернуть из небытия безтипности ?
[Ответ]
Ivan XXX 18:17 20.03.2008
The_God, выше про потоки писал. там по правилам так надо
[Ответ]
Сообщение от The_God:
а где лежит информация об оригинальных типах, к которым нужно преобразовывать те элементы void* чтобы их вернуть из небытия безтипности ?
Сообщение от The_God:
пример который показывает для чего нужен контроль типов ...
хороший пример, начинает казаца, что отключить контроль типов нельзя...
Сообщение от The_God:
это из тойже оперы что и использование goto - если религия позволяет, то используют, если нет - то не используют.
а если религия не позволяет юзать ваще какие либо указатели....тоже можно...
последний не ясный вопрос: как будет красивее?
(*((LISTSCRIPT**)v))=((*((LISTSCRIPT**)v))->pNext)->pNext;
или
LISTSCRIPT** temp = (LISTSCRIPT**)v;
*temp=((*temp)->pNext)->pNext;
[Ответ]
Сообщение от The_God:
LISTSCRIPT*& temp = *static_cast< LISTSCRIPT ** >( v );
ух епть, строчка зохавала мосх, поясните этот момент : *static_cast< LISTSCRIPT ** >( v );
[Ответ]
The_God 16:08 21.03.2008
static_cast< LISTSCRIPT ** >( v ); почти ( в чем различия читайте в книжках ) тоже самое что и
(LISTSCRIPT**)v;
только первое в стиле с++
а второе в стиле с.
[Ответ]
xxx-men 22:03 25.03.2008
struct MyType
{
int b;
bool c;
char d;
float e;
};
.........
тут код
.........
MyType* Х = new MyType;
void* У = new MyType;
.........
тут код
.........
тут брекпоинт,
отладчиком могу посмотреть все значения структуры на которую указывает Х,
естественно студия не знает на что указывает У, так как void*
если я точно знаю реальный тип переменной У, есть ли возможность обьяснить это отладчику?
зы: смотреть значение из памяти - жестокий метод...[Ответ]
The_God 22:07 25.03.2008
в строке отладчика напеши (MyType*)У
ps не юзай в коде void* и будет тебе счастье. если тебе его нужно передать в какуюто процедуру в виде параметра void* то указатель на класс сам сконвертится в void*, но изза этого использовать внутри твоей процедуры void* не удобно, не красиво и не нужно.
[Ответ]
MadFish 11:13 26.03.2008
Сообщение от The_God:
ps не юзай в коде void* и будет тебе счастье.
А вот я юзал, юзаю, и буду юзать дальше !!! И ты тоже будешь!!! IUnknown еще никто не отменял [Ответ]
xxx-men 11:45 26.03.2008
Сообщение от The_God:
ps не юзай в коде void* и будет тебе счастье
несогласен
Сообщение от The_God:
то указатель на класс сам сконвертится в void*
в void* конвертица все, это я знаю, я просто в начале темы стормозил, пересидел с конвертациями из void* во все подряд
Сообщение от The_God:
но изза этого использовать внутри твоей процедуры void* не удобно, не красиво
ды это понятно
теперь по поводу вопроса:
Сообщение от The_God:
в строке отладчика напеши (MyType*)У
ващенифиганепонял..... можно по подробнее ? можно даже с картинками
зы:
пока делаю деревенским методом, собственной разработки(с)
где то в программе вписана MyType* debugVar;
когда мне надо глянуть значение, в debugVar вбиваю нужный адрес, и все красиво смотрица
[Ответ]