1) Подпрограмма (функция) может непосредственно вернуть значение в вызывающую программу, например: x:=cos(y);
2) Подпрограмма может изменить значение значение глобальных переменных, и их новое значение будет доступно в вызывающей программе;
3) Подпрограмме в качестве параметра может быть передан адрес объекта в памяти, и подпрограмма, изменив значение, передаст новое значение в вызывающую программу;
4) Подпрограмме в качестве параметра может быть передана ссылка на объект, и подпрограмма сможет изменить значение этого объекта.
Вроде всё... Хотя нет
5) Возможен обмен данными через файл - подпрограмма записывает данные в файл, вызывающая программа - читает эти значения (или наоборот). Это, конечно, крайне не эффективно и на практике никогда не применяется, но возможность такая есть.