Срочно! Корректно ли в C преобр-е из void*
От: renton  
Дата: 03.12.02 09:22
Оценка:
Привет Все!
Помогите пожалуйста. Корректно ли по стандарту С преобразование типов из void* в указатели на другие типы (неявное).
Напр.:

void* var1;
char* var2;
...
StrCopy(var2, var1);//СОГЛАСУЕТСЯ ЛИ С ANSI C???


Только пожалуйста, аргументированно!!!
Спасибо!!
Re: Срочно! Корректно ли в C преобр-е из void*
От: Bell Россия  
Дата: 03.12.02 09:32
Оценка:
Здравствуйте, renton, Вы писали:

Избыточное цитирование удалено модератором. -- ПК

R>Корректно ли по стандарту С преобразование типов из void* в указатели на другие типы (неявное).


Тебе известны другие способы преобразования в С? Мне — нет.
А вообще подобные преобразования весьма широко используются в С. Другое дело, что ответственность за корректность таких преобразований лежит исключительно на программисте.
Любите книгу — источник знаний (с) М.Горький
Re[2]: Срочно! Корректно ли в C преобр-е из void*
От: renton  
Дата: 03.12.02 09:36
Оценка:
Здравствуйте, Bell, Вы писали:

Избыточное цитирование удалено модератором. -- ПК

R>>void* var1;

R>>char* var2;
R>>StrCopy(var2, var1);//СОГЛАСУЕТСЯ ЛИ С ANSI C???

B>Тебе известны другие способы преобразования в С? Мне — нет.


Известны. Можно написать StrCopy(var2, (char*)var1);
И это точно будет правильно.
Вопрос в том, правильно ли неявное преобразование.
Re: Срочно! Корректно ли в C преобр-е из void*
От: totosha  
Дата: 03.12.02 09:36
Оценка:
Здравствуйте, renton, Вы писали:

R>Помогите пожалуйста. Корректно ли по стандарту С преобразование типов из void* в указатели на другие типы (неявное).


Да.

R>Напр.:


R>void* var1;
R>char* var2;
R>...
R>StrCopy(var2, var1);//СОГЛАСУЕТСЯ ЛИ С ANSI C???


Зависит от того, что такое StrCopy.

R>Только пожалуйста, аргументированно!!!


6.3.2.3/1 в стандарте.
Re[2]: Срочно! Корректно ли в C преобр-е из void*
От: renton  
Дата: 03.12.02 09:46
Оценка:
T>Зависит от того, что такое StrCopy.
Ну, обычный char* StrCopy(char* param1, char* param2);

R>>Только пожалуйста, аргументированно!!!

T>6.3.2.3/1 в стандарте.
А Вы могли бы дать мне ссылку на стандарт? А то я уже столько всего облазил, нигде найти не могу
Спасибо!!!
Re[3]: Срочно! Корректно ли в C преобр-е из void*
От: Аноним  
Дата: 03.12.02 09:47
Оценка:
Здравствуйте, renton, Вы писали:

R>Известны. Можно написать StrCopy(var2, (char*)var1);

R>И это точно будет правильно.
R>Вопрос в том, правильно ли неявное преобразование.

В Си — да. В Си++ преобразование указателя произвольного типа в void* может выполняться неявно, а обратные — только явно (рекомендуемая нотация — static_cast< char* >(var1)).
Re[4]: Срочно! Корректно ли в C преобр-е из void*
От: renton  
Дата: 03.12.02 10:00
Оценка:
А>В Си — да. В Си++ преобразование указателя произвольного типа в void* может выполняться неявно, а обратные — только явно (рекомендуемая нотация — static_cast< char* >(var1)).

Супер, моя репутация спасена тьфу-тьфу-тьфу.
Но УМОЛЯЮ, дайте ссылку на стандарт, или вырезку из него!!!!!!!
(им. в виду ANSI C)
Мне нужно аргументировать свою (вроде правильную) точку зрения перед работодателем.
Спасибо еще раз!!
Re: Срочно! Корректно ли в C преобр-е из void*
От: SL57  
Дата: 03.12.02 10:20
Оценка:
Здравствуйте, renton, Вы писали:

