А что тут удивительного?
-
F+F
выдаётНет перегруженной подпрограммы с такими типами параметров
. - Println(F) выдаёт
Возможны два преобразования типов
В обоих случаях просто забывает про то что в паскале даже если нет скобочек - это всё равно вызов подпрограммы. Но считать ли это ошибкой, вот в чём вопрос.
Например то, что вызовы 0+F+F и F+0+F корректны, а F+F+0 - нет.
Println(0+F+F);
Println(F+0+F);
Println(F+F+0); // Нет перегруженной подпрограммы с такими типами параметров
Перекликается со старым баяном
Дэти ! Запомните такие слова как вилька, тарелька, бутилька, пишются бэз мягкого знака, а такие слова как сол, фасол, кон - пишются с мягким знаком. Но самое сложное слово в русском языке, - это слово тоска, это не та тоска, что забор строят, а та тоска, который грусть, но не тот груст что в лэсу собирают и суп варят, а тот груст который тоска !
Это ещё можно объяснить… А вот это нет:
Обновился - пропало.
Если F была бы обычной функцией, то все бы работало. А вы пользуетесь процедурными переменными или делегатами. Это надо понимать. Если кому-то так более более понятно, это - указатели на функцию.
Println(F) все равно не выведет ничего хорошего. Так что в некотором смысле хорошо, что он предупреждает, что возможно два преобразования. Если вы хотите указатель использовать в этом контексте как вызов функции, то F()
В случае f+f. Это сложение указателей. Оно у нас определено только для процедур без параметров и имеет совершенно другой смысл - последовательное выполнение процедур. Если хотите вызовы функций, то в этом (сложном!) контексте ставьте скобочки
Но это не объясняет. почему работает Println(0+F+F) и Println(F+0+F), но не работает Println(F+F+0). Только лишь потому, что (0+F)+F и (F+0)+F и нигде нет операции F+F ? Обычное присваивание значения процедурной переменной вот просто так, без всяких там @ и ^ создает указатель? Может, компилятор как-то должен в это дело вмешаться?
Это объясняет, Вы ошибаетесь. Операция + ассоциируется слева направо. При f + 0 компилятор видит, что один из операндов числовой, поэтому второй также стремится привести к числу за счет неявного преобразования делегата к вызову функции. Во втором случае f + f компилятор честно считает, что оба — делегаты и не стремится ничего привести. Поскольку вы не переопределили + для таких делегатов, ничего и не работает.
По поводу мутоботи с @. Это дельфийские штучки, тут они не работают. Напоминаю, что f нельзя считать указателем, это именно делегат.
Основная проблема по сравнению с c# состоит в том, что в паскале функции без параметров можно вызывать без скобок. Это кошмар для компилятора. Всякий раз в разных контекстах надо принимать решение, надо неявно делать преобразование делегата к вызову или нет
У кого воспроизводится?
В этот раз версия у меня последняя, у @ibond всё в порядке, а у меня описания нет.
Что, прям у меня одного?(
И после перезагрузки тоже не появляется… @Admin а в той версии с особо глубоким дебагом будет что то что такие проблемы поймать сможет?
Мы будем отлавливать зависания среды. А мистику трудно отловить вообще
Никакая это не мистика, вот смотрите:
У этой библиотеки (SharpDX
) нету нормальной вики, поэтому узнавать как оно работает можно только по примерам и описаниям. И из за того что показывает только простейшие описания (их там почти нет, а сложные все не показывает) - тоже работать нереально.
Ну, я увидел, что показывает. А что не показывает? И какая битность dll и операционки?
В issue было:
/// <summary>
/// <p>Applications use the methods of the <see cref="T:SharpDX.Direct3D9.Device" /> interface to perform DrawPrimitive-based rendering, create resources, work with system-level variables, adjust gamma ramp levels, work with palettes, and create shaders.</p>
/// </summary>
/// <remarks>
/// <p>The <strong><see cref="T:SharpDX.Direct3D9.Device" /></strong> interface is obtained by calling the <strong><see cref="M:SharpDX.Direct3D9.Direct3D.CreateDevice(System.Int32,SharpDX.Direct3D9.DeviceType,System.IntPtr,SharpDX.Direct3D9.CreateFlags,SharpDX.Direct3D9.PresentParameters[],SharpDX.Direct3D9.Device)" /></strong> method.</p><p>This interface, like all COM interfaces, inherits the <strong><see cref="T:SharpDX.ComObject" /></strong> interface methods.</p><p>The LPDIRECT3DDEVICE9 and PDIRECT3DDEVICE9 types are defined as references to the <strong><see cref="T:SharpDX.Direct3D9.Device" /></strong> interface.</p><pre> typedef struct <see cref="T:SharpDX.Direct3D9.Device" /> *LPDIRECT3DDEVICE9, *PDIRECT3DDEVICE9;
/// </pre>
/// </remarks>
/// <include file=".\..\Documentation\CodeComments.xml" path="/comments/comment[@id='IDirect3DDevice9']/*" />
/// <msdn-id>bb174336</msdn-id>
/// <unmanaged>IDirect3DDevice9</unmanaged>
/// <unmanaged-short>IDirect3DDevice9</unmanaged-short>
[Guid("D0223B96-BF7A-43fd-92BD-A43B0D82B9EB")]
public class Device : ComObject
Операционка win7x64, а у .dll не знаю как посмотреть. Но, мне кажется, если бы не подходила - то программы с ней не запускались бы, а описания от этого не должны зависеть.
Код:
begin
var a := Arr(1,2,3,4,5);
var b:=1;
a := a?[b+1:];
end.
после нажатия кнопки “Форматировать код” (или по хоткею Ctrl+Shift+F) получается такое:
begin
var a := Arr(1, 2, 3, 4, 5);
var b := 1;
a := a?[b + 1b+1:]; // <---здесь
end.
Спасибо, нашёл.
unit Data;
interface
procedure p1(b:byte);
implementation
procedure p1;
begin
end;
end.
Это компилируется нормально. Это ошибка?
Нет