Основният ми език за програмиране, j, наскоро беше отворен- източник. За да го подобря, изучавам източника, който е написан на C.
Но мина много (!) време, откакто не съм чел или писал C, а тогава дори не бях добър в него. И начинът, по който е написана тази конкретна кодова база, е ... идиосинкратичен (много интерпретатори на APL, J сред тях, имат изходния си код, написан в "APL стил" от високо ниво, дори когато са написани на език от ниско ниво; много кратък, излишъкът е избегнат , тежка макро употреба и т.н.)
В момента се опитвам да разбера основните структури от данни, които използва. Най-фундаменталният е typedef A
("A" е за "масив"):
typedef struct {I k,flag,m,t,c,n,r,s[1];}* A;
което разбирам добре. Но се мъча да си обясня какво е AF
, два реда по-късно:
typedef A (*AF)();
Какво означава този синтаксис? По-специално, какво означава, когато нещата по-късно се декларират като "тип AF"? AF
просто указател ли е към A
?
Непосредствената ми цел е да интерпретирам дъмпове на паметта, които включват неща от тип V
(за "глагол"), чиито първи два члена са AF
s:
typedef struct {AF f1,f2;A f,g,h;I flag,mr,lr,rr,fdep;C id;} V;
но общата ми цел е по-голяма от това, така че, моля, разработете по-подробно синтаксиса, използван в дефиницията на AF.
AF
е указател към функция, която не приема параметри и връщаA
. - person Sergey Kalinichenko   schedule 11.08.2015A
. Много вероятно трябва да се дефинира катоtypedef A (*AF)(void);
. Ако наистина е предназначено да приема произволен брой аргументи, тогава можете много лесно да имате недефинирано поведение, като извикате функция неправилно, без диагностика от компилатора. - person Keith Thompson   schedule 11.08.2015()
, приема фиксиран, но неопределен брой аргументи. Съответната дефиниция определя действителния брой и тип(ове) на параметрите. Това е остаряла функция. Променлива функция, катоprintf
, се декларира/дефинира с, ...
и приема N фиксирани аргумента плюс 0 или повече ... - person Keith Thompson   schedule 11.08.2015A func(A)
иA func(A, A)
; това биха били две различни функции, които имат едно и също име. C няма претоварване, но можете да дефиниратеA func1(A)
иA func2(A, A)
. (Не познавам J, така че не мога да коментирам как работи.) - person Keith Thompson   schedule 11.08.2015