Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];

Вниз

Проблема с PChar   Найти похожие ветки 

 
Giemgo   (2003-04-11 21:53) [0]

Вот мой код:

procedure TForm1.Button1Click(Sender: TObject);
var P:PChar;
begin
P:="Hello";
showmessage(P); //Здесь стоит брекпойнт
end;


По брекпоинту в окне CPU перехожу по адресу переменной P - вижу там полную фигню. Почему ?


 
Giemgo   (2003-04-11 21:57) [1]

Как понимаю, при P:="Hello" компилятор выделяет 5 байт под слово и записывает его в память. @P указывает на первый символ.

В CPU windows символ на который указывает P вовсе не "H" и последующие вовсе не "ello"


 
Palladin   (2003-04-11 21:58) [2]

а что ты там ожидал увидеть?
строку чтоли...

под указатель надо память выделять... этому тебя в школе не учили?


 
Giemgo   (2003-04-11 22:11) [3]

Как понимаю, при P:="Hello" компилятор выделяет 5 байт под слово и записывает его в память


 
Sha   (2003-04-11 22:13) [4]

2Giemgo (11.04.03 22:11)
неправильно понимаешь.


 
Palladin   (2003-04-11 22:18) [5]


> Giemgo (11.04.03 22:11)

хахаха
откуда пришло к тебе это понимание?
странно даже както...

на всякий случай

конвертация string в pchar

var
s:string;
p:pchar;

s:="Hello";
p:=PChar(s);


 
Giemgo   (2003-04-11 22:25) [6]

Palladin, хорошо. Тогда если я неправ, почему showmessage(P); все таки выводит "Hello", а не мусор ?


 
Palladin   (2003-04-11 22:43) [7]

круто...

P:="Hello";
0044DBAC B8C8DB4400 mov eax,$0044dbc8

вывод
"Hello" в сегменте данных и в P устанавливается ссылка на него,
для строковых констант присваивание будет работать...
для строковых переменных нет...

и кстати ты не прав по поводу "вижу там полную фигню"
я нормальный Hello увидел...


 
Palladin   (2003-04-11 22:49) [8]

тьфу
ночь, глючу уже

вот это считать глупостью и не читать...

> для строковых констант присваивание будет работать...
> для строковых переменных нет...


в P устанавливается адрес строки "Hello"
память для P не выделяется...

если ты заведешь P1 такуюже, то строка не скопируется и P и P1 будут указывать на одно и тоже место...


 
Palladin   (2003-04-11 22:53) [9]

опять сглючил...
в общем память для PChar именно не выделяется это точно...
хватит с меня... ушел спать..


 
Giemgo   (2003-04-11 23:09) [10]

Я что-то запутался:

а что ты там ожидал увидеть?
строку чтоли...


и потом:

и кстати ты не прав по поводу "вижу там полную фигню"
я нормальный Hello увидел...


Я неправильно написал - не в том смысле, что память выделяется, а сама строка как константа пишется, потом P начинает указывать на начало этой строки. Это по идее.

Но как я говорил у меня проблема.

Давайте подробнее:

остановка по брекпоинту showmessage(P);

Открываю WatchList, узнаю адрес переменой P

Открываю окно CPU windows, там внизу в левом окне в сплывающем меню нажимаю Goto address. Ввожу узнанный мною адес P

Вижу полную фигню, а не Hello

Вопрос кстати родился от того, что ища ошибку в моей программе по работе с сокетами встретил такую фигню, дальше как бы отлаживать не могу - надо разобраться


 
Anatoly Podgoretsky   (2003-04-12 00:09) [11]

Не видать никакой необходимости в использовании PChar вместо string


 
Fantasist.   (2003-04-12 01:09) [12]


> Открываю WatchList, узнаю адрес переменой P


По адресу переменной P, лежит сама переменная P, как это не покажется вам странным. А строка лежит по адресу, который записан в переменной P. Память, в данном случае, выделяется в сегменте памяти, а в P просто записывается адрес этой выделенной памяти.


 
Giemgo   (2003-04-12 09:33) [13]

Fantasist, блин, как же я сам не догадался. Спасибо!

