Кито подскажет как КОШЕРСТНО прописывается передача дву и более мерных массивов указателей на функцию аргументами для (другой) функции?
такое у наркологов лучше поспрашивать. если серьезно - это чисто академический интерес, или на самом деле зачем-то понадобилось? указатель на int должен сойти вроде.
лично я всегда начинаю с описания собственного типа. допустим, нужен указатель на функцию с тремя параметрами char, int и long? возвращающую int. определяем его:
Код:
typedef int (*func_ptr)(char, int, long);
теперь, имея тип, можно сделать хоть семимерный массив без особого труда
Код:
func_ptr array[10][20]; // например, так для двумерного варианта
ну а потом, заполнив предварительно массив значениями, можно вызывать функции:
Код:
int result = array[i][j](10,20,30);
по-моему, ничего сложного
Добавлено after 5 minutes 27 seconds: перечитал это
BOB51 писал(а):
передача дву и более мерных массивов указателей на функцию аргументами для (другой) функции?
и подумал, что наверное, речь шла о том, как такой массив передать в функцию... ну так подход тот же самый - определяем тип, а потом в функцию передаем параметр этого типа:
Код:
typedef func_ptr array_t[10][20];
void my_func(array_t parameter); // прототип функции с параметром этого типа
array_t my_array; // объявили переменную этого типа (т.е. двумерный массив)
my_func(my_array); // передали в функцию
// а так в функции обрабатываем переданый параметр, вызывая все функции из массива void my_func(array_t parameter){ for(uint8_t i=0; i<10; i++) for(uint8_t j=0; j<20; j++) parameter[i][j](10,20,30); }
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Штука несколько более садистская... Есть КОТ(main) в нем массив СЫР с указателями на функции размещенные во внешнем файле КРЫС... каждая из функций КРЫСа может при необходимости заменить содержимое массива СЫР находящегося в области КОТа... и КОТ может при надобности выполнить одну из функций КРЫСа по указателю , который вытащен из СЫРа Ну и вдобавок есть еще два объекта - КОРМИЛКА и ПОИЛКА. КРЫС и КОТ одинаково могут использовать их содержимое (методы) внутри своих функций. Именно внутри функций без передачи ссылки на КОРМИЛКу и ПОИЛКу параметрами этих функций... При том, что разновидностей КРЫС в одном проекте может бысть несколько. Вобщем... САДОМАЗОХИЗМ и измышления...
Это из интереса - можно ли повторить простенькую рабочую прожку, что давненько на "чистом ассемблере" написана была без особого труда под Си... Пока что ... ОБЛОМС... всплывают весьма муторноэтажные конструкции... или такой алгоритм обработки под Си применить проблематично, надо чего переиначить (а нежелательно... оченно укусненькое решение было...)
Эти "хвосты" вылезать начинают при желании разбить программу на раздельные файлы, имеющие совместно-перекрестный доступ к внутреннему функционалу друг дружки - проблемы "границ видимости". Возможно не та "точка разбиения" выбрана.
BOB51, нельзя подходить методами программирования на ассемблере к программированию на Си, тем более С++. если вы умеете собирать песок в мешок пинцетом, то переход к лопате означает увеличение производительности вашей работы, но совсем не означает, что вам будет просто взять отдельную песчинку новым инструментом! меняя инструмент, надо использовать его возможности, а не страдать о том, что упущены возможности предыдущего.
есть виртуозы, которые трехкубовым ковшом экскаватора подбирают спичечный коробок, т.е. это сделать можно. но нужно ли это делать?!
как только вы осознаете, что Си требует совсем иного подхода к "разбиению на файлы", к построению алгоритмов и т.п., вым сразу станет легче.
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Иногда таки не мешает и "пободать стенку" - побочная разборка нюансов даже при отрицательном общем результате дает плюсики (в другом месте полученный материал пригодится). Однако для понимания где чего переиначить надо "бодать" до исчерпания последней имеющейся возможности. Вроде с typedef прояснилось... МРУММ!! Возможно частично вопрос закроет.
Так из размышлений... дополнительные #include mmmm.h могут прописываться как в самом test.c(test.ccp) файле, так и в заголовочнике данного файла test.h... на что может повлиять разница размещения записей?
допустим имеется : test1.h test1.cpp test2.h test2.cpp и Htest.h Htest.cpp
вариант 1
Htest.h содержит #include "test1.h" // скобки или <> в данном случае неважно - // о разнице в области поиска размещения речь не идет #include "test2.h"
Htest.cpp содержит #include "Htest.h"
и вариант 2 Htest.h не содержит строчек подключения, а
Htest.cpp содержит #include "Htest.h" #include "test1.h" #include "test2.h"
Карма: 38
Рейтинг сообщений: 623
Зарегистрирован: Пн апр 06, 2015 11:01:53 Сообщений: 3092 Откуда: москва, уфа
Рейтинг сообщения:0
в Htest.h используются какие-то конструкции из test1 и test2? если да - включаем их туда, если нет - то нет. даже если препроцессор разберется и технически все будет равнозначно - в целом удобнее в каждый файл включать только те заголовочники, которые нужны непосредственно ему.
ПЕЧАЛЬКА однако... Приятно - мяконькие typedef не слишком хорошо уживаются с многофайловиками и extern... В отличии от линейно - однофайлового варианта с "условно-независимыми" библиотеками... Приходится к задуренной "стандартной" системе объявления указателей (множествоскобочной) обращаться... А там... "указатель указателя" как-то... напряжно воспринимаются... И описания аки их конструировать (за какими скобками * ставить) весьма мало и смуторно... Воть такой тест-пример (абсолютно случайная задачка для отработки перекрестных вызовов при нескольких файлах в проекте):
Замена на typedef в нем работать не будет. А в текущем виде и компилируется и платкой отрабатывается (сбрасывает в терминалку отчет-распечатку). Может еще какой вариант упущен...
вегда typedef будет работатть, если вы ПОНИМАЕТЕ, что это такое и для чего оно. если вам нужно, чтобы введенный вами тип понимался в разных файлах, вы должны описать этот тип в файле-заголовке и подключить этот заголовок везде, где требуется этот тип. вы же можете пользоваться типом uint32_t везде, где подключили stdint.h? точно так же вы сможете пользоваться своими типами везде, где подключите свой заголовочник с описанием этого типа.
не придумывайте проблему на пустом месте
_________________ если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе при взгляде на многих сверху ничего не меняется...
Очень печалько, однако таки ФАКТ... (может касаемо только адуриньей IDE? ) Вышевыложенный тест (mino_1) и компилируется и макеткой отрабатывается... А вот его собрат (все то же самое, кроме способа написания указателя на функцию):
где указатель на функцию выведен через typedef в общем для всех заголовочнике НИКАК компилироваться не желает... Мозги уже зашипели... Кстати там и с extern "разминка" сделана. В чем разница - Х/З.... одначе весьма досадно...
КСТАТИ... Поле ошибок (красненьки строчки) ошибки типов указателей на функцию также выводит в "скобочном" варианте... А там ведь GCC задействован...
Верно... ПРОТУПИЛ... "Скобчатая" форма сразу и определение переменной делает... Однако... таки некоторые заметки остались (принято к сведению "как есть" ибо пока без особой надобности в уточнениях)
А пока сам не разберусь какие могут быть extern, а какие НЕТ. Из всего, что пред глазы попадалось на ту тему - только треть странички в книже Страутструпа (язык программирования С++ стр.34)... Ежли учесть что проекты-многофайловики с перекрестным использованием "общих" элементов не так часто попадаются в примерах... Не слишком уж много... А приличный многофайловик без знаний "границ кошерстности" для extern нашкарябать весьма затруднительно.
А пока сам не разберусь какие могут быть extern, а какие НЕТ.
Это же элементарно. Если переменная объявлена без extern, она создается, т. е. под нее выделятся место в памяти. Если переменная объявлена с extern, это указывает компилятору что где-то в другом месте переменная объявлена без extern. Компилятор не выделяет память под переменную. То есть в программе может быть только одна переменная с одним и тем же именем объявлена без extern (пространства имен и т. д. не считаем). Прочитайте учебник по Си. В нем все написано.
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения