Старый 20.03.2008, 11:57   #1   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Question контроль типов С++

есть такой код:
Цитата:
#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 ошибки
можно действовать "как в школе учили"....

но есть такое ощущение, что это можно исправить с помощью какихто галочек в компиляторе...вопрос: каких?
  Ответить с цитированием
Старый 20.03.2008, 12:26   #2   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
мистика какаято

Цитата:
Сообщение от xxx-men
выдает 4 ошибки
процитируй их плз

и какой компилятор ?
  Ответить с цитированием
Старый 20.03.2008, 12:44   #3   
Форумец
 
Сообщений: 130
Регистрация: 02.09.2007
Возраст: 36

p51x вне форума Не в сети
попробуй: sekas_I_vs_pointer((void *) a);
  Ответить с цитированием
Старый 20.03.2008, 13:23   #4   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
мистика какаято
извеняюсь стормозил, думал он будет на типы ругаца, пример неудачный,
ща попробывал и правда все ровно...это не может не радовать

попытка 2
Цитата:
int main()
{
void* a= new int;
int* b= a;
return 0;
}
здесь все коректно но ругаеца, как отключить(если возможно)
  Ответить с цитированием
Старый 20.03.2008, 13:41   #5   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
эта проверка типов - ключевая особенность языка с++, если "отключиш" её, то это уже будет бейсик, луа, перл, но точно не с++.

ps а че за задача где потребовалось такое ?
  Ответить с цитированием
Старый 20.03.2008, 14:02   #6   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
ps а че за задача где потребовалось такое ?
"поторебовалось"-это не совсем то слово, просто так в коде букваф будет меньше
  Ответить с цитированием
Старый 20.03.2008, 15:16   #7   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
Цитата:
Сообщение от xxx-men
в коде букваф будет меньше
лучше когда больше так проще будет через некоторое время понять что в коде делаецца. если влом много писать то ставь visual assistent? он клёво всё подсказывает и дописывает за тебя
  Ответить с цитированием
Старый 20.03.2008, 15:25   #8   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
кстате интересно как будет красивее

Цитата:
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);
...........
зы: юзать ссылку неполучица
  Ответить с цитированием
Старый 20.03.2008, 15:40   #9   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
в третьем вариенте почемубы не сделать переменную 'а' типа LISTSCRIPT* ?

LISTSCRIPT* a = new LISTSCRIPT;
_offScript(&a);
  Ответить с цитированием
Старый 20.03.2008, 16:40   #10   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
в третьем вариенте почемубы не сделать переменную 'а' типа LISTSCRIPT* ?
void* a new LISTSCRIPT, ды такой строчки в программе нет, это просто пример

допустим
большая пачка указателей ,всяких разных типов, лежит где нибуть в массиве/списке....
в конце концов void* не просто же так придумали
  Ответить с цитированием
Старый 20.03.2008, 17:01   #11   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
а ты представь что ты про него не знаеш и не используй его будет код понятнее и красивее

указатели на коекакие хитрые классы нельзя получить обратно из void*

т.е.

среди предков CMyClass есть CParentMyClass.

CMyClass * OrigClass = ...;
void * p = OrigClass;
...
CParentMyClass* ReferenceClass = (CParentMyClass*)( p );

может получиться так что ReferenceClass будет указывать совсем не тудаже куда и OrigClass.
не спасёт даже и dynamic_cast.

ps пример может и не очень удачный, но суть в том что при хитром множественном виртуальном наследовании будут глюки при присваивании к void* а потом обратно.
  Ответить с цитированием
Старый 20.03.2008, 17:48   #12   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
при хитром множественном виртуальном наследовании
дык у меня нету подобной жести

Цитата:
Сообщение от The_God
при присваивании к void* а потом обратно
там наверно просто хитро присвоить нада....



на счет возможности\невозможности отрубить контроль типов, вопрос открыт
  Ответить с цитированием
Старый 20.03.2008, 18:06   #13   
аццкий троглодит
 
Аватар для Ivan XXX
 
Сообщений: 3,236
Регистрация: 28.02.2004
Возраст: 39

Ivan XXX вне форума Не в сети
аргумент функции типа указатель на воид очень напоминает потоки посикс.
преобразовывается туда-обратно все ок. че угодно можно запихать и потом в функции получить. имхо, для того и сделан такой аргумент
Цитата:
Сообщение от 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 );
}
  Ответить с цитированием
Старый 20.03.2008, 18:09   #14   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
пример который показывает для чего нужен контроль типов если его "отключить" то получится не с++.

void* _offScript(void* v)
{ ... }

void* _offScript(LISTSCRIPT* v)
{ ... }


LISTSCRIPT* a = new LISTSCRIPT;
_offScript( a );
  Ответить с цитированием
Старый 20.03.2008, 18:11   #15   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
Цитата:
Сообщение от Ivan XXX
истественно так низя. надо к CMyClass * и преобразовывать
при обычном наследовании можно, при виртуальном низя както так
  Ответить с цитированием
Старый 20.03.2008, 18:13   #16   
аццкий троглодит
 
Аватар для Ivan XXX
 
Сообщений: 3,236
Регистрация: 28.02.2004
Возраст: 39

Ivan XXX вне форума Не в сети
The_God, ну имелось в виду про данный случай, т.е. про void *
  Ответить с цитированием
Старый 20.03.2008, 18:14   #17   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
я уверен что ( при желании ) любую такую задачу где хочется заюзать преобразование к void* а потом преобразование обратно можно решить не используя void*.