Только вот все равно не получается :(

Смотрю, указывает переменая P на байт FC, затем идут F6 12 00

Перехожу в памяти по адресу $FC F6 12 00 - опять фигня :(((


 
anbezr   (2003-04-12 10:45) [14]

а ты поставь точку останова не begin, и когда сработает вызови CPU window - сразу все поймешь. проблема в том, что глобальные константы, коей является "Hello", и локальные, коей является P адресуются по разному: первые через DS:EBX, а вторые через смещение в SS:ESP.


 
anbezr   (2003-04-12 10:52) [15]

пардон, не правильно подобрал темин, хотя суть это не меняет. не глобальные константы, а константы,описанные вне функции.


 
Giemgo   (2003-04-12 12:00) [16]

Плохо понимаю, при чем тут вообще смещения ?
Я же нахожу не по смещению относительно сегмента данных, а по адресу переменной.

И если остановить на begin, то P еще будет не инициализирована


Так... во время написания потыркался и, блин, понял, что туплю по страшному. Ведь указатель - это 4-х байтовое целое, соответственно, указатель указывает на младший байт в адресе строки :)

В общем, он указывал на $FC F6 12 00, а сам то адрес в памяти значит $00 12 F6 FC


 
anbezr   (2003-04-12 12:24) [17]

ну так что, получилось? увидел строчку по [p]


 
Giemgo   (2003-04-12 16:46) [18]

Не знаю что такое [p], но строчку увидел, когда обратился по адресу записанном в байтах, на которые указывает P. В общем, как сказал Fantasist.


 
Giemgo   (2003-04-12 20:07) [19]

Anatoly Podgoretsky
" Не видать никакой необходимости в использовании PChar вместо string"

Вы так считаете ? А если нужно передать в функцию по ссылке PChar ? Как например для функции sendto второй параметр.

Покажите мне как можно использовать string в качестве второго параметра для sendto


 
Morfein   (2003-04-12 20:14) [20]


sendto(..., "строковая константа", ... );


устраивает? :)
можно и по другому...


var
s : string;
begin
s:="строковая переменная";
sendto(..., pointer(s), ... );



 
Giemgo   (2003-04-12 22:53) [21]

Morfein, хорошо написал, нда.

sendto(..., "строковая константа", ... );
устраивает? :)


Нет, не устраивает. Ты сам то хоть попробуй так сделать

sendto(..., pointer(s), ... );

И чего ?! И куда интересно указывают байты Hell в hex форме ?


 
NA   (2003-04-12 23:53) [22]


> Giemgo (12.04.03 20:07)
> Anatoly Podgoretsky
> "Не видать никакой необходимости в использовании PChar вместо
> string"
> Вы так считаете ? А если нужно передать в функцию по ссылке
> PChar ? Как например для функции sendto второй параметр.
> Покажите мне как можно использовать string в качестве второго
> параметра для sendto


Согласен с предыдущим оратором совершенно.

PChar (string) - и без проблем. Иногда - @String[1] (когда допустимо).

Я вопщем не против PChar как явления. Но! Вот, скажем, я когда-то себе в назидание сохранил такой кусок кода (из прынцыпу нашел - половину вырезал для облегчения восприятия):


.........
Open := StrAlloc (256); Open := PChar (Dlg_Open.FileName);
Save := StrAlloc (256); Save := PChar (Dlg_Save.FileName);
.........
try CopyFile (Open, Save, false) except
.........
case Dlg_Open.FilterIndex of
1 : Open := PChar (ChangeFileExt (Open, TV_ext));
2 : Open := PChar (ChangeFileExt (Open, TV_bak));
end;
.........
case Dlg_Save.FilterIndex of
1 : Save := PChar (ChangeFileExt (Save, TV_ext));
2 : Save := PChar (ChangeFileExt (Save, TV_bak));
end;
.........
try CopyFile (Open, Save, false) except
Error ("Не удалось скопировать связанный список погрузки")
.........


Так вот, к моменту копирования второго файла в PChar"ах вместо нормальных имен оказывался тааакой бардак, что я с тех пор стараюсь вообще нигде в преобразованиях типов их не использовать. Или сам заглючишь - увлечешься "совместимостью", или компилятор пошутит.


 
Giemgo   (2003-04-13 00:01) [23]

Плохо понял вышенаписанное. Я уже указал где я не могу использовать string вместо PChar. Если в данном случае стринг использовать можно - покажите как!


 
NA   (2003-04-13 00:20) [24]

Куда уж проще.


 
Giemgo   (2003-04-13 13:20) [25]

Что куда уж проще ?

Вы можете ПРИВЕСТИ пример вызова sendto со вторым параметром string,а не PChar ???!! Анатолий Подгорецкий сказал, что нет необходимости использовать PChar, если есть string. Ну а вот я не понимаю, как его здесь можно использовать!

sendto(..., "строковая константа", ... );

даже не откомпилируется. Не знаю о чем думал автор сообщения

sendto(..., pointer(s), ... );

Откомпилируется, конечно. Только вот ЧТО получится...


 
Anatoly Podgoretsky   (2003-04-13 13:33) [26]

А назови такое место, где ты не можешь использовать string вместо array[] оf char?
Есть много вариантов использования, например Pointer(S) или Pchar(S), именно так и можешь передавать в любую функцию.


 
Anatoly Podgoretsky   (2003-04-13 13:37) [27]

О какой функции sendto ты говоришь, по моему хелпу, второй параметр этой функции Integer


 
NA   (2003-04-13 14:45) [28]


> Giemgo (13.04.03 00:01)
> Плохо понял вышенаписанное.


Вчера перечитывал пейджер... много думал... :)))

