Загадковий тип pchar

Привіт, дельфісти! Сьогодні вам поведу, що це за тип PCHAR. І як його коректно використовувати. Цей тип згадується у всіх API функції, які приймають в якості параметра будь-яке строкове значення.

Після даних маніпуляцій змінна str буде дорівнює 'ProgLammersclub.ru', зауважу, що перший символ в рядку має індекс 1. Так як тип string і тип array of char подібні слідчий їх можна привласнити один до одного. Але, при присвоєнні змінної масиву змінної рядка буде помилка, так як у масиву ми жорстко ставимо розмір масиву, а у рядки ми не знаємо довжину навіть при її обмеженні.

Ну, якщо цей тип вказує на тільки один символ, то, як же функції розуміють параметри, які ми передаємо їм. Все дуже просто. Кожен рядок, передана в якості параметра будь-якої функції повинна мати в кінці символ # 0. Функція за вказівником знаходить перший символ рядка і йде далі поки не наткнеться на символ # 0. Delphi автоматизувала перетворення рядка коли в параметрі ми вказуємо саму рядок: MessageBox (0, 'привіт', 'привіт', 0) тут автоматика, а почему не автоматика при вказування змінних я не знаю. Ми завжди пишемо

Все нормально. Той же результат при використанні покажчиків.

Це тому що масиви зазвичай заповнюються нулями.

Приклад 1: Зовсім інша історія:

У повідомленні перед двійкою стоіткакой то символ. Це тому що нумерація в Delphi може починатися з будь-якого індексу, в даному випадку вона починається 1, а 0 символ не використовується. Значить те, що я вам сказав на початку це неправильно:

А масив виводиться нормально, тому що Delphi автоматично править покажчик на масив.

Приклад 2: Не знаю чому, але замість двійок виводиться не зрозумій що. Містика.

Звідси зрозуміло що спочатку всі змінні заповнюються нулями. І змінна STR тому не виключення.

Приклад 4: Цікава ситуація:

Як бачите в заголовку є символи 'hs' потім квадратик потім двійки. Всьому є розумне пояснення. Рядок STR_ARR не закінчується нулем, отже, функція не знайшла нуль тільки в кінці рядка STR_ARR і пішла далі до змінної STR, тому рядок STR_ARR вийшла такою довгою. Квадратик в після рядка 'hs' зрозумілий з першого прикладу.

>> Type
>> PCHAR: ^ CHAR; // отже також і тип WideChar
>> PWIDECHAR: ^ WIDECHAR;

такий код викличе помилку - тип в розділі type в паскале задається знаком = а не двокрапкою;


>> Приклад 2: Не знаю чому, але замість двійок виводиться не >> зрозумій що. Містика.
>> var
>> STR_ARR: array [1..2] of char;
>> STR: String; // будь-яка довжина
>> begin
>> str_ARR [1]: = 'h';
>> str_ARR [2]: = # 0;
>> STR: = '22' + # 0;
>> MessageBoxA (Handle, @ STR, @ str_ARR, MB_OK);

для цієї мети треба брати @STR [1],

a str_ARR повинен виводитися нормально, тому що це масив char, а не string, в ньому символи зберігаються з нульового байта (незважаючи на те що нумерація в описі типу з одиниці), в Паскалі байти масиву в пам'яті зберігаються з 0-го байта структури даних

Та це взагалі школяр якийсь писав, подивіться на стиль викладу і граматичні помилки.

Type
PCHAR: ^ CHAR; // отже також і тип WideChar
PWIDECHAR: ^ WIDECHAR;

оБшібся, оБшібся. спасибі за резензію статті

Схожі статті