Замечания и предложения

Спасибо, это я то же всё видел и использовал. Но это не то! Необходимо именно знать значения локальных переменных предыдущих вызовов подпрограмм! И это, как указал JediKnight, - действительно стандартное функция IDE. Если я не ошибаюсь даже FreePascal - консольное приложение его имеет. И хотелось бы этот функционал видеть и в этой современной IDE. Большое спасибо за совет!

Да-да, если глубина рекурсии 1000 - даешь все 1000 наборов состояний для стека рекурсии! ))) В общем, флаг в руки и функцию Аккермана навстречу!

Я больше, чем уверен, что если погуглить хорошенько, то обязательно найдётся что-то из .NET платформы. Только гуглить тогда лучше под Си или C++, а то под Pascal мало где что-то написано про .NET. Возможно где-то в пространстве System или что-то похожее. Я даже предполагаю прототип функции: getFunctionStack(f: intptr): System.Stack, или например, getfStack(funct: intptr): fStack. Могу только пожелать удачи в поисках :wink:

Дело не в том что я буду писать и какой алгоритм реализовывать, дело в возможностях редактора! Отлаживать свой код удобнее если есть больший функционал! И объяснить ученикам как это происходит проще! А будет это рекурсия или простые вложенные вызовы подпрограмм - это неважно! И какая разница какая глубина вызовов? если этого функционала нет, значит приходится извращаться при написании и придумывать свой велосипед!

Спасибо за совет :wink: Полазил я по .NET и использовать рефлексию - это уже перебор, причём я не уверен что даже с ней смогу добраться до локальных переменных и их значений. Да и дело совсем не в том чтобы это внедрять в код! Повторюсь : БЫЛО БЫ НЕПЛОХО ЕСЛИ БЫ РАЗРАБОТЧИКИ В СЛЕДУЮЩЕЙ ВЕРСИИ ДОБАВИЛИ В СВОЙ ФУНКЦИОНАЛ - СТЕК ВЫЗОВОВ ФУНКЦИЙ!!! Всё, это пожелание!!! Это удобно использовать для отладки кода, вот и всё!!! И это стандартный функционал IDE!!!

Огромная! Видимо Вы или не сталкивались вплотную с той же функцией Аккермана, или не пытались раскрутить руками возникающую там непростую рекурсию. А попробуйте! А потом я с удовольствием послушаю Ваши предложения о том, как реализовать с учетом подобных вызовов просмотр результатов. И про велосипед, и про все остальное.

Не вижу проблем просмотреть память стека и показать значения переменных! :slight_smile: это не так уж и сложно :slight_smile: это уж точно не алгоритм Аккермана :slight_smile: Не обижайтесь, но этот функционал был наверное ещё в компиляторах 80-х. И насчёт Аккермана - есть и похлеще алгоритмы :wink: Успехов, и Спасибо!

Возможно я плохо объяснил, Смысл в том, что вычисление даже “простой” (есть ведь и похлеще, безусловно) функции Аккермана моментально съедает под стек всю память компьютера и на отладку уже ничего не остается. Т.е. речь о том, что не удастся создать в IDE сколь-нибудь приемлемую функцию показа стека со всеми “потрохами”.

Теперь немного ностальгии. Я работал программистом на ЭВМ и в 80-х (системным на ЕС-ках и IBM\360-370), и в 70-х на “Уралах”, М-20/222 и “Минск-22/32”, так что не по наслышке знаю, что там было в компиляторах, и чего не было. Того, что Вы хотите - его не было. Максимум - один уровень стека в символическом виде, остальное - милости просим ползать на четвереньках по распечатке дампа. Да, еще в PL/1 извращенцы-юзеры устраивали себе трассировки через PUT DATA, изводя дорогие пачки фальцовки на АЦПУ.