1) PChar (string)
2) @string[1]

Если тебе и первый непонятен, второй еще долго не понадобится. Интересно вообще, как ты пишешь что-то там "на чистом API" (это из соседней твоей темы) при таких знаниях.


 
Giemgo   (2003-04-13 15:20) [29]

Anatoly Podgoretsky, функция описана в win32sdk.hlp
Объявление есть в модуле winsock

Повторюсь, что второй параметр надо передать по ссылке, то есть:

function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
tolen: Integer): Integer; stdcall;


PChar(s) не подходит. Pointer(s) фигню выдает. Тем более, я так думаю, так нельзя писать, потому что Ponter(s) вернет указатель на структуру string, которая недокументирована

NA, лично я удивляюсь как ты при своих знаниях находишь смелость что-то советовать другим. Это относится как и к моей соседней ветке, так и к этой. Уважаемый, вы сначала сами попробуйте сделать как написали, а потом уж говорите. Ок ?


 
Anatoly Podgoretsky   (2003-04-13 15:38) [30]

А вот другое объявление
function SendTo: (var buf; bufsize: integer; ToAddr: TSockAddr; flags:
Поэтому надо конкретно указывать о каком SendTo идет речь или просто привести объявление функции.

В данном случае, это указатель на абсолютно любой абстрактный буфер, абсолютно любой .
В качестве его может быть статически распреденный, массив, динамический одномерный массив, динамически выделенная память, строка или что нибудь дрогое обладающее адресом и протяженностью.
И PChar(S) Pointer(S) полностью подходят, третий вариант передачи адреса, это операция взятия адреса @buf[n], для строки точно также. Естественно что во всех случаях "массив" должен существовать.


Твое представления об string абсолютно не верны, не знаю на чем они базируются. И Pointer и PChar вернут адрес первого байта буфера


 
NA   (2003-04-13 15:41) [31]

Легко, уважаемый:

if RegQueryValueEx (Key, FoldName, nil, @D1, @Folder[1], @D2) = Error_Success


...необходимую инициализацию строки и реестра перед, надеюсь, допишете сами? При Ваших-то знаниях? :)))


 
Giemgo   (2003-04-13 16:17) [32]

Anatoly Podgoretsky, в свою очередь хочу спросить - а где вы достали такое объявление ?

Если " И PChar(S) Pointer(S) полностью подходят"

то почему компилятор мне сообщает:
[Error] Unit1.pas(44): Constant object cannot be passed as var parameter

Насчет Pointer(s). Ведь вы не будете спорить, что string, если понимать под ним AnsiString - это не просто последовательность символов ? Вот поэтому я и усомнился в правильности Pointer(s)


NA, я вообще-то говорил про sendto, вам не кажется ?!. И еще раз, специально для тебя повторяю. СПЕЦИАЛЬНО. ПОСЛЕДНИЙ РАЗ.

Параметр должен передаваться по ССЫЛКЕ.


 
NA   (2003-04-13 20:59) [33]

По-моему, тебе уже не один раз ответили.


 
Giemgo   (2003-04-13 22:19) [34]

PChar(s) не подходит - я уже писал.

Просто Pointer(s) делает все неправильно. Ладно, возможно у меня ошибка в коде, еще поразбираюсь.

