LINUX.ORG.RU

История изменений

Исправление 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

С такими успехами ты любые аргументы отобьешь. Просто закроешь глаза и уши, и будешь трердить, что аргументов нету, нету их, я занятый человек, вы тратите мое время, я мог тысячу долларов заработать ,пока вам отвечал, нету аргументов, всё пустые слова.