Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2017.10.22;
Скачать: CL | DM;

Вниз

Пару вопросов про указатели   Найти похожие ветки 

 
Арлекино ©   (2015-11-26 11:39) [0]

Добрый день. Есть вопросы про указатели, которые не понимаю и не могу найти ответа. Попробую задать их здесь.

Первый:

type
PPAnsiChar = ^PAnsiChar;

var
ms, ms2: TMemoryStream;
data: PPAnsiChar;
begin
// В data содержится корректная информация
ms := TMemoryStream.Create;
ms2 := TMemoryStream.Create;

// Размер необходимой информации 32 байта
ms.WriteBuffer(data^, 32); // Получаю не то, что ожидал
ms2.WriteBuffer(data^[0], 32); // Получаю то, что ожидал

ms.SaveToFile(ExtractFilePath(Application.ExeName) + "0.txt");
ms2.SaveToFile(ExtractFilePath(Application.ExeName) + "1.txt");
end;

Разве в данном случае указатель на PAnsiChar не то же самое, что указатель на AnsiChar?

Второй:

Как будет верно перевести работающий пример с MemoryStream к варианту с использованием Move?
Ни один из ниже приведенных кодов не работает

Move(data^[0], b, 32);
Move(data^, b, 32);

Спасибо


 
Игорь Шевченко ©   (2015-11-26 11:51) [1]

А можно узнать, чего хочется, а не как хочется ?


> Разве в данном случае указатель на PAnsiChar не то же самое,
>  что указатель на AnsiChar?


Нет, это разные типы указателей


 
DVM ©   (2015-11-26 12:15) [2]


> ms.WriteBuffer(data^, 32); // Получаю не то, что ожидал

Ты пишешь в поток символы, начиная с первого байта самого адреса


> ms2.WriteBuffer(data^[0], 32); // Получаю то, что ожидал

Ты пишешь в поток символы начиная с первого байта по адресу . При этом происходит неявное разыменование. На самом деле выполняется следующее:

ms2.WriteBuffer((data^)^[0], 32);


 
Арлекино ©   (2015-11-26 13:13) [3]

Спасибо за такие быстрые ответы


> А можно узнать, чего хочется, а не как хочется ?


Хочется вытащить необходимую информацию (знаю, как должна выглядеть) из пришедшего извне (не моего) PPAnsiChar. Документации нет, разработчик недоступен, методом тыка пытаюсь понять, как хранятся данные. Если с простыми указателями я еще худо-бедно справляюсь (опыт работы с ними практически отсутствует), то "указатели на указатель" смущают и пугают.


> DVM ©

Спасибо, ясна разница. Но конструкция


> (data^)^[0]


заставляет шевелиться волосы на голове.

data - PPAnsiChar
data^ - PAnsiChar
(data^)^ - AnsiChar

верно? Тогда что такое AnsiChar[0]?

Вопрос про Move остается, ибо эта конструкция даже не компилируется


 
Игорь Шевченко ©   (2015-11-26 18:32) [4]


> "указатели на указатель" смущают и пугают


Представь, что PPAnsiChar - это указатель на массив PAnsiChar


 
DVM ©   (2015-11-26 19:37) [5]


> Тогда что такое AnsiChar[0]

Это не правильная запись. В моем ответе во втором варианте ноль в квадратных скобках не нужен это опечатка.


 
Юрий Зотов ©   (2015-11-26 20:01) [6]

> "указатели на указатель" смущают и пугают.

А чего там смущаться-то?

Указатель - переменная, содержащая адрес чего-то.

Указатель на указатель - переменная, содержащая адрес указателя.

Указатель на указатель на указатель - переменная, содержащая адрес указателя на указатель.

И т.д. Ничего сложного, только при кодинге аккуратность нужна.


 
DVM ©   (2015-11-26 20:04) [7]

Чтобы работал move надо внести ясность, что есть b.    

B: PAnsiChar;
....
Getmem(b, 33);
Fillchar(b^, 33, 0);
Move((data^)^, b^, 32);


 
Арлекино ©   (2015-11-28 05:07) [8]

Спасибо всем


 
Германн ©   (2015-11-29 01:21) [9]

Удалено модератором
Примечание: Создание пустых сообщений



Страницы: 1 вся ветка

Текущий архив: 2017.10.22;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.004 c
2-1448527183
Арлекино
2015-11-26 11:39
2017.10.22
Пару вопросов про указатели


2-1448552760
SitiZen
2015-11-26 18:46
2017.10.22
Формула


2-1448345611
lewka
2015-11-24 09:13
2017.10.22
html код выполненного JavaScript


2-1446125074
NitroTek
2015-10-29 16:24
2017.10.22
Шаблоны


2-1448453729
lamok
2015-11-25 15:15
2017.10.22
Подскажите как реализовать ввод текста