Остался вопрос, Pointer(s) и @s[1] это документированные ссылки ? То есть, могу я расчитывать, что в следующих версиях дельфи они будут работать также, даже если поменяется формат string ?


 
jack128   (2003-04-13 23:02) [35]

function sendto(s: TSocket; var Buf; len, flags: Integer; var addrto: TSockAddr;
tolen: Integer): Integer; stdcall;

При таком объявлении функции нужно писать так
var s : string;
begin
...
sendto(MySocket,s[1],...);
...
end;
Второй параметр это не указатель на буффер куда положут данные, а сам буффер. Думаю вам нужно понять разницу между указателем и ссылкой.

> Pointer(s) и @s[1] это документированные ссылки ?

По поводу первого варианта не скажу, а второй то точно всегда будет работать.


 
default   (2003-04-13 23:18) [36]

function Length_(const S: String): LongWord;
begin

Result := LongWord(Pointer(LongWord(@S[1]) - 4)^)

end;

от этого ты наверно совсем офигеешь...
фигню ты говоришь насчёт того если формат поменяется -
указатель-то идёт на первый байт данных строки (не на байты её длины не на
счётчик ссылок(это для типа string)...)как бы формат не меняли данные-то останутся...
вот приведённая выше Length_ легко может "захромать" при изменении формата String поскольку
читает 4 байта длины строки типа String поэтому если раз-ки Delphi в следующей версии захотят
"переместить" эти данные то эта ф-ия работать будет не верно либо вообще вылетит с AV хотя это
маловероятно...понятно?!


 
default   (2003-04-13 23:35) [37]

procedure TForm1.Button1Click(Sender: TObject);
var
Str: PChar;
begin

Str := "12345";
Caption := Char(Pointer(LongWord(Str) + 2)^); // Form1.Caption = "3"

end;

procedure TForm1.Button1Click(Sender: TObject);
var
Str: PChar;
begin

Str := "12345";
if Pointer(Str) = @Str[0] then Caption := "Эквивалентно";

end;

надеюсь уж это всё прояснит...
помогло?


 
NA   (2003-04-14 00:48) [38]

> LongWord(Pointer(LongWord(@S[1]) - 4)^)

ЖЖЖ>8 - [= - =]


:-)))


 
Giemgo   (2003-04-14 11:38) [39]

jack128 © (13.04.03 23:02)

Да, вероятно в этом все дело. Вы не могли бы мне объяснить разницу между указателем и ссылкой ?

Просто я вот тут покопался. Оказывается PChar не указывает на данные, он указывает на область памяти, где записан адрес этих данных. Вот блин.