Это FreePascal, я имел ввиду хотя бы такое: Речь не идёт о крутости машин на которых вы работали, а о простом функционале программы. В наше время машины уж точно на это способны. А про память, то можно просматривать не всю стековую память, а в динамике, посмотрели текущую, а при переходе на следующую - просмотрели данные стека для следующей подпрограммы. И ещё если посмотреть как операционка (в частности Win - я ребёнок винды :)) распределяет память то каждому приложению даётся 4ГБт (если 32-разрядная версия) виртуальной памяти - как это происходит - проблема операционки. Итого мы имеем приложение PascalABC.NET имеет 4ГБт, и сама программа тоже, если это делается в разных процессах. По моему памяти предостаточно, тем более она не общая. Я точно знаю что сейчас это не проблема сдеть! Это уже реализованный функционал многих IDE! И не вижу никаких проблем чтобы это так же было и в этом приложении. Тем более от этого только лучше будет! Большое спасибо! :slight_smile:

Про память, я примерно описал, как сам понимаю и не стремлюсь к полноте описания и точности :slight_smile: А вот история TurboPascal:

Вроде там тоже есть стек вызовов подпрограмм :slight_smile:

Единственный стек, доступный для просмотра в Турбо (Борланд) Паскаль показывает просто заголовок процедуры, в которой идет отладка. Сомнительно полезный функционал.

Я Вам показал, что такой функционал присутствует даже в таких приложениях, которые были написаны уже 30 лет назад. И не утверждаю что это самое лучшее что есть не текущий день, если бы я это делал тогда я бы ссылался на VisualStudio и т.д. Т.е. профессиональные среды. И повторюсь, я этот вопрос поднял как предложение к улучшению этой программы, так как я веду кружок в школе, и дети там пользуются PascalABC.NET, кстати Большое им спасибо за неё!!! то предложил улучшить эту программу, и это только моё мнение, если Вы не согласны с этим, ну что ж… так бывает :slight_smile: Сам я работал в разных средах, и хотелось лучшее видеть и в этом продукте! Всё лучшее детям!!! :slight_smile: В любом случае Спасибо! :slight_smile:

2 лайка

Не нужно это делать с учетом подобных вызовов. QtCreator, например, попросту показывает не более последних двадцати вызовов на стеке. Снизу списка элемент More…, при клике по которому достается еще 20. Вполне элегантное решение. Особенно учитывая, что их количество крайне редко превышает эти самые 20-30 в большинстве потоков. [тут я бы еще добавить, что стеки вызовов надо сделать переключаемыми между различными потоками исполнения].

1 лайк

Не планируется сделать для последовательностей/массивов что-то типа a.ShL и a.ShR, пусть даже без параметров, сдвигающее на один элемент? Последнее время стало модно подбрасывать задачки типа “вставить в массив элемент с максимальным значением после каждого из k последних элементов с нечетным значением”. При этом работать со списками не разрешают. Такой сдвиг позволил бы писать программки гораздо более элегантно.

Так срезы можно использовать: a := a[1:]+a[:1];

Конечно. Я сейчас так и делаю. Но синтаксически a.Shl понятнее, лаконичнее, а главное, встраивается в цепочку без заключения в круглые скобки (a[1:]+a[:1]). Но если нет, значит нет, бывали времена и похуже, выжили )))

Можете пожалуйста добавить возможность делать private классы, чтоб не передавать из модулей не нужное?

type
  private t1=class
    
  end;
  public t2=class
    
  end;

или

type
  t1=private class
    
  end;
  t2=public class
    
  end;

На сколько я знаю паскаль создаёт класс обёртку для все модулей, значит эти классы - элементы класса обёртки и им можно давать разную публичность?

Нашёл костыль:

unit Data;

interface

type
  t1=class end;

implementation

type
  t2=class
    
  end;

function GetT2(Self:t1):t2; extensionmethod := new t2;

end.

Но это просто ужасный код… Хотя бы потому что нужно дополнительный объект не имеющий отношения к t2.

Есть ещё такое предложение. Кто-то уже высказывался насчёт кастомизации интерфейса, но речь шла о стилях оформления, насколько я помню. Тогда разработчики ответили, что на данном этапе пока они не могут этого сделать. А можете хотя бы вернуть опцию изменения цветов шрифтов. Я помню на PascalABC это было :slight_smile:

И ещё не плохо было бы сделать опцию, чтобы справка была всегда поверх основного окна (Ну это есстественно можно в настройках например отключить)