Здравствуйте, awod, Вы писали:
A>Здравствуйте, psg, Вы писали:
A>Вот это
... A>у меня компилируется на D6. Поиграйся с настройками компилятора. Может быть в этом проблема.
Приводить код целиком нет смысла... Проблема здесь в том, в Pascal строки и символы различаются только по длине, конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/' — но функция HttpOpenRequest ожидает указатель на null-terminated string! Честно говоря, до сегодняшнего дня я думал, что ошибки вызванные "хитрыми конструкциями" это монополия C++
Здравствуйте, exp_1, Вы писали:
_>Здравствуйте, psg, Вы писали:
psg>>конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/'
_>Заглядывай иногда в CPU Windows. _>Строчка: _>push 0000002F _>- никак не является передачей указателя. А исключительно передачей самого значения.
_>Кстати, к алогичному глюку привело бы использования не константы, а символьной переменной.
Смысл в том, что передаётся символ, а не строка, насколько я понимаю, что указатель, что сам символ всё равно дают ошибку
Здравствуйте, exp_1, Вы писали:
_>Здравствуйте, psg, Вы писали:
psg>>конструкция PChar('/') является синтаксически правильной и возвращается указатель на символ '/'
_>Заглядывай иногда в CPU Windows. _>Строчка: _>push 0000002F _>- никак не является передачей указателя. А исключительно передачей самого значения.
_>Кстати, к алогичному глюку привело бы использования не константы, а символьной переменной.
Честно говоря, получив AV при вызове этой функции в достаточно сложном тесте CPU Window было последним местом, куда я заглянул Поэтому мои претензии как раз к языку — что стоило использовать разные конструкции для константных строк и для символов?...
Здравствуйте, exp_1, Вы писали:
_>Здравствуйте, psg, Вы писали:
psg>>Pascal — источник интересных проблем! psg>>Этот код не работает! В чем ошибка?
psg>>
Здравствуйте, Курилка, Вы писали:
К>Просвети тогда, что есть тут источник проблем? К>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы
Да-да-да! Различать строки/символы "по контексту" — это IMHO дурной тон!
Здравствуйте, Курилка, Вы писали:
К>Здравствуйте, exp_1, Вы писали:
_>>Здравствуйте, psg, Вы писали:
psg>>>Pascal — источник интересных проблем! psg>>>Этот код не работает! В чем ошибка?
psg>>>
_>>Чтобы работало, достаточно заменить PChar('/') на PChar('/'#0).
_>>И на будущее, никогда не кастить с помощью PChar символы. Только строки.
_>>Источник проблем — совсем не Паскаль.
К>Просвети тогда, что есть тут источник проблем? К>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы
Здесь проблема компилятора, точнее не проблема, а особенность — если строка короче 4 символов, то компилятор пытается уложить её в решистр/ячейку памяти — оптимизация
Здравствуйте, OdesitVadim, Вы писали:
OV>Здравствуйте, Курилка, Вы писали:
К>>Просвети тогда, что есть тут источник проблем? К>>Имхо синтаксис языка допускает такую конструкцию -> в языке и проблемы
OV>Здесь проблема компилятора, точнее не проблема, а особенность — если строка короче 4 символов, то компилятор пытается уложить её в решистр/ячейку памяти — оптимизация
Привет, приехали, тип переменной у нас компилятор описывает, а не язык
OdesitVadim>если строка короче 4 символов, то компилятор пытается уложить её в регистр/ячейку памяти — оптимизация
Нет. До такого пока не дошло. Даже один символ, если ожидается строка – преобразуется к ожидаемому типу.
To All.
В общем, немного подумав, я пришёл к выводу, что единственно верным способом, в подобных случаях, будет вообще не использовать явный кастинг PChar(). То есть надо, писать просто:
Тогда компилятор всё скомпилирует правильно.
В противном – увы. И это будет особенно трудно заметить, если строковая константа определяется где-либо в другом месте.
Единственный случай, когда приходится кастить, это если надо передать в качестве аргумента переменную типа строка, поскольку это указатель на начало строки, при пустой строке нулевой, и компилятор по делу ругается. Но и в этом случае – прямой кастинг делать нельзя, поскольку при рефакторинге строка может превратиться в символ, или в односимвольную константу. Поэтому стоит кастить более громоздко: PChar(String(s)).
Философское обоснование этому следующее.
Основной целью введения PChar был грязный хак в сишном стиле с адресной арифметикой. Ведь PChar, в отличие от других указателей, можно складывать с целыми числами. При явном кастинге PChar(...) — аргумент, прежде всего, рассматривается как число, и уже потом, как строка, от первого символа которой нужно взять указатель, а на конце которой — должен быть ноль. Символ прекрасно кастится к числу (исторически так сложилось). От сюда и результат. Если, в ущерб сишному стилю убрать явную совместимость указателя на символ с числом, то исчезнет и описанный в теме глюк.
P.S. Не подумайте, что я кого-то учу. Я сам лишь пытаюсь научиться.