И если функции SendTo передать PChar, то она отправляет именно этот адрес. Честно говоря, я в недоумении, ведь по идее PChar это указатель на Char... а он указывает на адрес, по которому этот PChar расположен :(((((


 
Anatoly Podgoretsky   (2003-04-14 12:01) [40]

Так не оказывается, по определению он должен указывать на строку ASCIIZ, но может указывать на что угодно, это уже в твоих руках.
В Дельфи 1 PChar был именно указателем на Char, теперь на строку.


 
default   (2003-04-14 12:49) [41]

Unit1.pas.29: Str := "12345"
0044CD48 mov eax,$0044cd54
0044cd4d mov [Str],eax

0044CD54 31 32 33 34 35 00 00 00 12345...

что не ясно?

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Str: PChar;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

Str := "12345";
if @Str <> @Str[0] then Caption := "Адрес самой переменной Str не равен " +
" адресу первого байта строки";
Char((@Str^)^) := "!";
Button1.Caption := Str // Button1.Caption = "!2345"

end;

end.

глянь этот код
может наведёт на какие мыслишки...


 
default   (2003-04-14 13:22) [42]

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;

type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
Str1: PChar;
Str2: String;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin

Str1 := "12395";
Str2 := "56616479";

Char(Pointer(LongWord(@Str1[0]) + 3)^) :=
Char(Pointer(LongWord(@Str2[1]) + 5)^);
Caption := Str1; // Form1.Caption = "12345"

end;

end.

вот ещё тебе показательный пример
Всё наверно уже понял?Или в процессе?


 
Fantasist.   (2003-04-14 18:37) [43]


> В Дельфи 1 PChar был именно указателем на Char, теперь на
> строку


Хмы. Когда это PChar стал указателем на строку? Что вы понимаете под строкой вообще (будем считать, что вы не имели ввиду паскалевский тип string)? Строка, как я привык считать, это последовательность байт, когда мы говорим об указателе на такую последовательность, мы обычно подразумеваем указатель на первый ее элемент, то есть указатель указывает только на один элемент (в нашем случае, на один символ), а никак не на весь сегмент целиком.
Вообще, по моему мнению, PChar во многих случаях вещь удобная (чаще при парсинге), мне, лично, нравиться и незачем задаваться вопросом "зачем?".


> default © (14.04.03 12:49)


А ты зря так выпендриваешься - не самый умный.


 
jack128   (2003-04-14 18:50) [44]

default © (14.04.03 13:22)
> var
> Form1: TForm1;
> Str1: PChar;
> Str2: String;
>
> implementation
>
> {$R *.dfm}
>
> procedure TForm1.Button1Click(Sender: TObject);
> begin
>
> Str1 := "12395";
> Str2 := "56616479";
>
> Char(Pointer(LongWord(@ Str1[0]) + 3)^) :=
> Char(Pointer(LongWord(@Str2[1]) + 5)^);
> Caption := Str1; // Form1.Caption = "12345"
>
> end;
>
> end.



Как и ожидалось AV!

Giemgo

> Оказывается PChar не указывает на данные, он указывает на
> область памяти, где записан адрес этих данных


Не знаю как вы к такому выводу пришли, но это не так!!
Pchar - это указатель на символ, не больше, но и не меньше...
То что Борланд разрешил такое присваивание (p := "my string", где p : pchar) не о чем не говорит.
Насчет разницы между ссылкой и указателем , это в книги...Растекаться мысью по древу времени нет..


 
Giemgo   (2003-04-14 18:56) [45]

Вы, наверное, не совсем поняли мое сообщение Giemgo (14.04.03 11:38)

1) Вы не могли бы мне объяснить разницу между указателем и ссылкой ?

2) Проблема вот в чем. Попробую описать подробнее. Тем более после экспериментов я потерял все нити, которые раньше нащупал. Давайте, я напишу что делаю, чтобы каждый мог повторить. И напишу чего мне кажется странным.

Допустим, есть такой код:

procedure TForm1.Button1Click(Sender: TObject);
var P:Pchar;
begin
p:="Hello";
showmessage(p); //Здесь брекпоинт
end;


Значит, нажимаю на кнопку - программа останавливается. Вызываю Watch List. Ввожу туда P и @P

p: "Hello" - как бы все ок
@p: $12F5BC

Перехожу по адресу $12F5BC. Для этого вызываю CPU Window и в нижнем левом поле жму Goto Address.

По этому адресу расположен байт (и следующие за ним три байта):

FC F6 12 00 - что вовсе не похоже на Hello

То есть, @p указывает на FC. Хотя я думал, что он должен указывать на байт, где записана первая буква слова, то еть на "H"

Ну и как тогда дельфи узнает, что p это "Hello" ? (в watch list"е). Да и showmessage выводит все правильно.

Если перейти по адесу 00 12 F6 FC то там тоже Hello нету.

Сама строчка распологается по адресу: $00452128

Это я узнал из ассемблерного кода:

Unit1.pas.29: p:="Hello";
004520F0 BB28214500 mov ebx, $00452128 <---

Unit1.pas.30: showmessage(p);
004520F5 8D45FC lea eax,[ebp-$04]


Ну и как он узнает, что P это Hello, если @p указывает на какую-то FC F6 12 00

если кто что понял и может прояснить - буду безмерно благодарен


тааак. После написания этих слов я прямо в CPU Windows прервал программу нажав Reset. Запускаю заново. Останавливается на showmessage(p)
Смотрю в Watch List, а таам:

p: "H


 
default   (2003-04-14 19:04) [46]

перед кем мне выпендриваться?!
просто код может сказать за десятки слов
мне-то это не надо...


 
default   (2003-04-14 19:06) [47]

to Giemgo
какой AV?
переписывай код лучше
я всегда проверяю код в действии перед тем как скидываю его на формум


 
icWasya   (2003-04-14 19:08) [48]

не забудь выключать оптимизацию


 
icWasya   (2003-04-14 19:17) [49]

Вот мой код:

procedure TForm1.Button1Click(Sender: TObject);
var P:PChar;
begin
P:="Hello";
showmessage(P); //Здесь стоит брекпойнт
end;

в окне Watch
@P $68F350
P Hello
P,p $442F18

в окне CPU
по адресу $68F350 - 18 2F 44 00
по адресу $442F18 - 48 65 6C 6C 6F 00 Hello.






 
jack128   (2003-04-14 19:18) [50]

Уж нtзнаю как ты там смотрел. лично я первый раз пользуюсь окном CPU и все нашел там где оно и должно находится...
@P = 12F5DC, по этому адресу находится значение 00442А18 (значение указателя p), а по адресу 00442A18, как и дОлжно находится слово Hello. Единственно что, значение лежащее по адресу 12F5DC я смотрел в правом, а не левом нижнем окне(у не знаю имеет это какое то значение или нет)


 
jack128   (2003-04-14 19:22) [51]


> default © (14.04.03 19:06

Это видимо мне?
Делать мне нечего вручныю печатать, Copy and Paste Вот мой девиз!! :-)
Единственное. я убрал из Uses Variants (у мя D5)


 
default   (2003-04-14 19:29) [52]

jack128
не знаю у меня D6( всё работает как и должно...)


 
Giemgo   (2003-04-14 21:03) [53]

Ха, ха. Поздравьте меня, я схожу с ума.

После серии экспериментов выяснил (если так можно сказать).

Создаю новый проект, кладу на форму батон. Далее можете читать Giemgo (14.04.03 18:56) начиная с третьей строчки. То есть, @p указывает вовсе не на байты, которые если интерпетировать как адрес получишь местоположение Hello.

Ха ха. Сохраняю проект. Выгружаю дельфи, тыкаю два раза на сохраненном проекте. Загружается дельфя с проектом. Запускаю. Все ок. То есть, @p указывает на байты по адресу которых лежит строка Hello. Ха ха.

Загружаю Delphi5. Тоже самое. Ха ха. То есть, создаю новый проект, ввожу код. @p опять указывает хрен знает куда. Сохраняю проект, загружаю его, компилирую, все ок. Ха ха.

Кстати, когда загружаешь сохраненный проект, то описанная выше ошибка не возникает. То есть, после прерывания выполнения приложения и его повторого запуска в Watch List"е P не отображается как "H


 
Fantasist.   (2003-04-14 21:40) [54]


> Бросаю программирование,


Бросай, в натуре. :) Что-то ты в нем по странным камням ходишь, причем много раз.


> p: "Hello" - как бы все ок
> @p: $12F5BC
>
> Перехожу по адресу $12F5BC. Для этого вызываю CPU Window
> и в нижнем левом поле жму Goto Address.
>
> По этому адресу расположен байт (и следующие за ним три
> байта):
>
> FC F6 12 00 - что вовсе не похоже на Hello


А кто только что говорил, что все понял? Вот это вот:

> @p: $12F5BC

адрес переменной p. Что мы находим, перейдя по этому адресу? Правильно, пременную p, и не понятно, что тебя тут так удивляет. Теперь бери, то что ты там увидел - это и будет значение p, которое является адресом первой буквы твоего ненаглядного "Hello".


 
Giemgo   (2003-04-14 22:06) [55]

Так, волевым усилием идею нажраться я отбросил, стал разбираться...

Ура, мы победили сырость ! Наконец-то понял откуда ноги растут.

Все дело было как раз в оптимизации. Но не стоит меня упрекать, я не знал, что дельфи так себя ведет, и, по моему, это глюк.

Обьясняю подробнее.

Загружаю Дельфи. Пишу вышеупомянутые строки. Оптимизация, естесственно, по умолчанию включена. Запускаю. Далее можете читать Giemgo (14.04.03 18:56)

Почему же я не подумал об отключении оптимизации ? А потому что я ее отключал, запускал приложение и получал тот же самый результат ! Но, блин. Альдебаран я ! (хотя догадаться было сложно). Как я потом выяснил, дельфи, судя по всему, не компилирует ЗАНОВО код, если изменений в проекте только изменения галочки у оптимизации. Вот сволочи в борланде.

То есть, дельфи компилирует заново только если есть изменения в коде, то есть в редакторе кода пометка Modified. А у меня ведь изменения только в опциях проекта. И хотя с новыми опциями код получается другой, дельфи его не компилирует заново. А просто запускает существующий exe"шник. Я то нажимал F9.

В общем, после того как я отключал отпимизацию, делал Build All,а ТОЛЬКО потом уж нажимал F9 все стало работать. Ура !

Кто-нибудь знал о таком, что дельфи не компилирует при изменениях в опциях проекта ? Я лично нет - сколько ж нервных клеток загублено :)))