это из тойже оперы что и использование goto - если религия позволяет, то используют, если нет - то не используют.
  Ответить с цитированием
Старый 20.03.2008, 18:16   #18   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
Цитата:
Сообщение от xxx-men
большая пачка указателей ,всяких разных типов, лежит где нибуть в массиве/списке....
а где лежит информация об оригинальных типах, к которым нужно преобразовывать те элементы void* чтобы их вернуть из небытия безтипности ?
  Ответить с цитированием
Старый 20.03.2008, 18:17   #19   
аццкий троглодит
 
Аватар для Ivan XXX
 
Сообщений: 3,236
Регистрация: 28.02.2004
Возраст: 39

Ivan XXX вне форума Не в сети
The_God, выше про потоки писал. там по правилам так надо
  Ответить с цитированием
Старый 20.03.2008, 18:21   #20   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
Цитата:
Сообщение от Ivan XXX
там по правилам так надо
ну надо, так надо
  Ответить с цитированием
Старый 20.03.2008, 19:09   #21   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
а где лежит информация об оригинальных типах, к которым нужно преобразовывать те элементы void* чтобы их вернуть из небытия безтипности ?
ну например, на тетрадном листочке....
  Ответить с цитированием
Старый 20.03.2008, 19:29   #22   
Форумец
 
Аватар для sanpol
 
Сообщений: 226
Регистрация: 24.04.2007
Возраст: 39

sanpol вне форума Не в сети
Одним словом sekas
  Ответить с цитированием
Старый 21.03.2008, 11:06   #23   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
пример который показывает для чего нужен контроль типов ...
хороший пример, начинает казаца, что отключить контроль типов нельзя...

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

последний не ясный вопрос: как будет красивее?
(*((LISTSCRIPT**)v))=((*((LISTSCRIPT**)v))->pNext)->pNext;
или
LISTSCRIPT** temp = (LISTSCRIPT**)v;
*temp=((*temp)->pNext)->pNext;
  Ответить с цитированием
Старый 21.03.2008, 13:02   #24   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
если v это void * v, то я бы так записал:

LISTSCRIPT*& temp = *static_cast< LISTSCRIPT ** >( v );
temp = temp->pNext->pNext;
  Ответить с цитированием
Старый 21.03.2008, 16:01   #25   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
LISTSCRIPT*& temp = *static_cast< LISTSCRIPT ** >( v );
ух епть, строчка зохавала мосх, поясните этот момент : *static_cast< LISTSCRIPT ** >( v );
  Ответить с цитированием
Старый 21.03.2008, 16:08   #26   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
static_cast< LISTSCRIPT ** >( v );
почти ( в чем различия читайте в книжках ) тоже самое что и
(LISTSCRIPT**)v;

только первое в стиле с++
а второе в стиле с.
  Ответить с цитированием
Старый 25.03.2008, 22:03   #27   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Question отладчик в vs2005

struct MyType
{
int b;
bool c;
char d;
float e;
};
.........
тут код
.........
MyType* Х = new MyType;
void* У = new MyType;
.........
тут код
.........
тут брекпоинт,
отладчиком могу посмотреть все значения структуры на которую указывает Х,
естественно студия не знает на что указывает У, так как void*

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

зы: смотреть значение из памяти - жестокий метод...
  Ответить с цитированием
Старый 25.03.2008, 22:07   #28   
Форумец
 
Аватар для The_God
 
Сообщений: 1,109
Регистрация: 19.12.2004
Возраст: 42

The_God вне форума Не в сети
в строке отладчика напеши (MyType*)У


ps не юзай в коде void* и будет тебе счастье. если тебе его нужно передать в какуюто процедуру в виде параметра void* то указатель на класс сам сконвертится в void*, но изза этого использовать внутри твоей процедуры void* не удобно, не красиво и не нужно.
  Ответить с цитированием
Старый 26.03.2008, 11:13   #29   
Форумец
 
Аватар для MadFish
 
Сообщений: 340
Регистрация: 25.07.2002

MadFish вне форума Не в сети
Цитата:
Сообщение от The_God
ps не юзай в коде void* и будет тебе счастье.
А вот я юзал, юзаю, и буду юзать дальше !!! И ты тоже будешь!!! IUnknown еще никто не отменял
  Ответить с цитированием
Старый 26.03.2008, 11:45   #30   
Форумец
 
Аватар для xxx-men
 
Сообщений: 1,149
Регистрация: 18.09.2006
Возраст: 40

xxx-men вне форума Не в сети
Цитата:
Сообщение от The_God
ps не юзай в коде void* и будет тебе счастье
несогласен

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

Цитата:
Сообщение от The_God
но изза этого использовать внутри твоей процедуры void* не удобно, не красиво
ды это понятно


теперь по поводу вопроса:
Цитата:
Сообщение от The_God
в строке отладчика напеши (MyType*)У
ващенифиганепонял..... можно по подробнее ? можно даже с картинками

зы:
пока делаю деревенским методом, собственной разработки(с)
где то в программе вписана MyType* debugVar;
когда мне надо глянуть значение, в debugVar вбиваю нужный адрес, и все красиво смотрица
  Ответить с цитированием
Поиск в теме: 



Быстрый переход:

  Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.


Powered by vBulletin® Version 3.8.7
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd. Перевод: zCarot
Support by DrIQ & Netwind