История изменений
Исправление byko3y, (текущая версия) :
То есть по факту ваших предыдущих высказываний вам сказать нечего, так как они ложны и вы даже не удостоверились в своей правоте
??? За базар ответишь?
CCЗБ, тоже самое делается в любом языке с адресной арифметикой и в паскале в том числе. Кстати вы там и про строки что-то говорили, сходите посмотрите что там внутри тот же С только в синтаксисе паскаля. При этом хочу отметить что этих строк кроме какого-то вида shortstring наверно и не было в том доисторическом паскале. Ну уж ансистринга и уж тем более строк с широким символом там тоже не было
type
CharArray = array [0..MaxShort] of AnsiChar;
PCharArray = ^CharArray;
var
s: PAnsiChar;
s2: PAnsiChar;
p: Pointer;
p2: Pointer;
d: array of AnsiChar;
d2: array of AnsiChar;
a: PCharArray;
a2: PCharArray;
begin
GetMem(s, 14 * sizeof(Char));
s2 := s + 2; // Ok
GetMem(p, 14 * sizeof(Char));
p2 := p + 2; // E2015 Operator not applicable to this operand type
SetLength(d, 14);
d2 := d + 2; // E2008 Incompatible types
GetMem(a, 14 * sizeof(Char));
a2 := a^ + 2; // E2010 Incompatible types: 'PCharArray' and 'PAnsiChar'
a2 := a + 2; // E2015 Operator not applicable to this operand type
a2 := @a[2]; // Ok
a2 := @a[2] + 2; // E2015 Operator not applicable to this operand type
Я особое внимание уделил «array [0..MaxShort] of AnsiChar», потому что именно так работали с указателями в древнем паскале, именно этот тип хорошо защищен от ошибок. Арифметика с указателями — это довольно недавнее нововведение, в Turbo Pascal этого еще не было, и даже в седьмом Delphi единственный тип, с которым возможна эта арифметика — это PChar, который здесь называется PAnsiChar. То есть, даже с PByte нельзя было заниматься арифметикой.
Конечно же это не соответствует действительности, это не константы, и в таком виде это как раз то, как работает препроцессор
На всякий случай я напомню, что это не я, а ты занимаешь позицию «ближе к железу», «переносимый ассемблер». Асм PDP-10 не имел препроцессора, и даже не работал как препроцессор, потому что ты не можешь засунуть случайный мусор в объявления констант и получить мусорный код на выходе — а это основной недостаток наспех слепленной замены текста поверх компилятора по сравнению с архитектурой языка.
И константы введены в язык именно для того, чтобы делать данные константными, а уж от реализации зависит будут ли они константными только на этапе компиляции, или же будут таковыми и на этапе исполнения в ро загоне ОС
И ты хочешь сказать, что констант в Си не было? Строковые и массивные константы были в асме MACRO-10, 3-1 в руководстве:
https://www.livingcomputers.org/UI/UserDocs/Tops-10-v7-04/4_Macro_Assembler_R...
Они же фактически были в Си в виде «копипастим значение в каждом выражении», пример с массивом есть в K&R «The C Programming Language» за 1978 год на 109 странице.
Так что отмазы «какие-то машины что-то не поддерживали» не засчитана, та или иная форма константности была везде — K&R просто поленились добавлять поддержку нормальных констант в язык, потому тот Си в отдельных моментах не дорос даже до хорошо спроектированных асмов того времени.
Нет не можете, это совершенно другой язык, который имеет совсем иной дизайн и подходы к разработке, единственное чем он связан с С что одна из его реализаций на нем написана
А тебе не приходит в голову, что классы и шаблоны C++ — это совершенно иной дизайн, не имеющий ничего общего со старыми структурами языка Си? Это и был изначально полностью изолированный транслятор, примерно как Cython. И что, теперь будем говорить, что Cython = C?
Хорошо, если тебе не нравится так — покажи мне проверку long на попадание в рамки 2^32 на любой платформе, в том числе той, где long 64 бита
Очевидно, что вы просто тратите мое время, сходите на godbolt.org да сами проверьте на тех вариантах платформ и ос что там предоставлены (я проверил на 5 случайных с разной ос и разной разрядностью, везде вы получаете ворнинг), на любой требовать вы не можете, потому что на любой и ваш паскаль не работает. Т.е. по сути эту претензию тоже отбили
ARM gcc 9.2.1
<source>:1:10: warning: overflow in conversion from 'long long int' to 'long int' changes value from '17592186044415' to '-1' [-Woverflow]
1 | long a = 0xFFFFFFFFFFF;
AVR gcc 9.2.0
<source>:1:10: warning: overflow in conversion from 'long long int' to 'long int' changes value from '17592186044415' to '-1' [-Woverflow]
1 | long a = 0xFFFFFFFFFFF;
x86-64 clang 10.0.0
Compiler returned: 0
x86-64 gcc 10.1
Compiler returned: 0
С такими успехами ты любые аргументы отобьешь. Просто закроешь глаза и уши, и будешь твердить, что аргументов нету, нету их, я занятый человек, вы тратите мое время, я мог тысячу долларов заработать, пока вам отвечал, нету аргументов, всё пустые слова.
Исходная версия byko3y, :
То есть по факту ваших предыдущих высказываний вам сказать нечего, так как они ложны и вы даже не удостоверились в своей правоте
??? За базар ответишь?
CCЗБ, тоже самое делается в любом языке с адресной арифметикой и в паскале в том числе. Кстати вы там и про строки что-то говорили, сходите посмотрите что там внутри тот же С только в синтаксисе паскаля. При этом хочу отметить что этих строк кроме какого-то вида shortstring наверно и не было в том доисторическом паскале. Ну уж ансистринга и уж тем более строк с широким символом там тоже не было
type
CharArray = array [0..MaxShort] of AnsiChar;
PCharArray = ^CharArray;
var
s: PAnsiChar;
s2: PAnsiChar;
p: Pointer;
p2: Pointer;
d: array of AnsiChar;
d2: array of AnsiChar;
a: PCharArray;
a2: PCharArray;
begin
GetMem(s, 14 * sizeof(Char));
s2 := s + 2; // Ok
GetMem(p, 14 * sizeof(Char));
p2 := p + 2; // E2015 Operator not applicable to this operand type
SetLength(d, 14);
d2 := d + 2; // E2008 Incompatible types
GetMem(a, 14 * sizeof(Char));
a2 := a^ + 2; // E2010 Incompatible types: 'PCharArray' and 'PAnsiChar'
a2 := a + 2; // E2015 Operator not applicable to this operand type
a2 := @a[2]; // Ok
a2 := @a[2] + 2; // E2015 Operator not applicable to this operand type
Я особое внимание уделил «array [0..MaxShort] of AnsiChar», потому что именно так работали с указателями в древнем паскале, именно этот тип хорошо защищен от ошибок. Арифметика с указателями — это довольно недавнее нововведение, в Turbo Pascal этого еще не было, и даже в седьмом Delphi единственный тип, с которым возможна эта арифметика — это PChar, который здесь называется PAnsiChar. То есть, даже с PByte нельзя было заниматься арифметикой.
Конечно же это не соответствует действительности, это не константы, и в таком виде это как раз то, как работает препроцессор
На всякий случай я напомню, что это не я, а ты занимаешь позицию «ближе к железу», «переносимый ассемблер». Асм PDP-10 не имел препроцессора, и даже не работал как препроцессор, потому что ты не можешь засунуть случайный мусор в объявления констант и получить мусорный код на выходе — а это основной недостаток наспех слепленной замены текста поверх компилятора по сравнению с архитектурой языка.
И константы введены в язык именно для того, чтобы делать данные константными, а уж от реализации зависит будут ли они константными только на этапе компиляции, или же будут таковыми и на этапе исполнения в ро загоне ОС
И ты хочешь сказать, что констант в Си не было? Строковые и массивные константы были в асме MACRO-10, 3-1 в руководстве:
https://www.livingcomputers.org/UI/UserDocs/Tops-10-v7-04/4_Macro_Assembler_R...
Они же фактически были в Си в виде «копипастим значение в каждом выражении», пример с массивом есть в K&R «The C Programming Language» за 1978 год на 109 странице.
Так что отмазы «какие-то машины что-то не поддерживали» не засчитана, та или иная форма константности была везде — K&R просто поленились добавлять поддержку нормальных констант в язык, потому тот Си в отдельных моментах не дорос даже до хорошо спроектированных асмов того времени.
Нет не можете, это совершенно другой язык, который имеет совсем иной дизайн и подходы к разработке, единственное чем он связан с С что одна из его реализаций на нем написана
А тебе не приходит в голову, что классы и шаблоны C++ — это совершенно иной дизайн, не имеющий ничего общего со старыми структурами языка Си? Это и был изначально полностью изолированный транслятор, примерно как Cython. И что, теперь будем говорить, что Cython = C?
Хорошо, если тебе не нравится так — покажи мне проверку long на попадание в рамки 2^32 на любой платформе, в том числе той, где long 64 бита
Очевидно, что вы просто тратите мое время, сходите на godbolt.org да сами проверьте на тех вариантах платформ и ос что там предоставлены (я проверил на 5 случайных с разной ос и разной разрядностью, везде вы получаете ворнинг), на любой требовать вы не можете, потому что на любой и ваш паскаль не работает. Т.е. по сути эту претензию тоже отбили
ARM gcc 9.2.1
<source>:1:10: warning: overflow in conversion from 'long long int' to 'long int' changes value from '17592186044415' to '-1' [-Woverflow]
1 | long a = 0xFFFFFFFFFFF;
AVR gcc 9.2.0
<source>:1:10: warning: overflow in conversion from 'long long int' to 'long int' changes value from '17592186044415' to '-1' [-Woverflow]
1 | long a = 0xFFFFFFFFFFF;
x86-64 clang 10.0.0
Compiler returned: 0
x86-64 gcc 10.1
Compiler returned: 0
С такими успехами ты любые аргументы отобьешь. Просто закроешь глаза и уши, и будешь трердить, что аргументов нету, нету их, я занятый человек, вы тратите мое время, я мог тысячу долларов заработать ,пока вам отвечал, нету аргументов, всё пустые слова.