завтра пойду разбираться с sendto. Ждите вопросов :)

Засим откланиваюсь

P.S. "Глюки" с оптимизацией и сохранение проекта просто совпали. Так как я отключал оптимизацию, потом сохранял проект. А потом его загружал. И он, естесственно, заново компилировался и все ок :) Я уж просто стал грешить на все подряд

P.S.S А в чем заключалась оптимизация, что по адресу @p лежали левые данные ?

А, вот..

Насчет разницы между ссылкой и указателем , это в книги...Растекаться мысью по древу времени нет

Может в двух словах ?


 
Giemgo   (2003-04-14 22:15) [56]

Fantasist
а нефига

А кто только что говорил, что все понял? Вот это вот:

> @p: $12F5BC

адрес переменной p. Что мы находим, перейдя по этому адресу? Правильно, пременную p, и не понятно, что тебя тут так удивляет. Теперь бери, то что ты там увидел - это и будет значение p, которое является адресом первой буквы твоего ненаглядного "Hello".


Я же писал ниже

>Если перейти по адесу 00 12 F6 FC то там тоже Hello нету.

Ну собственно говоря все уже понято. Оптимизация и дельфи слишком умная виновата (ну и да, да, кривые руки тоже).

Пусть она уж каждый раз заново xe"шник делает...


 
А123   (2003-04-14 22:57) [57]

