Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
2-1448453729
lamok
2015-11-25 15:15
2017.10.22
Подскажите как реализовать ввод текста


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


2-1448787318
vegarulez
2015-11-29 11:55
2017.10.22
TWebBrowser [CommandStateChange] получение перменных.


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


2-1448611590
ShurikSNZ
2015-11-27 11:06
2017.10.22
При компиляции в новой версии выдает ошибку constant expression v





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский