Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 09:48
Оценка: -2
Pascal — источник интересных проблем!
Этот код не работает! В чем ошибка?

hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);
Re: Pascal - источник интересных проблем! :)
От: awod Россия  
Дата: 08.12.05 11:04
Оценка:
Здравствуйте, psg, Вы писали:

Вот это

uses WinInet;
var
  hConnect, hRequest :HINTERNET;
  AcceptType : string;
begin
  hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);


у меня компилируется на D6. Поиграйся с настройками компилятора. Может быть в этом проблема.
С уважением AWOD.
Re[2]: Pascal - источник интересных проблем! :)
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.12.05 11:11
Оценка:
Здравствуйте, awod, Вы писали:

A>Здравствуйте, psg, Вы писали:


A>Вот это

...
A>у меня компилируется на D6. Поиграйся с настройками компилятора. Может быть в этом проблема.

компилируется == работает
Re: Pascal - источник интересных проблем! :)
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.12.05 11:17
Оценка: 3 (2)
Здравствуйте, psg, Вы писали:

psg>Pascal — источник интересных проблем!

psg>Этот код не работает! В чем ошибка?

psg>
hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
psg>  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);


А ты целиком код приводить не пробовал? Не кажется, что без контекста смотрится глупо?
Re[2]: Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 12:11
Оценка:
Здравствуйте, awod, Вы писали:

A>у меня компилируется на D6. Поиграйся с настройками компилятора. Может быть в этом проблема.


У меня тоже компилируется, но при его выполнении возникает Access Violation!
Re[2]: Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 12:17
Оценка:
Здравствуйте, Курилка, Вы писали:

Приводить код целиком нет смысла... Проблема здесь в том, в Pascal строки и символы различаются только по длине, конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/' — но функция HttpOpenRequest ожидает указатель на null-terminated string! Честно говоря, до сегодняшнего дня я думал, что ошибки вызванные "хитрыми конструкциями" это монополия C++
Re: Pascal - источник интересных проблем! :)
От: exp_1  
Дата: 08.12.05 12:20
Оценка:
Здравствуйте, psg, Вы писали:

psg>Pascal — источник интересных проблем!

psg>Этот код не работает! В чем ошибка?

psg>
hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
psg>  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);


Чтобы работало, достаточно заменить PChar('/') на PChar('/'#0).

И на будущее, никогда не кастить с помощью PChar символы. Только строки.


Источник проблем — совсем не Паскаль.
Re[2]: Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 12:24
Оценка:
Здравствуйте, exp_1, Вы писали:

_>Здравствуйте, psg, Вы писали:


_>Чтобы работало, достаточно заменить PChar('/') на PChar('/'#0).


Я в курсе — иначе запостил бы это не в философию
Re[3]: Pascal - источник интересных проблем! :)
От: exp_1  
Дата: 08.12.05 12:30
Оценка:
Здравствуйте, psg, Вы писали:

psg>конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/'


Заглядывай иногда в CPU Windows.
Строчка:
push 0000002F
— никак не является передачей указателя. А исключительно передачей самого значения.

Кстати, к алогичному глюку привело бы использования не константы, а символьной переменной.
Re[4]: Pascal - источник интересных проблем! :)
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.12.05 12:35
Оценка:
Здравствуйте, exp_1, Вы писали:

_>Здравствуйте, psg, Вы писали:


psg>>конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/'


_>Заглядывай иногда в CPU Windows.

_>Строчка:
_>push 0000002F
_>- никак не является передачей указателя. А исключительно передачей самого значения.

_>Кстати, к алогичному глюку привело бы использования не константы, а символьной переменной.


Смысл в том, что передаётся символ, а не строка, насколько я понимаю, что указатель, что сам символ всё равно дают ошибку
Re[4]: Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 12:37
Оценка: +1
Здравствуйте, exp_1, Вы писали:

_>Здравствуйте, psg, Вы писали:


psg>>конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/'


_>Заглядывай иногда в CPU Windows.

_>Строчка:
_>push 0000002F
_>- никак не является передачей указателя. А исключительно передачей самого значения.

_>Кстати, к алогичному глюку привело бы использования не константы, а символьной переменной.


Честно говоря, получив AV при вызове этой функции в достаточно сложном тесте CPU Window было последним местом, куда я заглянул Поэтому мои претензии как раз к языку — что стоило использовать разные конструкции для константных строк и для символов?...
Re[2]: Pascal - источник интересных проблем! :)
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.12.05 12:38
Оценка: +1
Здравствуйте, exp_1, Вы писали:

