Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Готовить не надо - её надо просто создать. ![]() При этом вы явно указываете область действия будущего массива, чего не можете сделать при вызове функции ALINES() для создаваемого массива. PS Я правильно понял, что именно с работой функций типа ALINES() как "эталона" вы сравниваете другой способ? ![]() |
Re: Возврат массива из метода | |
---|---|
kornienko_ru Сообщений: 415 Откуда: Владивосток Дата регистрации: 06.09.2015 |
Это понятно, что смысла в этом коде нет, тут главное принцип. Я предпочитаю всё что используется в модуле на определенном уровне описывать на этом же уровне, а не на другом. Это правило хорошего тона. Есть такие языки, где по другому просто нельзя, например javascript. Я хотел показать, что если вы используете в качестве параметра в программе один единственный массив, то нет смысла его передавать, как параметр, а переопределить его размер в функции можно и без такой передачи. Если функции передаются разные массивы, то да.... эта тема обозначена правильно и надо пользоваться для передачи массива передачей по ссылке @. Я очень люблю передачу по ссылке, это убыстряет программу, т.к. уменьшается ненужное копирование данных из одного места памяти в другое. А на javascript, если параметром указан массив, он по умолчанию передается по ссылке (не надо ничего дополнительно указывать). Если говорить о смыслах примеров, то ваш первый пример лучше написать так:
Исправлено 3 раз(а). Последнее : kornienko_ru, 20.11.24 23:56 ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Функция MakeArray(), приведенная выше, это просто пример, иллюстрирующий принцип работы, а вовсе не функция переопределения размерности массива. В общем случае её можно рассматривать как универсальную функцию создания массива, выполнения определенных действий по его заполнению и возврата этого массива наверх. А поэтому не имеет значения, сколько обращений к этой функции - одно или несколько - будет в некотором модуле. Функции вообще не передаются массивы - ей передается переменная, которую функция "превращает" в массив, заполняет его и возвращает для последующей работы. Если причина только в этом, и речь идет об обычной интерактивной программе, то ни один пользователь не сможет оценить это ускорение. Ну, а если программа круглосуточно выполняет какие-то расчеты, то да - несколько секунд на сто миллионов таких вызовов выиграть наверно можно. ![]() |
Re: Возврат массива из метода | |
---|---|
kornienko_ru Сообщений: 415 Откуда: Владивосток Дата регистрации: 06.09.2015 |
Это всё ваши фантазии
![]() Я в 80-е усиленно использовал фортран. До сих пор его применяют для научных расчетов, где важна производительность. Но я поставил такой эксперимент. В то время языком для системных вещей был ассемблер, да сам фортран был написан на ассемблере и использовал ассемблеровские библиотеки. Как таково в нём не было специального синтаксиса передачи по ссылке, но были программные трюки при которых можно было передать ссылку на переменную, я уже точно не помню каким образом. Так вот.... я написал несколько часто используемых функций на ассемблере, на которых передача массивов и больших данных происходила по ссылке. В частности написал функцию READ которая давала ссылку прямо на буфер самого устройства (жесткие диски). И программа на фортране через подставную переменную использовала напрямую буфер самого устройства. После этого я немного переделал существовавшие на тот момент программы на фортране, которые работали по несколько часов. И, о чудо, программы стали работать по 20 минут. Поэтому по жизни я стараюсь везде, где возможно использовать ссылки. Вы просто не в курсе, что пересылка памяти — это самая затратная из всех инструкция и когда вы копируете переменные из одной переменной в другую и делаете это не обосновано много раз при передаче параметров, вы очень много теряете, особенно, если это длинные переменные, например строки. Есть даже язык, подзабыл какой, где ссылочная передача параметров заложена по умолчанию. Исправлено 1 раз(а). Последнее : kornienko_ru, 21.11.24 04:23 ![]() |
Re: Возврат массива из метода | |
---|---|
Владимир Максимов Сообщений: 14146 Откуда: Москва Дата регистрации: 02.09.2000 |
Ну, разговор уже пошел "за жизнь"
![]() FoxPro создавался во времена, когда программирование еще было искусством. В том смысле, что не были определены правила как собственно языков программирования, так и написания кода. Каждый программист "творил" в меру своего понимания. В настоящее время уже есть понимание того, что можно делать, а чего делать не стоит при написании программного кода. Но! Применить эти правила к FoxPro - проблематично. По той причине, что язык создавался на других принципах. Он просто не позволяет "загнать себя в рамки". Да, конечно, можно и нужно написать собственный FrameWork (с этого вообще начинается написание приложения), но этот FrameWork также будет "пестреть" всякими исключениями и отклонениями из-за самой природы FoxPro Как следствие, когда обсуждается тот или иной "прием" программирования в FoxPro, то можно лишь говорить о собственных предпочтениях и достоинствах/недостатках в определенных ситуациях. Но никак нельзя сказать, что в среде FoxPro надо делать только так, а не иначе. Не получится. Всегда будут ситуации, когда прием использовать или вообще невозможно или будут слишком большие "накладные расходы" ![]() В отношении функций лично я считаю, что формировать исходящий параметр должна сама функция. Внутри себя. Поскольку если это не так, то возникает ряд вопросов к переданному значению. Возникает некая неопределенность, которую приходится решать дополнительным кодом в самой функции. Ну, например, если передали не пустое значение - это ошибка или так и должно быть? А если не того типа? А если не передали? Т.е. код начинает работать "на честном слове". Неких договоренностях "по умолчанию" из цикла "ну, это же очевидно!". Да, очевидно. Для того, кто этот код писал. Но уже очень "не очевидно" для другого разработчика. Да и сам автор кода через пару месяцев не вспомнит о чем же он думал, когда закладывал эти самые "умолчания" Если же переменная формируется внутри функции, то вопросов нет. Весь процесс формирования наглядно видно в коде этой самой функции. При этом, никто не запрещает формировать переменную для получения результата функции в вызвавшем методе. Но это будут два разных процесса, никак не связанные между собой. Есть "самодостаточная" функция и есть метод, который ее вызывает. Что там было сделано в вызвавшем методе - внутри функции роли не играет. ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Я не догадался, к чему именно относится это замечание. "Очень много" - это неконкретно и субъективно. Примерный порядок чисел я привел в прошлом сообщении - несколько секунд (у меня примерно 2 секунды) на сотне миллионов вызовов - это сейчас, а не в 80х годах прошлого века. Это в среднем на один вызов с одним аргументом, и это можно проверить. Но наверняка можно специальным образом подобрать такой тест (только очень длинные строки, максимальное количество аргументов и т.п.) или запустить его на такой технике (начала века), где разница при том же количестве вызовов будет больше. Но при обычной интерактивной работе на современной технике пользователи её не заметят, если количество обращений к таким функциям не будет составлять миллионы раз. Но лично я ничего не имею против любого ускорения при прочих равных, то есть не в ущерб чему-то другому, иногда более важному (это если вы подумали, что я "осуждаю" ваше стремление передавать аргументы по ссылке ![]() Да, и как ни странно, в том числе это и Фокс. ![]() По умолчанию при обращении к модулю как к процедуре аргументы передаются по ссылке: DO Function1 WITH arg1, arg2 ... А при обращении к нему же как к функции аргументы передаются по значению: = Function1 (arg1, arg2 ...) Но и это легко поправить - задайте в головной программе SET UDFPARMS TO REFERENCEи можете навсегда забыть о "собачках" при передаче аргументов. ![]() |
Re: Возврат массива из метода | |
---|---|
alex; Сообщений: 3402 Откуда: Москва Дата регистрации: 23.11.2004 |
Странные вы.
Вроде что-то интересно, но непонятно что донести хотите. ![]() ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
В таком случае, ответьте однозначно - вы "осуждаете" такие функции Фокса, как ALINES(array, ...) и т.п., то есть которые умеют создавать массив в том числе и "из ничего" (без предварительного описания), принимая его имя как аргумент? И если "нет", то в чем тогда, по-вашему, принципиальная разница между MyArray(@array, ...) и ALINES(array, ...)? Ведь и там, и там выполняется ваше условие: Цитата: Мы обсуждаем случай, когда аргумент может быть любым - его не надо проверять ни на значение, ни на тип. Но и ALINES() свалится, если количество переданных аргументов будет недопустимым, или, к примеру, первым аргументом будет нечто (имя поля, свойство объекта и т.п.), что нельзя трактовать как массив. То же случится и с MyArray(@array, ...). То есть и в этом смысле с ней всё аналогично ALINES(), зачем же требовать от неё большего? ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Так всегда происходит при решении "философских вопросов". ![]() ![]() |
Re: Возврат массива из метода | |
---|---|
kornienko_ru Сообщений: 415 Откуда: Владивосток Дата регистрации: 06.09.2015 |
Тоже хотел такой пример предложить, но попробовал к нашему случаю с двумя параметрами массив и его размер --- и оказалось что эта функция не работает. Вернее работает 1 раз, при повторном вызове - параметры вообще не передаются. PS Точнее не функция, а команда Do ... with не работает. Исправлено 1 раз(а). Последнее : kornienko_ru, 21.11.24 12:54 ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Не может быть. ![]() Запустите этот код, и напишите, что видите:
![]() |
Re: Возврат массива из метода | |
---|---|
Владимир Максимов Сообщений: 14146 Откуда: Москва Дата регистрации: 02.09.2000 |
1. Речь не идет об "осуждении" или "одобрении". У каждого подхода есть достоинства и недостатки, причем в зависимости от "контекста". Поэтому "однозначно" я ответить не могу ![]() 2. Я считаю, что функция должна сама "создавать массив из ничего", но не "в том числе", а "всегда" Проблема в том, что для FoxPro такой подход невозможен, поскольку не может существовать "пустой" массив (без элементов). Должен быть хотя бы один элемент. И вот здесь-то и проблема. Если этот "один элемент" изначально был не пустым, то как понять: содержимое массива - это результат работы функции или функция ничего не вернула, поэтому массив не изменился?
Передали параметр, но Вам не важно, что именно передали? Гм.. Ну, так тоже можно, но слишком велик риск разных проблем
Речь не о количестве параметров, а об одном параметре. Обратите внимание на справку по этой функции. Там куча уточнений, что будет если переданный массив есть/нет, больше/меньше. Т.е. разработчики вынуждены писать дополнительный код по обработке этого входного параметра. Именно для того, чтобы решать проблемы, которых не возникло бы, если бы этот массив формировался исключительно внутри функции Кроме того, для FoxPro есть проблема "пустого" массива (без элементов). Т.е. нужен дополнительный контроль полученного значения, а это проще всего сделать именно что предварительно подготовив массив. Например, записав в первый элемент значение, которое заведомо не может вернуть функция и проверять это значение после вызова. ![]() |
Re: Возврат массива из метода | |
---|---|
kornienko_ru Сообщений: 415 Откуда: Владивосток Дата регистрации: 06.09.2015 |
Работает. Свой пример уже удалил. В файле у меня была только функция. А уже её я запускал из командного окна. По памяти не помню, какие команды давал. Возможно где-то протупил. А вообще мой стиль явно указывать @. Я обычно указываю @. Это как-то наглядней. Ну вот здесь, например github.com Исправлено 1 раз(а). Последнее : kornienko_ru, 21.11.24 20:02 ![]() |
Re: Возврат массива из метода | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
С "улиткой" все просто - ты заполняешь параметр-массив (переданный по ссылке, бывает, приходится написать на стороне подпрограммы EXTERN ARRAY имяВнешнегоМассива). Разрабы фокса хорошо сделали в передаче параметра в "значении" и в "ссылке". В Си заморочнее,... дело привычки, как к куринии и питии.
> Я обычно указываю @ Не всегда уместно, например в вызове "DO функция WITH параметры" это вызовет ошибку, наверное, а в вызове (x = Функция(@параметр1, @массив))... Просто немного поэксперементировать, и все будет понятно > Поэтому по жизни я стараюсь везде, где возможно использовать ссылки. Вы просто не в курсе, что пересылка памяти — это самая затратная из всех инструкция Смотря с какой частотой и употреблять. Не Путай фокс и Си, ты не найдешь *в смысле "устройства" ЯП Фокс по отношению к Си, который заявллялся макс приближенным аналогом ассемблера процессора. Фокс - он язык высокого уровня, к тому же заброшенный. Не ровняйся к нему. Сейчас есть ЯП интернетовские, кесть Си (остался таким же близким к первоистокам, ... на любителя и на тему...) . Исправлено 2 раз(а). Последнее : of63, 21.11.24 22:28 ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
А не надуманная ли это проблема? Попробуйте привести пример, в котором ALINES() "ничего не вернула". ![]() А в функцию MakeArray() передается не массив, а "имя будущего массива", так что и там этой проблемы нет. Именно так - ведь фактически в MakeArray() передается лишь адрес - ссылка на будущий массив, а поэтому то, что находилось по этому адресу при вызове (значение передаваемой переменной) неважно - оно всё равно будет заменено значениями элементов массива. Если подвести итоги всем этим "уточнениям", то вы легко придете к выводу, что во всех случаях результирующий массив будет таким, как будто он был создан с нуля. ![]() Иными словами - вариант всего один (и это естественно - ведь старые значения сохранены не будут). Если вы о разработчиках Фокса и функции ALINES(), то это их решение - расширить возможности функции, разрешая передавать ей существующий массив, который перестал быть нужным. И это правильно! Какой смысл заставлять программистов предварительно удалять массив (RELEASE array), если можно обойтись и без этого? Но никакой дополнительный код по его обработке не нужен (за исключением того, что это должен быть именно массив), так как старые значения элементов всё равно будут заменены на новые. А поэтому во всех случаях (был массив или его не было) перед заполнением массива новыми значениями можно сразу же создать "пустой" массив с заданным именем, то есть выполнить аналог команды DIMENSION array[1]. Что за проблемы, которые, якобы, нужно решать при этом разработчикам, я так и не понял. Ну, а для MyArray(), как я уже писал, значение переданного аргумента неважно (как, впрочем, и для ALINES() при передаче существующего массива). Ещё раз уточню, что в MakeArray() никакой массив не передается. А результат работы этой функции ("пустой" массив или нет) - retvalue - можно вернуть в команде RETURN: retvalue = MakeArray(@MyArray) ALINES(array, ...) тоже возвращает значение размерности созданного массива. О каком ещё дополнительном контроле речь? ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Могу только добавить, что вы первый из тех разработчиков, которых я встречал, кто использует передачу аргументов по ссылке для "ускорения", а не по её прямому назначению. ![]() ![]() |
Re: Возврат массива из метода | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Передача по ссылка (с улиткой) он полезна, и даже часто необходима. Отмечу историю
Раньше было, например: A = 1 B = 1 Do Программа WITH A, B PROC Программа PARAM parA, parB par A = 0 Т.е. подпрограмма "Программа" могла менять содержимое ВНЕШНЕЙ для нее переменной A Потом появился LPARAMETER, но желание менять значение ВНЕШНЕЙ (для подпрограммы Программа) переменной осталось, и тогда разрабы фокса сделали возможность передачи по указателю, префикс "улитка" = Программа (@пар1, @пар2) () Кстати, это выражение вызова равносильно вызову: DO программа WITH пар1, пар2 С массивами это понимание актуально, не то слово Наверное, получилось у разрабов фокса несколшько заморочно, но... я больше матерился, когда писал на Си ![]() |
Re: Возврат массива из метода | |
---|---|
akvvohinc Сообщений: 4560 Откуда: Москва Дата регистрации: 11.11.2008 |
Не надо извращать историю Фокса! ![]() Собака появилась еще в Досе. ![]() |
Re: Возврат массива из метода | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Сишники, блин )
Доб. Вы понимаете, что в Фоксе "указатель" - это не сишный "адрес в памяти" (причем абстрактрный, не 32-I) Исправлено 1 раз(а). Последнее : of63, 23.11.24 23:14 ![]() |
Re: Возврат массива из метода | |
---|---|
of63 Сообщений: 26001 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
> Что за проблемы, которые, якобы, нужно решать при этом разработчикам, я так и не понял.
Резервирование памяти под новые элементы массива... Не знаю, как это кодили разрабы. ![]() |
© 2000-2025 Fox Club  |