Форум: "Начинающим";
Текущий архив: 2017.10.22;
Скачать: [xml.tar.bz2];
ВнизПару вопросов про указатели Найти похожие ветки
← →
Арлекино © (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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.001 c