{"id":106,"date":"2008-09-27T20:13:48","date_gmt":"2008-09-27T19:13:48","guid":{"rendered":"http:\/\/www.oscene.net\/site\/?p=106"},"modified":"2009-05-17T17:42:41","modified_gmt":"2009-05-17T16:42:41","slug":"capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","status":"publish","type":"post","link":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","title":{"rendered":"Capire e sfruttare i puntatori a funzione e le enum in C"},"content":{"rendered":"<p>In questo articolo vi mostrer\u00c3\u00b2 come sfruttare praticamente i puntatori a funzione e le enumerazioni, o enum, in C. Se non sapete ancora di cosa stiamo parlando vi consiglio di leggere un manuale di C o altri tutorial a livello pi\u00c3\u00b9 basilare. Il mio solito consiglio \u00c3\u00a8 l&#8217;ottimo <strong>Kernighan &amp; Ritchie<\/strong>.<\/p>\n<p>Partiamo da un programma completo in C e analizziamolo in tutte le sue parti:<\/p>\n<pre class=\"prettyprint\">#include <stdio .h>\r\ntypedef enum\r\n{\r\n\tHEX_MODE,\r\n\tDEC_MODE,\r\n\tBIN_MODE,\r\n\tOUTPUT_MODE_MAX\r\n} OutputMode;\r\n\r\ntypedef void (*printFuncCallback)(int c);\r\n\r\nvoid printDecMode(int c)\r\n{\r\n\tprintf(\"%d \", c);\r\n}\r\n<\/stdio><\/pre>\n<p><!--more--><\/p>\n<pre class=\"prettyprint\">\r\nvoid printBinMode(int c)\r\n{\r\n\tint i;\r\n\r\n\tfor (i=7; i&gt;=0; i--)\r\n\t{\r\n\t\tprintf(((c &gt;&gt; i) &amp; 1) ? \"1\" : \"0\");\r\n\t}\r\n\tprintf(\" \");\r\n}\r\n\r\nvoid printHexMode(int c)\r\n{\r\n\tprintf(\"%x \", c);\r\n}\r\n\r\nprintFuncCallback printFunc[OUTPUT_MODE_MAX] =\r\n{\r\n\tprintHexMode,\r\n\tprintDecMode,\r\n\tprintBinMode\r\n};\r\n\r\nint main(int argc, char **argv)\r\n{\r\n\tint c;\r\n\r\n\t\/\/ set the default output mode to Hex\r\n\tOutputMode mode = HEX_MODE;\r\n\r\n\tif (argc == 2)\r\n\t{\r\n\t\tif (!strcmp(argv[1], \"-h\"))\r\n\t\t{\r\n\t\t\t\/\/ activate hex mode\r\n\t\t\tmode = HEX_MODE;\r\n\t\t}\r\n\t\telse\r\n\t\t\tif (!strcmp(argv[1], \"-d\"))\r\n\t\t\t{\r\n\t\t\t\t\/\/ activate decimal mode\r\n\t\t\t\tmode = DEC_MODE;\r\n\t\t\t}\r\n\t\t\telse\r\n\t\t\t\tif (!strcmp(argv[1], \"-b\"))\r\n\t\t\t\t{\r\n\t\t\t\t\t\/\/ activate binary mode\r\n\t\t\t\t\tmode = BIN_MODE;\r\n\t\t\t\t}\r\n\t}\r\n\r\n\tfor (;;)\r\n\t{\r\n\t\tc = getchar();\r\n\r\n\t\tif (c == EOF)\r\n\t\tbreak;\r\n\r\n\t\tif (c == '\\n')\r\n\t\t{\r\n\t\t\tprintf(\"\\n\");\r\n\t\t\tcontinue;\r\n\t\t}\r\n\r\n\t\t\/\/ print the char in the selected mode\r\n\t\tprintFunc[mode](c);\r\n\r\n\t}\r\n\r\n\treturn 0;\r\n}<\/pre>\n<p>Questo programmino \u00c3\u00a8 una versione estesa di quello sviluppato nell&#8217;articolo sugli <a title=\"Operatori Bitwise\" href=\"http:\/\/www.oscene.net\/site\/programmazione\/c\/capire-e-sfruttare-le-operazioni-bitwise\">operatori bitwise<\/a>, e pertanto vi consiglio, se non l&#8217;avete ancora fatto, di seguire anche il tutorial precedente.<\/p>\n<p>Partiamo dalla spiegazione della struttura del programma.<\/p>\n<p>Abbiamo un parser per la riga di comando che seleziona la modalit\u00c3\u00a0 di funzionamento in base al flag passato come parametro:<\/p>\n<pre class\"prettyprint\"> if (argc == 2)\r\n{\r\nif (!strcmp(argv[1], \"-h\"))\r\n{\r\n\/\/ activate hex mode\r\nmode = HEX_MODE;\r\n}\r\nelse\r\nif (!strcmp(argv[1], \"-d\"))\r\n{\r\n\/\/ activate decimal mode\r\nmode = DEC_MODE;\r\n}\r\nelse\r\nif (!strcmp(argv[1], \"-b\"))\r\n{\r\n\/\/ activate binary mode\r\nmode = BIN_MODE;\r\n}\r\n}<\/pre>\n<p>Come potete notare, in questa fase viene inizializzata la variabile &#8220;mode&#8221;. I valori HEX_MODE, DEC_MODE e BIN_MODE sono i membri della enum <em><strong>OutputMode<\/strong><\/em> che abbiamo definito in questo modo:<\/p>\n<pre>typedef enum\r\n{\r\nHEX_MODE,\r\nDEC_MODE,\r\nBIN_MODE,\r\nOUTPUT_MODE_MAX\r\n} OutputMode;<\/pre>\n<p>Il compilatore tradurr\u00c3\u00a0 questi valori in interi progressivi da 0 a salire, quindi HEX_MODE equivale a zero, mentre BIN_MODE equivale a 2, (notare che OUTPUT_MODE_MAX corrisponde a 3, quindi rispecchia esattamente il numero di elementi che costituiscono la enum, cio\u00c3\u00a8 HEX, DEC e BIN).<\/p>\n<p>Dal momento che le enum vengono trattatate esattamente come numeri interi (costanti), \u00c3\u00a8 possibile utilizzarle per indicizzare gli elementi di un generico array, in questo modo:<\/p>\n<pre>printFuncCallback printFunc[OUTPUT_MODE_MAX] =\r\n{\r\nprintHexMode,\r\nprintDecMode,\r\nprintBinMode\r\n};<\/pre>\n<p>L&#8217;array si chiama <strong>printFunc<\/strong>, contiene <strong>OUTPUT_MODE_MAX<\/strong> ( = 3) elementi, di tipo <strong>printFuncCallback<\/strong>. Il tipo degli elementi \u00c3\u00a8 un tipo definito dall&#8217;utente, dichiarato come segue:<\/p>\n<pre>typedef void (*printFuncCallback)(int c);<\/pre>\n<p>Tradotto in italiano, significa <strong>printFuncCallback <\/strong>\u00c3\u00a8 un puntatore (*printFuncCallback) ad una funzione di tipo <strong>void<\/strong> che prende come parametro un <strong>int<\/strong>. Il nome di tale parametro \u00c3\u00a8 ininfluente, infatti avremmo potuto scrivere equivalentemente:<\/p>\n<pre>typedef void (*printFuncCallback)(int);<\/pre>\n<p>In sostanza abbiamo dichiarato un array con 3 puntatori a funzione. I puntatori contenuti in questo array devono essere di tipo <strong>printFuncCallback<\/strong>, ci\u00c3\u00b2 significa che possiamo inserire nell&#8217;array solo funzioni <strong>void<\/strong> che accettano in input un<strong> int<\/strong>. Ecco le nostre 3 funzioni, scritte secondo questa convenzione:<\/p>\n<pre>void printDecMode(int c)\r\n{\r\nprintf(\"%d \", c);\r\n}\r\n\r\nvoid printBinMode(int c)\r\n{\r\nint i;\r\n\r\nfor (i=7; i&gt;=0; i--)\r\n{\r\nprintf(((c &gt;&gt; i) &amp; 1) ? \"1\" : \"0\");\r\n}\r\nprintf(\" \");\r\n}\r\n\r\nvoid printHexMode(int c)\r\n{\r\nprintf(\"%x \", c);\r\n}<\/pre>\n<p>La prima stampa il parametro <strong>c<\/strong> in formato decimale ( printf(&#8220;%d &#8220;, c); ), la seconda stampa il parametro <strong>c<\/strong> in binario (vedi l&#8217;articolo precedente sulle operazioni bitwise) e la terza stampa il proprio parametro in formato esadecimale (la<strong> %x <\/strong>sta per he<strong>X<\/strong>adecimal).<\/p>\n<p>Infine abbiamo un loop che legge ogni carattere dallo standard input (generalmente la tastiera, ma su Unix pu\u00c3\u00b2 essere redirezionato da qualunque sorgente, tipicamente un file, tramite l&#8217;operazione di pipeline: cat nomefile.txt | .\/nomeprogramma ), esce quando incontra un End Of File, e stampa a video il carattere letto tramite una delle 3 funzioni:<\/p>\n<pre> for (;;)\r\n{\r\nc = getchar();\r\n\r\nif (c == EOF)\r\nbreak;        \/\/ se sono arrivato qui salto a FINE\r\n\r\nif (c == '\\n')\r\n{\r\nprintf(\"\\n\");\r\ncontinue;    \/\/ se sono arrivato qui salto al prossimo ciclo,\r\n\/\/ cio\u00c3\u00a8 torno al getchar()\r\n}\r\n\r\n\/\/ print the char in the selected mode\r\nprintFunc[mode](c);\r\n\r\n}\r\n\/\/ FINE: arrivo qui soltanto dopo il break<\/pre>\n<p>Il valore della variabile <strong>mode<\/strong> fornisce l&#8217;indice della funzione di stampa contenuta nell&#8217;array di puntatori a funzione, quindi se mode vale <strong>BIN_MODE<\/strong>, sar\u00c3\u00a0 richiamata la funzione <strong>printBinMode<\/strong>, perch\u00c3\u00a8 BIN_MODE corrisponde al numero 1 e in quella posizione dell&#8217;array abbiamo memorizzato proprio l&#8217;indirizzo di quella funzione (ricordiamo che in C gli array sono indicizzati a partire da 0).<\/p>\n<p>Da notare anche l&#8217;utilizzo delle istruzioni <strong>break<\/strong> e <strong>continue<\/strong>. Entrambe servono ad interrompere il ciclo <strong>for<\/strong> ma con modalit\u00c3\u00a0 diverse: <strong>break<\/strong> serve per terminare l&#8217;intero ciclo, mentre <strong>continue<\/strong> serve per terminare l&#8217;iterazione in corso, ma il ciclo riprende dall&#8217;iterazione successiva. Questo significa che se il programma incontra il carattere EOF (End Of File) esegue l&#8217;istruzione break, e termina il ciclo, terminando in questo caso anche l&#8217;esecuzione del programma; invece quando incontra il carattere di andata a capo <strong>\\n<\/strong> il programma stampa un&#8217;andata a capo (invece di convertirla in forma numerica come accade con tutti gli altri caratteri) e interrompe il ciclo corrente, riprendendo dal prossimo carattere.<\/p>\n<p>Salvate il sorgente in un file chiamato multimessage.c, poi potete compilare ed eseguire il sorgente usando questo comando sotto GNU\/Linux:<\/p>\n<pre>gcc -o multimessage multimessage.c<\/pre>\n<p>Poi eseguitelo e questo \u00c3\u00a8 ci\u00c3\u00b2 che otterrete:<\/p>\n<blockquote>\n<pre>$ echo \"ciao a tutti da OScene.net\" | .\/multimessage -h\r\n63 69 61 6f 20 61 20 74 75 74 74 69 20 64 61 20 4f 53 63 65 6e 65 2e 6e 65 74\r\n\r\n$ echo \"ciao a tutti da OScene.net\" | .\/multimessage -b\r\n01100011 01101001 01100001 01101111 00100000 01100001 00100000 01110100 01110101 01110100 01110100 01101001 00100000 01100100 01100001 00100000 01001111 01010011 01100011 01100101 01101110 01100101 00101110 01101110 01100101 01110100\r\n\r\n$ echo \"ciao a tutti da OScene.net\" | .\/multimessage -d\r\n99 105 97 111 32 97 32 116 117 116 116 105 32 100 97 32 79 83 99 101 110 101 46 110 101 116<\/pre>\n<\/blockquote>\n<p>Potete anche convertire interi file in questo modo:<\/p>\n<pre>$ cat file1.txt | .\/multimessage -h > file_destinazione.txt<\/pre>\n<p>e qualunque altra cosa vi venga in mente di fare!<\/p>\n<p>Buon divertimento! \ud83d\ude42<\/p>\n","protected":false},"excerpt":{"rendered":"<p>In questo articolo vi mostrer\u00c3\u00b2 come sfruttare praticamente i puntatori a funzione e le enumerazioni, o enum, in C. Se non sapete ancora di cosa stiamo parlando vi consiglio di leggere un manuale di C o altri tutorial a livello pi\u00c3\u00b9 basilare. Il mio solito consiglio \u00c3\u00a8 l&#8217;ottimo Kernighan &amp; Ritchie. Partiamo da un programma [&hellip;]<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[11],"tags":[22,26,30,37,53,58,163,79,80,89],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v23.5 - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net\" \/>\n<meta property=\"og:description\" content=\"In questo articolo vi mostrer\u00c3\u00b2 come sfruttare praticamente i puntatori a funzione e le enumerazioni, o enum, in C. Se non sapete ancora di cosa stiamo parlando vi consiglio di leggere un manuale di C o altri tutorial a livello pi\u00c3\u00b9 basilare. Il mio solito consiglio \u00c3\u00a8 l&#8217;ottimo Kernighan &amp; Ritchie. Partiamo da un programma [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c\" \/>\n<meta property=\"og:site_name\" content=\"OScene.net\" \/>\n<meta property=\"article:published_time\" content=\"2008-09-27T19:13:48+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2009-05-17T16:42:41+00:00\" \/>\n<meta name=\"author\" content=\"Antonio Barba\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Barba\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c\",\"url\":\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c\",\"name\":\"Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net\",\"isPartOf\":{\"@id\":\"https:\/\/www.oscene.net\/it\/#website\"},\"datePublished\":\"2008-09-27T19:13:48+00:00\",\"dateModified\":\"2009-05-17T16:42:41+00:00\",\"author\":{\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\/\/www.oscene.net\/it\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Capire e sfruttare i puntatori a funzione e le enum in C\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.oscene.net\/it\/#website\",\"url\":\"https:\/\/www.oscene.net\/it\/\",\"name\":\"OScene.net\",\"description\":\"Ope(rating)n S(ystem)ource Scenario\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\/\/www.oscene.net\/it\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1\",\"name\":\"Antonio Barba\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\/\/www.oscene.net\/it\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g\",\"caption\":\"Antonio Barba\"},\"sameAs\":[\"http:\/\/www.oscene.net\"],\"url\":\"https:\/\/www.oscene.net\/it\/author\/thekaneb\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","og_locale":"it_IT","og_type":"article","og_title":"Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net","og_description":"In questo articolo vi mostrer\u00c3\u00b2 come sfruttare praticamente i puntatori a funzione e le enumerazioni, o enum, in C. Se non sapete ancora di cosa stiamo parlando vi consiglio di leggere un manuale di C o altri tutorial a livello pi\u00c3\u00b9 basilare. Il mio solito consiglio \u00c3\u00a8 l&#8217;ottimo Kernighan &amp; Ritchie. Partiamo da un programma [&hellip;]","og_url":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","og_site_name":"OScene.net","article_published_time":"2008-09-27T19:13:48+00:00","article_modified_time":"2009-05-17T16:42:41+00:00","author":"Antonio Barba","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Antonio Barba","Tempo di lettura stimato":"5 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","url":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c","name":"Capire e sfruttare i puntatori a funzione e le enum in C - OScene.net","isPartOf":{"@id":"https:\/\/www.oscene.net\/it\/#website"},"datePublished":"2008-09-27T19:13:48+00:00","dateModified":"2009-05-17T16:42:41+00:00","author":{"@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1"},"breadcrumb":{"@id":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.oscene.net\/it\/programmazione\/c\/capire-e-sfruttare-i-puntatori-a-funzione-e-le-enum-in-c#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.oscene.net\/it"},{"@type":"ListItem","position":2,"name":"Capire e sfruttare i puntatori a funzione e le enum in C"}]},{"@type":"WebSite","@id":"https:\/\/www.oscene.net\/it\/#website","url":"https:\/\/www.oscene.net\/it\/","name":"OScene.net","description":"Ope(rating)n S(ystem)ource Scenario","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.oscene.net\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/df83abe3c21cb652c3ffc4aa525b96d1","name":"Antonio Barba","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/www.oscene.net\/it\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3cd4232e83d5d207d431e6fbafe5c3c2?s=96&d=retro&r=g","caption":"Antonio Barba"},"sameAs":["http:\/\/www.oscene.net"],"url":"https:\/\/www.oscene.net\/it\/author\/thekaneb"}]}},"_links":{"self":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/106"}],"collection":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/comments?post=106"}],"version-history":[{"count":4,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/106\/revisions"}],"predecessor-version":[{"id":267,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/posts\/106\/revisions\/267"}],"wp:attachment":[{"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/media?parent=106"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/categories?post=106"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.oscene.net\/it\/wp-json\/wp\/v2\/tags?post=106"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}