Другие языки программирования и технологии

Делфи. Есть указатель типа PChar, он указывает на структуру, как получить доступ к полям этой структуры?

Возможно, не так все понимаю, есть var tags:pchar; begin tags:= bass_ChannelGetTags(mu,BASS_TAG_ID3); //Если писать tags:tag_id3 - выдает ошибку, т.к. функция // возвращает PChar end; где typedef struct { char id[3]; char title[30]; char artist[30]; char album[30]; char year[4]; char comment[30]; BYTE genre; } TAG_ID3; Пример из хелпа: TAG_ID3 *id3=(TAG_ID3*)BASS_ChannelGetTags(channel, BASS_TAG_ID3); // get the ID3 tags if (id3) printf("title = %.30s\n", id3->title); // display the title И я не знаю, как это пример переделать с С++ на Паскаль, хотя и понимаю, что там происходит...
Одил Усмонов
Одил Усмонов
1 598
1) исторически откель взялся PChar.
Паскаль хранит строки как [Длинна строки] [элементы строки]
си: [Элементы строки] {0}
Так же еще нужно понимать, что ни один здравомыслящий программист не будет передавать массивы запихивая их в стек. Он передаст указатель на массив. И быстро и безопасно.
Все ОС вклчая винду написаны на сях, так что строки они принимают в формате си. Соответсвенно подобные параметры передаются в виде указателя на сишную строку (если еще более углубиться в проблему, то так удобно передавать любой буффер состоящий из изначально неопределенного количества байт)
Соответвенно программистам борланда надо было умудриться в свое время скрестить паскаль с виндой - появился тип PChar, необходимость выполнить его в виде класса возникла только из желания сделать "прозрачное" приведение типов, то есть String -> Pchar что бы делалось как можно более автоматически. И других функций этот класс (а не структура) не имеет.
2) эквивалент вашей структуры в паскале будет следущий
TTagID = record
Id : array [0..2] of char;
Title: array[0..29] of char;
Artist: array[0..29] of char;
Album: array[0..29] of char;
Year: array[0..3] of char;
Comment: array [0.29] of char;
genre: byte;
end;
3) Теперь вас должно заинтересовать, как же получив эту структуру в виде указателя на нее типа PChar вытащить значимые части
заводим еще один тип PTagID = ^TTagID; указатель на нашу структуру, далее если переменная a- типа PChar и предположительно содержит стуктуру, а Переменная B:PTagID; то после выполнения b= PTagID(a); можно получить доступ к полю год как: b^.year, а при определенной опции компилятора (не помню какая, у меня она по умолчанию включена) b.year - тоже будет корректной записью.
Andrey Doldo
Andrey Doldo
8 642
Лучший ответ
почему на структуру? Тип PChar - указатель на значение символа.
Одил Усмонов Да, там запутался, проблема в том, что функция возвращает PChar, а надо - чтобы указатель на структуру, и как это делать непонятно.
Проблема, конечно уже решена, но довольно криво - в bass.pas просто изменил тип возвращаемого значения с PChar на Pointer, но хотелось бы по-человечески сделать все...