Большой Воронежский Форум
Страница 1 из 3
1 23 >
» Программирование>контроль типов С++
xxx-men 11:57 20.03.2008
есть такой код:

Сообщение от :
#include "megaClass.h"
void sekas_I_vs_pointer(void* p)
{
/*
тут какието извращения
*/
};

int main()
{
int* a= new int;
char* b= new char;
bool* c= new bool;
megaClass* d= new megaClass;

sekas_I_vs_pointer(a);
sekas_I_vs_pointer(b);
sekas_I_vs_pointer(c);
sekas_I_vs_pointer(d);

return 0;
}

компилятор естественно выдает 4 ошибки
можно действовать "как в школе учили"....

но есть такое ощущение, что это можно исправить с помощью какихто галочек в компиляторе...вопрос: каких?
[Ответ]
The_God 12:26 20.03.2008
мистика какаято

Сообщение от xxx-men:
выдает 4 ошибки

процитируй их плз

и какой компилятор ?
[Ответ]
p51x 12:44 20.03.2008
попробуй: sekas_I_vs_pointer((void *) a); [Ответ]
xxx-men 13:23 20.03.2008

Сообщение от The_God:
мистика какаято

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

попытка 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);
...........

зы: юзать ссылку неполучица [Ответ]
The_God 15:40 20.03.2008
в третьем вариенте почемубы не сделать переменную 'а' типа 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 * и преобразовывать

-------------

добавлено
например:
{
CMyClass obj1 ( ....... );
func ( ( void * ) & obj1 );
}

void * func ( void * mes )
{
CMyClass obj1 = * ( ( CMyClass * ) mes );
} [Ответ]
The_God 18:09 20.03.2008
пример который показывает для чего нужен контроль типов если его "отключить" то получится не с++.

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 18:21 20.03.2008

Сообщение от Ivan XXX:
там по правилам так надо

ну надо, так надо [Ответ]
xxx-men 19:09 20.03.2008

Сообщение от The_God:
а где лежит информация об оригинальных типах, к которым нужно преобразовывать те элементы void* чтобы их вернуть из небытия безтипности ?

ну например, на тетрадном листочке.... [Ответ]
sanpol 19:29 20.03.2008
Одним словом sekas [Ответ]
xxx-men 11:06 21.03.2008

Сообщение от The_God:
пример который показывает для чего нужен контроль типов ...

хороший пример, начинает казаца, что отключить контроль типов нельзя...

Сообщение от The_God:
это из тойже оперы что и использование goto - если религия позволяет, то используют, если нет - то не используют.

а если религия не позволяет юзать ваще какие либо указатели....тоже можно...

последний не ясный вопрос: как будет красивее?
(*((LISTSCRIPT**)v))=((*((LISTSCRIPT**)v))->pNext)->pNext;
или
LISTSCRIPT** temp = (LISTSCRIPT**)v;
*temp=((*temp)->pNext)->pNext; [Ответ]
The_God 13:02 21.03.2008
если v это void * v, то я бы так записал:

LISTSCRIPT*& temp = *static_cast< LISTSCRIPT ** >( v );
temp = temp->pNext->pNext; [Ответ]
xxx-men 16:01 21.03.2008

Сообщение от 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 вбиваю нужный адрес, и все красиво смотрица
[Ответ]
Страница 1 из 3
1 23 >
Вверх