Сколько мучений и флейма! А все из-за того, что автор не обратил внимания или не захотел перевести на русский сообщение об ошибке:

>то почему компилятор мне сообщает:
>[Error] Unit1.pas(44): Constant object cannot be passed as var >parameter

И упорно пытался найти способ передать в функцию константу вместо переменной.


 
default   (2003-04-14 23:18) [58]

"Но, блин. Альдебаран я !" это ещё слабо сказано
извиняйся за свою тупизну давай прилюдно ха ха ха


 
Giemgo   (2003-04-15 00:03) [59]

Хм. Ну может я и ламер, спорить не буду.

Но скажите честно - ВЫ ЗНАЛИ, что дельфи не будет компилировать код заново, если изменить галочку оптимизации в свойствах проекта и нажать Run ?! Хотя код получается другим и он ДОЛЖЕН заново его скомпилировать по логике.
default, ты об этом знал ?

to А123
>то почему компилятор мне сообщает:
>[Error] Unit1.pas(44): Constant object cannot be passed as var >parameter

И упорно пытался найти способ передать в функцию константу вместо переменной


Я то обратил на это внимание. И оффигел от твоего поста. Ты сам понял, что написал ? Если понял, то:

1) Каким образом данный Error связан с оптимизацией ?
2) Ты только что присоединился ? Если ты читал посты последовательно, то должен был заметить, что мне предлагали вместо PChar использовать string таким образов: PChar(s). А я отвечал, что это недопустимо, так как нужно передавать по ссылке переменную, и тогда PChar(s) не подходит. Как подтверждение привел данный Error.


 
А123   (2003-04-15 01:09) [60]

2 Giemgo (15.04.03 00:03)
Про оптимизацию не дочитал, уж слишком много.
Пардон, действительно не все внимательно прочел и не понял, что "данный Error" лишь ответ на ответ, а не "источник". Однако, имхо, PChar(s) в общем случае не может приводить к "данный Error".



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

Форум: "Основная";
Текущий архив: 2003.04.24;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.64 MB
Время: 0.009 c
7-77202
Viacheslav
2003-03-08 15:16
2003.04.24
Как перехватываются все нажатия клавиш в WINDOWS 9x и NT? Клавиат


3-76810
Max79
2003-04-04 09:50
2003.04.24
Отображение логического поля в DBGrid


1-76881
malkolinge
2003-04-11 17:46
2003.04.24
Редакторый войст умирают.


3-76764
Minivan
2003-04-08 15:29
2003.04.24
Кодировка


1-77001
Stranger
2003-04-10 17:12
2003.04.24
Показ формы ActiveX





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский