Другие языки программирования и технологии
Делфи. Есть указатель типа 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) исторически откель взялся 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 - тоже будет корректной записью.
Паскаль хранит строки как [Длинна строки] [элементы строки]
си: [Элементы строки] {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 - тоже будет корректной записью.
почему на структуру? Тип PChar - указатель на значение символа.
Похожие вопросы
- (delphi) Я заношу в массив ссылки на записи. Как получить доступ к полям записи?
- Доступ к полям другого класса. C# Подробно внутри!
- Как получить доступ к редактированию Реестра на своем компе.
- uTorent начинаю качать пишет ошибку Процесс не может получить доступ к файлу, так как этот файл занят другим процессом (
- Как получить доступ на диск C?
- Как получить доступ к файловой системе компьютера пользователя зашежшого на мой сайт
- Несколько вопросов по Делфи. что такое указатели и зачем они нужны, зачем нужна @ ,и что за тип Pointer.
- Pascal, структура данных "Cтек"
- Pascal, структура данных двусвязанный список
- [C/C++] Oбъявление переменной типа структуры в этой же структуре
Проблема, конечно уже решена, но довольно криво - в bass.pas просто изменил тип возвращаемого значения с PChar на Pointer, но хотелось бы по-человечески сделать все...