_>Здравствуйте, psg, Вы писали:


psg>>Pascal — источник интересных проблем!

psg>>Этот код не работает! В чем ошибка?

psg>>
hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
psg>>  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);


_>Чтобы работало, достаточно заменить PChar('/') на PChar('/'#0).


_>И на будущее, никогда не кастить с помощью PChar символы. Только строки.



_>Источник проблем — совсем не Паскаль.


Просвети тогда, что есть тут источник проблем?
Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы
Re[3]: Pascal - источник интересных проблем! :)
От: psg  
Дата: 08.12.05 12:41
Оценка:
Здравствуйте, Курилка, Вы писали:

К>Просвети тогда, что есть тут источник проблем?

К>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы

Да-да-да! Различать строки/символы "по контексту" — это IMHO дурной тон!
Re[3]: Pascal - источник интересных проблем! :)
От: OdesitVadim Украина  
Дата: 08.12.05 13:09
Оценка: -1
Здравствуйте, Курилка, Вы писали:

К>Здравствуйте, exp_1, Вы писали:


_>>Здравствуйте, psg, Вы писали:


psg>>>Pascal — источник интересных проблем!

psg>>>Этот код не работает! В чем ошибка?

psg>>>
hRequest := HttpOpenRequest(hConnect, PChar('POST'), PChar('/'),
psg>>>  PChar('HTTP/1.1'), nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);


_>>Чтобы работало, достаточно заменить PChar('/') на PChar('/'#0).


_>>И на будущее, никогда не кастить с помощью PChar символы. Только строки.



_>>Источник проблем — совсем не Паскаль.


К>Просвети тогда, что есть тут источник проблем?

К>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы

Здесь проблема компилятора, точнее не проблема, а особенность — если строка короче 4 символов, то компилятор пытается уложить её в решистр/ячейку памяти — оптимизация
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[4]: Pascal - источник интересных проблем! :)
От: Курилка Россия http://kirya.narod.ru/
Дата: 08.12.05 13:20
Оценка:
Здравствуйте, OdesitVadim, Вы писали:

OV>Здравствуйте, Курилка, Вы писали:


К>>Просвети тогда, что есть тут источник проблем?

К>>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы

OV>Здесь проблема компилятора, точнее не проблема, а особенность — если строка короче 4 символов, то компилятор пытается уложить её в решистр/ячейку памяти — оптимизация


Привет, приехали, тип переменной у нас компилятор описывает, а не язык
Re[3]: Pascal - источник интересных проблем! :)
От: exp_1  
Дата: 08.12.05 17:53
Оценка: +1
OdesitVadim>если строка короче 4 символов, то компилятор пытается уложить её в регистр/ячейку памяти — оптимизация

Нет. До такого пока не дошло. Даже один символ, если ожидается строка – преобразуется к ожидаемому типу.

To All.

В общем, немного подумав, я пришёл к выводу, что единственно верным способом, в подобных случаях, будет вообще не использовать явный кастинг PChar(). То есть надо, писать просто:
hRequest := HttpOpenRequest(hConnect, 'POST', '/',
  'HTTP/1.1', nil, @AcceptType, INTERNET_FLAG_NO_CACHE_WRITE, 0);



Тогда компилятор всё скомпилирует правильно.
В противном – увы. И это будет особенно трудно заметить, если строковая константа определяется где-либо в другом месте.

Единственный случай, когда приходится кастить, это если надо передать в качестве аргумента переменную типа строка, поскольку это указатель на начало строки, при пустой строке нулевой, и компилятор по делу ругается. Но и в этом случае – прямой кастинг делать нельзя, поскольку при рефакторинге строка может превратиться в символ, или в односимвольную константу. Поэтому стоит кастить более громоздко: PChar(String(s)).


Философское обоснование этому следующее.
Основной целью введения PChar был грязный хак в сишном стиле с адресной арифметикой. Ведь PChar, в отличие от других указателей, можно складывать с целыми числами. При явном кастинге PChar(...) — аргумент, прежде всего, рассматривается как число, и уже потом, как строка, от первого символа которой нужно взять указатель, а на конце которой — должен быть ноль. Символ прекрасно кастится к числу (исторически так сложилось). От сюда и результат. Если, в ущерб сишному стилю убрать явную совместимость указателя на символ с числом, то исчезнет и описанный в теме глюк.

P.S. Не подумайте, что я кого-то учу. Я сам лишь пытаюсь научиться.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.