27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|||||||||||
1 | |||||||||||
Передача массива в функцию используя указатель на функцию01.08.2015, 13:35. Показов 3659. Ответов 15
Метки нет (Все метки)
У меня имеется готовая программа без передачи функции в функцию указателем, мне нужно передать функцию ввода масива в функцию его обработки с помощью указателя. Имеется 3 функции ввода и 1 обработки, при вводе не из файла в качестве отсутствующих параметров можно добавить (..., NULL, "") дабы был один формат
Без указателей объявления такие:
Вся программа целиком: Кликните здесь для просмотра всего текста
И ещё нужна помощь в переделывании последней функции void SearchMin(__int16 * & ArrX, unsigned int & SizeH, __int16 & Min) на рекурсию
0
|
01.08.2015, 13:35 | |
Ответы с готовыми решениями:
15
Передача структуры в функцию, используя указатель Передача массива в функцию через указатель Передача массива через указатель в шаблонную функцию Передача массива структур в функцию через указатель |
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|||||||||||
01.08.2015, 14:04 [ТС] | 2 | ||||||||||
Думаю можно сделать если не передачу функций ввода массива, то передачу функции, описывающей массив, например, такой void Array(__int16 * & Arr, unsigned int & SizeW, unsigned int & SizeH), только я не соображу что должна делать такая функция или она просто должна быть типом данных, и класс для неё я не сделаю, только если просто структуру может быть.
Имеющиеся у меня примеры передачи ссылок на функции: Кликните здесь для просмотра всего текста
Кликните здесь для просмотра всего текста
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
01.08.2015, 14:10 | 3 | |||||
Ваю, приведу для тебя простой пример работы с указателем на функцию:
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
||||||
01.08.2015, 14:24 [ТС] | 4 | |||||
Tulosba, да, такие примеры мне понятны, но что мне делать в моём случае - не до конца. Допусим я переделаю принимающую указатель функцию на такую - int MaxInStr (__int16 * & ArrX, void * Array), что мне потом нужно делать с этим, чтобы оно заработало? Нужно ли делать эту функцию типом данных? - из имеющихся у меня примеров вроде как и нет, но когда я стал пытаться делать - переменные оказались неинициализированными, поэтому пришлось объявить функцию ч.з typedef, но у меня не получилось доделать всё до конца
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
01.08.2015, 14:30 | 5 |
Если передаешь указатель на функцию внутрь другой функции, то, вероятно, в какой-то момент нужно ее вызвать через этот указатель.
Если под этим ты понимаешь создание typedef, то это не обязательно, но добавляет удобства при частом использовании указателя на функцию.
Опиши словами, что хочешь сделать. Не в терминах языка программирования, а в терминах задачи.
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|
01.08.2015, 14:35 [ТС] | 6 |
То, что мне осталось доделать выделено жирным.
Полный текст моего задания: Условия выполнения: Выбрать алгоритм, составить его блок-схему и программу для решения выбранного варианта задания. Программа должна по выбору пользователя осуществлять ввод исходной матрицы с клавиатуры или из файла. Для этого программа должна содержать две соответствующие функции, указатель на одну из которых необходимо передавать в функцию для вычисления элементов массива Х. Данная функция должна вызывать через указатель одну из функций ввода элементов матрицы, производить вычисление элементов массива X в соответствии с заданием и возвращать указатель на этот массив. Кроме того, программа должна содержать функцию для вывода на экран и в файл исходной матрицы и результирующего массива, а также рекурсивную функцию определения в соответствии с заданием величины Y. В программе не должно быть глобальных переменных. Вариант задания: Дана матрица А(5х5). Определить массив Х из 5 элементов, каждый из которых равен наибольшему элементу соответствующей строки матрицы. Определить величину Y, как наименьший из положительных элементов массива X.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||||||||||||||||||||||
01.08.2015, 14:56 | 7 | ||||||||||||||||||||||||||||||
1. Выделяем сигнатуру функции ввода из этих:
2. Создаем прототип функции обработки (то, что ты выдел жирным).
3. В main() заводишь переменную (указатель на функцию ввода):
Потом делаешь вызов ранее созданной функции:
1
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|
01.08.2015, 15:35 | 9 |
Я сначала тоже так подумал, и даже написал, но перед отправкой на форум оставил void. Т.к. подумал, что возвращать можно и через ссылочные параметры. Как это делается в тех же функциях ввода. А через return было бы актуально для организации цепочек вызовов, но это не тот случай всё же.
В общем, если препод потребует, то ТС, я думаю, добавит
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
||||||
01.08.2015, 15:40 [ТС] | 10 | |||||
У меня возник вопрос по поводу пункта 2:
В последствии input становится переменной, имеющей 3 параметра для получения адреса массива, его ширины и высоты, далее в описании написано "В теле делаем вызов функции ввода", здесь input является именем той функции, с помощь которой пользователь захочет произвести ввод. В моём случае это будет так?
Ниже Kerry_Jr предложил добавить указатель к функции, этого я тоже не знаю, имя функции = адрес функции, если к адресу добавить указатель - получается взятие значения функции, если я правильно понимаю, но функция в данном случае походу возвращает код отработки, а не значение переменной результата по средствам return, значит я понимаю это неправильно
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
01.08.2015, 17:03 | 11 | |||||
Переменная типа InputFun есть указатель на функцию соответствующей сигнатуры, то что было написано при создании синонима типа:
Что "это"? Слишком витиевато рассуждаешь, трудно тебя понять. Ясно только, что ты "плаваешь" в терминологии. А использование "ссылок на указатели", типов из разряда __int16 (зачем именно такой тип для данной задачи?) и смеси сишного и плюсового кода только усугубляет ситуацию. В общем, надо бы подтянуть уровень языка. Иначе просто не будет понимания, что из чего следует и зачем. Если, конечно, оно действительно нужно, а не просто "сдать зачет" и забыть.
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|
01.08.2015, 17:17 [ТС] | 12 |
я не умею правильно выражаться, но вы меня поняли, смесь си и си++ у меня по большей части только в вводе/выводе из-за макросов или как там они называются, я про %d и подобное, они в простом си удобнее и проще, выделение памяти использую от си, поскольку оно более гибкое, нежели просто new/delete, им покрайней мере мне пользоваться удобнее. Без использования ссылок на указатели будет невозможно сделать кое что в программе, без них получается некрасиво, а на счёт типов данных - так просто мне удобнее, сразу видно объём памяти занимаемой переменной, не нужно вспоминать что такое Short
Под "это" я понимал 2 пункт, с которым я не разобрался до конца и по которому задал вопрос.
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
|||||||||||
01.08.2015, 17:42 | 13 | ||||||||||
Разбираем по частям:
Речь о функции, которую я назвал Process Сначала надо в Process передать указатель (input), а потом сделать вызов:
(тут стоит уточнить, что input внутри main, и input внутри Process - это разные переменные, но значение из первой (что в main) при вызове Process копируется во вторую) принимает значение либо InpKbdArr, либо GenRndArr. Обрабатываешь данные должным образом. Т.е. из матрицы получаешь массив. Тут всё таки надо добавить в сигнатуру Process возврат указателя (Kerry_Jr оказался прав). Т.о. будет выглядеть так:
Не по теме: P.S. по поводу гибкости, макросов, new/delete и прочего ты заблуждаешься по большей части. Но для этого, имхо, надо отдельную тему создавать.
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|
02.08.2015, 06:05 [ТС] | 14 |
Вызов input( Arr, SizeW, SizeH ); похож на указатель во 2м примере в 39й строке, только я неочень понимаю его, почему так и зачем там 6я строка вообще, как там работает сортировка, вычисление размеров
Не по теме: Без кода я не понимаю этого места и это не для того чтоб просто сдать и забыть, я 4й раз уже пытаюсь разобраться за последние 15 лет, но не получается, мне не у кого спрашивать как надо, у меня нет знакомомых, умеющих пользоваться компьютером, и у знакомых знакомых - тоже, я могу разбираться только на работающих аналогичных примерах, книги мне недостаточно, там нельзя найти ответы на всё, да и часто тучи опечаток из-за которых у меня ничего не получается
0
|
:)
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
|
||||||
02.08.2015, 09:15 | 15 | |||||
По твоему же заданию надо сделать косвенный вызов InpKbdArr, либо GenRndArr. И это делается через переменную input. Это которая? Эти вопросы уже выходят за границы текущей темы.
0
|
27 / 27 / 9
Регистрация: 21.04.2015
Сообщений: 697
|
|
17.08.2015, 22:52 [ТС] | 16 |
Никакие вопросы не выходят за тему указателей на функцию, которые я задаю
Кто-нибудь может показать как это делается, что нужно делать рассказывать не надо, мне нужен синтаксис для моего случая, по тем примерам которые я показал в начале мне непонятно
0
|
17.08.2015, 22:52 | |
17.08.2015, 22:52 | |
Помогаю со студенческими работами здесь
16
Передача массива в функцию через указатель Передача двумерного массива в функцию, как указатель Передача двумерного динамического массива в функцию через указатель Передача умного указателя в функцию принимающую указатель на указатель Как сделать функцию, возвращающую указатель на функцию (которая в свою очередь возвращает указатель на массив) Передача в функцию указателя на указатель Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |