Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 06:06
Оценка:
Есть структура:

    struct R
    {
        int a,b;
    };


Нужно установить нетипизированный указатель PPTR на запись R. Вот в делфях это делается с помощью объявления типа pointer, а как в С/C++/C#?
Владея информацией, владеешь миром. Уинстон Черчилль
Re: Нетипизированный указатель
От: Master Yoda Великобритания  
Дата: 06.09.06 06:15
Оценка: 3 (1)
Здравствуйте, DioNNis, Вы писали:

DNN>Нужно установить нетипизированный указатель PPTR на запись R. Вот в делфях это делается с помощью объявления типа pointer, а как в С/C++?


void*




DNN>C#?


Что-нибудь вроде System.IntPtr, только непонятно зачем
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
It is always bad to give advices, but you will be never forgiven for a good one.
Oscar Wilde
Re: Нетипизированный указатель
От: oleksab Украина  
Дата: 06.09.06 06:17
Оценка: 3 (1)
Здравствуйте, DioNNis, Вы писали:

DNN>Нужно установить нетипизированный указатель PPTR на запись R. Вот в делфях это делается с помощью объявления типа pointer, а как в С/C++/C#?


void *v;
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
Re[2]: Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 06:18
Оценка: :)
А я вот еще сейчас нашел, LINK — это то?
Владея информацией, владеешь миром. Уинстон Черчилль
Re: Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 06:44
Оценка: :)
Здравствуйте, DioNNis, Вы писали:

Я делую вот так:


    void *PPTR;
    PPTR=(struct R*)malloc(sizeof(struct R));

Но при этом почему то место не освобождается под PPTR, он как был нетипизированным указателем, так и остался..., т.е. присвоить значение полям нет никакой возможности... помогите пожалуйста...
Владея информацией, владеешь миром. Уинстон Черчилль
Re[2]: Нетипизированный указатель
От: Figaro Россия  
Дата: 06.09.06 06:50
Оценка:
Здравствуйте, DioNNis, Вы писали:

Приведение типа:

void *PPTR;
PPTR=(struct R*)malloc(sizeof(struct R));
(struct R*)PPTR->a = 1;
free(PPTR);


кажется так, времени нет на проверку...
... << RSDN@Home 1.2.0 alpha rev. 0>>
Re[2]: Нетипизированный указатель
От: Аноним  
Дата: 06.09.06 06:54
Оценка:
DNN>
DNN>    void *PPTR;
DNN>    PPTR=(struct R*)malloc(sizeof(struct R));
DNN>

DNN>Но при этом почему то место не освобождается под PPTR, он как был нетипизированным указателем, так и остался..., т.е. присвоить значение полям нет никакой возможности... помогите пожалуйста...

А что, разве в дельфях можно было присваивать поля через pointer?
Ты бы лучше написал что ты хочешь сделать.
Чем не устраивает:
R *pR = new R;
.....
pR->a = XXX;
.....
delete pR;
Re[3]: Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 06:55
Оценка:
Здравствуйте, Figaro, Вы писали:

F>Здравствуйте, DioNNis, Вы писали:


F>Приведение типа:


F>
F>void *PPTR;
F>PPTR=(struct R*)malloc(sizeof(struct R));
F>(struct R*)PPTR->a = 1;
F>free(PPTR);
F>


F>кажется так, времени нет на проверку...


нет, не прокатывает....
пишет:

left of '->a' must point to class/struct/union/generic type

Владея информацией, владеешь миром. Уинстон Черчилль
Re[3]: Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 06:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А что, разве в дельфях можно было присваивать поля через pointer?

А>Ты бы лучше написал что ты хочешь сделать.
А>Чем не устраивает:
А>
А>R *pR = new R;
А>.....
pR->>a = XXX;
А>.....
А>delete pR;
А>


Тут используется типизированный указатель (R *pR = new R)

А вообще это у меня в лабе задание такое. Оно конечно для делфистов, а я просто делаю на С++, вот у меня и с нетипизированными указателями такая проблема...

12. Написать программу, устанавливающую нетипизированный указатель PPTR на запись R типа

Type
R = record
a, b:real
end;

Для выделения и ликвидации PPTR из памяти использовать функции GETMEM и FREEMEM.
Задать значение полей записи и вывести их на экран через разыменованный указа¬тель PPTR.

Владея информацией, владеешь миром. Уинстон Черчилль
Re[4]: Нетипизированный указатель
От: Аноним  
Дата: 06.09.06 07:04
Оценка:
DNN>

DNN>12. Написать программу, устанавливающую нетипизированный указатель PPTR на запись R типа

DNN>Type
DNN> R = record
DNN> a, b:real
DNN> end;

DNN>Для выделения и ликвидации PPTR из памяти использовать функции GETMEM и FREEMEM.
DNN>Задать значение полей записи и вывести их на экран через разыменованный указа¬тель PPTR.



void *pR = malloc(sizeof(R));
((R*)pR)->a = XXX;
free(pR);
Re[4]: Нетипизированный указатель
От: omka Украина  
Дата: 06.09.06 07:12
Оценка: 2 (1)
Здравствуйте, DioNNis, Вы писали:

DNN>нет, не прокатывает....

DNN>пишет:
DNN>

DNN>left of '->a' must point to class/struct/union/generic type


...
typedef struct Rec { int x } R;
...
void* P = malloc( sizeof( R ) );
( ( R* )P )->x = 5;
...


Усё работает...приводить к типу нужно не результат а указатель, причем на тот тип, на объект которого мы ссылаемся.
А делать
( R* )malloc( sizeof( R ) );

незачем.
Re[5]: Нетипизированный указатель
От: DioNNis http://i-liger.com
Дата: 06.09.06 07:23
Оценка:
А>
А>void *pR = malloc(sizeof(R));
А>((R*)pR)->a = XXX;
А>free(pR);
А>



СПАСИБО!!!!!!!!!!!!!
Владея информацией, владеешь миром. Уинстон Черчилль
Re[4]: Нетипизированный указатель
От: oleksab Украина  
Дата: 06.09.06 09:31
Оценка:
Здравствуйте, DioNNis, Вы писали:

F>>Приведение типа:


F>>
F>>void *PPTR;
F>>PPTR=(struct R*)malloc(sizeof(struct R));
F>>(struct R*)PPTR->a = 1;
F>>free(PPTR);
F>>


DNN>нет, не прокатывает....

DNN>пишет:
DNN>

DNN>left of '->a' must point to class/struct/union/generic type


Пишет компилятор, и совершенно правильно. Для того, чтобы не писал, нужно каждый раз при обращении к члену структуры R приводить PPTR к указателю на R.
((R*)PPTR)->a = 1;
У меня может быть и пробелы в памяти, но что-то мне кажется, что типизированный указатель в Pascal это не совсем то же, что и указатель на структуру (класс) в C++. И задание лабы для C смысла не имеет, ибо разименовав PPTR получим void, а его потом все равно приводить к R. Или можно добавлять к PPTR sizeof() предшествующих членов структуры, чтобы обратиться к какому-то из них. Но при этом нужно учитывать выравнивание, задаваемое опциями компилятора.
Что-то типа (без проверки выравнивания)
struct R 
{
float a;
float b;
};
     void *PPTR = malloc(sizeof(R));
    *((float*)(PPTR)) = 100;
    *((float*)((char*)PPTR + sizeof(float))) = 200;
    free(PPTR);


PS вот из-за возможности написания такого кода и считают С небезопасным языком.
... << RSDN@Home 1.1.4 beta 3 rev. 185>>
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.