R>Привет Все!

R>Помогите пожалуйста. Корректно ли по стандарту С преобразование типов из void* в указатели на другие типы (неявное).


Другизх способов в C дейсвительно нет.

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

struct MyVARIANT
{
void* mData;
int mSize;
enum TYPE
{
eInt,
eLong,
// ...
} mType;

operator int();
operator long();
// ....
operator = (int a);
// ...
};

Но это может быть излишком.
Re[3]: Срочно! Корректно ли в C преобр-е из void*
От: totosha  
Дата: 03.12.02 10:32
Оценка:
Здравствуйте, renton, Вы писали:

R>Ну, обычный char* StrCopy(char* param1, char* param2);


Тогда корректно.

R>А Вы могли бы дать мне ссылку на стандарт? А то я уже столько всего облазил, нигде найти не могу


После непродолжительных поисков нашлось такое:

ftp://ftp.iks-jena.de/pub/mitarb/lutz/standards/iso/iso9899-c99.pdf
(Это C99)

ftp://ftp.iks-jena.de/pub/mitarb/lutz/standards/iso/iso14882-C++98.pdf
(Это C++)
Re[4]: Срочно! Корректно ли в C преобр-е из void*
От: renton  
Дата: 03.12.02 10:53
Оценка:
T>После непродолжительных поисков нашлось такое:

T>ftp://ftp.iks-jena.de/pub/mitarb/lutz/standards/iso/iso9899-c99.pdf

T>(Это C99)

T>ftp://ftp.iks-jena.de/pub/mitarb/lutz/standards/iso/iso14882-C++98.pdf

T>(Это C++)

HTTP 404 (((((
Re[2]: Срочно! Корректно ли в C преобр-е из void*
От: Павел Кузнецов  
Дата: 03.12.02 11:07
Оценка:
Здравствуйте, SL57, Вы писали:

R>>Корректно ли по стандарту С преобразование типов из void* в указатели на другие типы (неявное).


SL>Другизх способов в C дейсвительно нет.


Как уже было сказано, это утверждение не является верным, есть еще явные преобразования типов — приведения.

SL>
SL>struct MyVARIANT
SL>{
SL>void* mData;
SL>int mSize;
SL>enum TYPE
SL> . . .
SL>operator int();


SL>Но это может быть излишком.


Хуже того — это не является кодом на C.
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Re[3]: Срочно! Корректно ли в C преобр-е из void*
От: SL57  
Дата: 04.12.02 08:15
Оценка:
Здравствуйте, Павел Кузнецов, Вы писали:

ПК>Хуже того — это не является кодом на C.

Я немного потропился.
На С это могдо бы быть так :

///////////////////////////////////////////
// TestServer.h file
///////////////////////////////////////////
enum ETYPE
{
eInt,
eLong
} ;


typedef struct HideType
#ifdef DISABLE_ACCESS
{
void* mData;
enum ETYPE mType;
}
#endif
HideType;

void CreateMyVariant(HideType** aRetVal);
void SetInt(const HideType* aParam,int aVal);
void SetLong(const HideType* aParam,long aVal);
int GetInt(const HideType* aParam);
long GetLong(const HideType* aParam);

///////////////////////////////////////////
// TestServer.c file
///////////////////////////////////////////
#define DISABLE_ACCESS
#include "TestServer.h"
#undef DISABLE_ACCESS

void CreateMyVariant(HideType** aRetVal)
{
// ...
}

void SetInt(const HideType* aParam,int aVal)
{
// ...
}

void SetLong(const HideType* aParam,long aVal)
{
// ...
}

int GetInt(const HideType* aParam)
{
if(aParam && eInt == aParam->mType)
return *((int*)(aParam->mData));
return 0;
}
long GetLong(const HideType* aParam)
{
if(aParam && eLong == aParam->mType)
return *((long*)(aParam->mData));
return 0;
}

///////////////////////////////////////////
// TestClient.c file
///////////////////////////////////////////
#include "TestServer.h"

HideType* theType = 0;
CreateMyVariant(&theType);
SetInt(theType,10);
// ...
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.