{"id":6987,"date":"2011-06-01T19:45:07","date_gmt":"2011-06-01T17:45:07","guid":{"rendered":"http:\/\/www.devapp.it\/wordpress\/?p=6987"},"modified":"2011-10-05T12:26:16","modified_gmt":"2011-10-05T10:26:16","slug":"15-costrutti-enum-union-e-struct","status":"publish","type":"post","link":"https:\/\/www.devapp.it\/wordpress\/15-costrutti-enum-union-e-struct\/","title":{"rendered":"15. Costrutti enum, union e struct"},"content":{"rendered":"<p><a href=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/corso-completo-c-costrutti-enum-union-struct-00.jpg\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/06\/corso-completo-c-costrutti-enum-union-struct-00.jpg\" alt=\"corso-completo-c-costrutti-enum-union-struct-00\" title=\"corso-completo-c-costrutti-enum-union-struct-00\" width=\"200\" height=\"100\" class=\"alignleft size-full wp-image-6991\" \/><\/a> Benvenuti alla quindicesima lezione del nostro corso completo di programmazione in C, se avete avuto l&#8217;ardore di seguirci fino a questo punto ormai avrete preso familiarit\u00e0 con il C e la sua sintassi.<\/p>\n<p>In questa lezione vedremo tre costrutti: <strong>enum<\/strong>, <strong>union<\/strong> e <strong>struct<\/strong> che ci permetteranno di scrivere codice pi\u00f9 comprensibile e pi\u00f9 vicino al modo umano di vedere le cose. Questi costrutti sono forse &#8220;gli antenati&#8221; della moderna programmazione ad oggetti, vedremo infatti che utilizzandoli ci si pu\u00f2 distaccare dal concetto di semplice variabile ed iniziare a ragionare in termini di &#8220;entit\u00e0&#8221; pi\u00f9 complesse.<!--more--><\/p>\n<h4>enum<\/h4>\n<p>Le enum ci vengono incontro quando abbiamo a che fare con una lista di valori.<\/p>\n<p>Facciamo un esempio: supponiamo di aver scritto un programa che, a seconda del giorno della settimana,  ci mostri un messaggio personalizzato:<\/p>\n<p>in pseudocodice:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif (oggi = Luned\u00ec)\r\n\r\n   messaggio = \"Dai, alzati il week end \u00e8 finito\"\r\n\r\nelse if (oggi = marted\u00ec )\r\n\r\n  messaggio = \"Alzati campione!\"\r\n\r\nelse if (oggi = mercoled\u00ec )\r\n\r\n   messaggio = \"Gi\u00e0 mezza settimana! inizia a programmare il prossimo weekend\"\r\n\r\n\u2026..e cos\u00ec via....\r\n<\/pre>\n<p>Dovremmo decidere per\u00f2 come memorizzare l&#8217;elenco dei giorni della settimana&#8230;.volendo si potrebbero memorizzare come stringhe di testo ma questo \u00e8 un grosso problema, primo perch\u00e9 le stringhe di testo in C vanno trattate con cautela (li vedremo la prossima lezione) e poi \u00e8 sempre possibile digitare male, nell&#8217;esempio precedente &#8220;marted\u00ec&#8221; e &#8220;mercoled\u00ec&#8221; li ho scritti con le iniziali minuscole.. scartate le stringhe allora dobbiamo assegnare un codice numerico, decidiamo ad esempio che per noi 0 significa &#8220;Luned\u00ec&#8221; e modifichiamo il codice scivendo, sempre in pseudocodice:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nif ( oggi = 0 )\r\n\r\n   messaggio = \"Dai, alzati il week end \u00e8 finito\"\r\n\r\n\u2026 e cos\u00ec via....\r\n<\/pre>\n<p>Ma quanto \u00e8 chiaro questo test? Quando ci saremo dimenticati di aver associato mentalmente 0 a &#8220;Luned\u00ec&#8221; riusciremo a capire il nostro codice? Per un inglese sarebbe pi\u00f9 ragionevole supporre che 0 sia associato a &#8220;Sunday&#8221;?<\/p>\n<p>Ecco quindi che nascono le enum. Utilizzando questo costrutto:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nenum _GiorniSettimana{\r\n\r\n    Luned\u00ec,\r\n\r\n    Marted\u00ec,\r\n\r\n    Mercoled\u00ec,\r\n\r\n    Gioved\u00ec,\r\n\r\n    Venerd\u00ec,\r\n\r\n    Sabato,\r\n\r\n    Domenica\r\n\r\n};\r\n<\/pre>\n<p>abbiamo definito un nuovo tipo di dato, utilizzabile cos\u00ec come utilizziamo <em>int<\/em>, <em>char<\/em> e via dicendo, ma che pu\u00f2 assumere solo i valori elencati all&#8217;interno della enum.<\/p>\n<p>In questo modo il nostro codice sar\u00e0 sicuramente pi\u00f9 chiaro.<\/p>\n<p>Metto qui il codice completo di un piccolo esempio che ho scritto utilizzando la libreria time.h, forse il codice non sar\u00e0 comprensibile a tutti, soprattutto la funzione <em>today()<\/em> ma quello che conta \u00e8 che siamo riusciti ad inserire all&#8217;interno del nostro programma, in maniera semplice, il concetto di giorno della settimana.<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <time.h>\r\n\r\nenum GiornoSettimana{\r\n\r\n    Domenica,\r\n\r\nLunedi,\r\n\r\n    Martedi,\r\n\r\n    Mercoledi,\r\n\r\n    Giovedi,\r\n\r\n    Venerdi,\r\n\r\n    Sabato,\r\n\r\n};\r\n\r\nenum GiornoSettimana today() {\r\n\r\n        time_t timer;\r\n\r\n        timer=time(NULL);\r\n\r\n        struct tm *currentTime = localtime(&timer);\r\n\r\n        return currentTime->tm_wday;\r\n\r\n}\r\n\r\nint main(void) {\r\n\r\n        enum GiornoSettimana giornodioggi = today();\r\n\r\n        if (giornodioggi == Domenica) {\r\n\r\n                printf(\"Oggi \u00e8 Domenica!!\");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Lunedi) {\r\n\r\n                        printf(\"Dai, alzati il week end \u00e8 finito\");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Martedi) {\r\n\r\n                        printf(\"Alzati campione!\");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Mercoledi) {\r\n\r\n                        printf(\"Gi\u00e0 mezza settimana! inizia a programmare il prossimo weekend\");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Giovedi) {\r\n\r\n                        printf(\"Domani \u00e8 venerd\u00ec :) \");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Venerdi) {\r\n\r\n                        printf(\"Venerd\u00ec..lo senti il profumo del Sabato??\");\r\n\r\n        }\r\n\r\n        else if (giornodioggi == Sabato) {\r\n\r\n                printf(\"Inizia il fine settimana!!\");\r\n\r\n        }\r\n\r\n        return 0;\r\n\r\n}\r\n<\/pre>\n<p>Come si pu\u00f2 notare l&#8217;enum ha proprio definito un nuovo tipo di dato, ed \u00e8 possibile dichiarare una variabile di questo nuovo tipo scrivendo semplicemente:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nenum GiornoSettimana nome_variabile\r\n<\/pre>\n<p>Ma come funziona l&#8217;enum? L&#8217;idea di base \u00e8 molto semplice, ad ogni valore della enumerazione viene assegnato un intero a partire da 0, quindi a basso livello il confronto viene sempre fatto con gli interi, ma ad alto livello noi vediamo nomi pi\u00f9 significativi come &#8220;luned\u00ec, marted\u00ec etc&#8221;.<\/p>\n<h4>UNION<\/h4>\n<p>Le <strong>union<\/strong> definiscono, cos\u00ec come le enum, un tipo di dato. La particolarit\u00e0 della union \u00e8 che contiene pi\u00f9 variabili, anche di dimensioni diverse ma tutte sono memorizzate alla stessa allocazione di memoria quindi occupa lo spazio occupato dalla pi\u00f9 grande di esse. Questo, in pratica, significa che la union \u00e8 come un &#8220;contenitore&#8221; che pu\u00f2 essere utilizzato per contenere pi\u00f9 tipi di variabili, ma ne pu\u00f2 essere utilizzato solo uno alla volta.<\/p>\n<p>Riporto, per comodit\u00e0, un esempio prelevato da wikipedia (<a href=\"http:\/\/it.wikipedia.org\/wiki\/Union_%28C%29\" target=\"_blank\">link<\/a>)<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n#include <stdio.h>\r\nunion numero{\r\n  int valX;\r\n  int valY;\r\n};\r\n\r\nint main(){\r\n  union numero Punto; \/\/ Definisce la variabile Punto di tipo union numero\r\n  Punto.valX=50; \/\/ Inizializza il membro valX dell'unione al valore 50\r\n  Punto.valY=100; \/\/ Inizializza il membro valY dell'unione al valore 100\r\n\r\n  printf(\"Il valore di X vale %d mentre il valore di Y vale %d\\n\",Punto.valX,Punto.valY); \/\/ Stampa sullo schermo i membri dell'unione''\r\n\r\n  return 0;\r\n}\r\n<\/pre>\n<p>Per accedere alla variabile contenuta all&#8217;interno della union si utilizza il &#8220;.&#8221; e come si pu\u00f2 notare eseguendo il programma l&#8217;utilizzo della variabile &#8220;valY&#8221; all&#8217;interno della union ha sovrascritto il valore della variabile &#8220;valX&#8221;.<\/p>\n<p>Ci possono essere per\u00f2 utilizzi pi\u00f9 complessi del costrutto union, ad esempio per contenere alternativamente un intero oppure un puntatore a caratteri.<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nunion identificativo{\r\n  int id_int;\r\n  char *id_char;\r\n};\r\n<\/pre>\n<p>La union la si pu\u00f2 pensare come l&#8217;antesignana del polimorfismo dei nuovi linguaggi ad oggetti, perch\u00e9 si pu\u00f2 utilizzare una variabile in pi\u00f9 modi a seconda della necessit\u00e0. (ok forse \u00e8 un p\u00f2 forzato :P).<\/p>\n<h4>STRUCT<\/h4>\n<p>Lo ammetto, il costrutto <strong>struct<\/strong> \u00e8 il mio preferito. Serve per definire un nuovo tipo di variabile, aggregando altri tipi di variabili ed eventualmente altre strutture.<\/p>\n<p>Questo ci permette di staccarci dalla logica delle singole variabili ed iniziare a pensare in temrmini di &#8220;oggetti&#8221; (non storcano il naso i puristi della OOP).<\/p>\n<p>Partiamo dall&#8217;esempio classico: scrivere una funzione che restituisca la distanza euclidea tra due punti nello spazio r2, in altri termini &#8220;date le misure dei cateti di un triangolo rettangolo, restituire la misura dell&#8217;ipotenusa&#8221;.<\/p>\n<p>Se non usassimo le strutture il programma sarebbe pressapoco cos\u00ec:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <math.h>\r\n\r\nfloat distance(float x1, float y1, float x2, float y2) {\r\n\r\n        float d;\r\n\r\n        d = sqrt( pow(x1 - x2, 2) + pow(y1 - y2,2));\r\n\r\n        return d;\r\n\r\n}\r\n\r\nint main(void) {\r\n\r\n        float punto1x, punto1y, punto2x, punto2y, distanza;\r\n\r\n        punto1x = 0;\r\n\r\n        punto1y = 0;\r\n\r\n        punto2x = 1;\r\n\r\n        punto2y = 1;\r\n\r\n        distanza = distance(punto1x, punto1y, punto2x, punto2y);\r\n\r\n        printf(\"La distanza \u00e8: %2f\",distanza);\r\n\r\n        return 0;\r\n\r\n}\r\n<\/pre>\n<p>L&#8217;esempio sopra funziona, non c&#8217;\u00e8 che dire.. ma come esprimiamo il fatto che &#8220;punto1x&#8221; e &#8220;punto2y&#8221; sono in qualche modo correlati, che sono due caratteristiche che nella nostra testa appartengono allo stesso concetto di &#8220;punto&#8221;? E che dire della funzione che calcola la distanza? Per noi la distanza viene calcolata tra due entit\u00e0 che sono &#8220;punti&#8221; non tra 4 numeri a virgola mobile&#8230;<\/p>\n<p>Risolviamo tutto semplicemente definendo un nuovo tipo di dato con il costrutto <em>struct<\/em> cos\u00ec definito:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nstruct Point {\r\n        float x;\r\n        float y;\r\n};\r\n<\/pre>\n<p>In questo modo il programma pu\u00f2 essere riscritto semplicemente in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\n#include <stdio.h>\r\n#include <stdlib.h>\r\n#include <math.h>\r\n\r\nstruct Point {\r\n        float x;\r\n        float y;\r\n};\r\n\r\nfloat distance(struct Point p1, struct Point p2) {\r\n        float d;\r\n        d = sqrt( pow(p1.x - p2.x, 2) + pow(p1.y - p2.y,2));\r\n        return d;\r\n}\r\n\r\nint main(void) {\r\n\r\n        struct Point p1, p2;\r\n        float distanza;\r\n        p1.x = 0;\r\n        p1.y = 0;\r\n        p2.x = 1;\r\n        p2.y = 1;\r\n\r\n        distanza = distance(p1, p2);\r\n        printf(\"La distanza \u00e8: %2f\",distanza);\r\n\r\n        return 0;\r\n}\r\n<\/pre>\n<p>In questo modo il programma ha assunto maggiore chiarezza e, soprattutto, \u00e8 pi\u00f9 simile al modo di pensare dell&#8217;uomo.<\/p>\n<p>Ma supponiamo adesso di calcolare la distanza tra due cerchi, non vogliamo certo ricadere nell&#8217;errore precedente, quindi ragioniamo subito in termini di strutture e visto che sappiamo che le strutture possono essere annidate definiamo il nostro cerchio in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nstruct Circle {\r\n    float radius;\r\n    struct Point center;\r\n};\r\n<\/pre>\n<p>e la funzione per calcolare la distanza pu\u00f2 essere tranquillamente definita in questo modo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nfloat distance(struct Circle c1, struct Circle c2) {\r\n        float d;\r\n        d = distance(c1.center, c2.center);\r\n\r\n        return d;\r\n}\r\n<\/pre>\n<p>Alzi la mano chi voleva inserire nuovamente il calcolo dentro questa funzione!<\/p>\n<p>Meno 10 punti !!<\/p>\n<p>Mai scrivere lo stesso codice due volte!<\/p>\n<h4>Aspetti Comuni &#8220;.&#8221; o &#8220;->&#8221;<\/h4>\n<p>Le union e le struct hanno molto in comune, specie nell&#8217;accesso ai loro membri interni. Negli esempi che ho proposto ho sempre utilizzato l&#8217;operatore &#8220;.&#8221; ma esiste anche un secondo metodo che prevede l&#8217;utilizzo dell&#8217;operatore &#8220;->&#8221;.<\/p>\n<p>La differnza \u00e8 che il punto si utilizza quando abbiamo dichiarato una variabile di tipo struct o union, mentre &#8220;->&#8221; si utilizza quando abbiamo dichiarato un puntatore ad una struttura o union.<\/p>\n<p>Ricordando quanto abbiamo detto per i puntatori e le funzioni, scriviamo una funzione che serva per &#8220;spostare&#8221; un cerchio.<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nvoid moveCircle(struct Circle *c) {\r\n        c->center.x = c->center.x + 10;\r\n}\r\n<\/pre>\n<p>che possiamo richiamare tramite:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nstruct Circle c1;\r\n\r\nc1.radius = 5;\r\nc1.center.x = 2;\r\nc1.center.y = 5;\r\n\r\nprintf(\"Il cerchio \u00e8 centrato nel punto: %f %f\\n\",c1.center.x, c1.center.y);\r\n\r\nmoveCircle(&c1);\r\n\r\nprintf(\"Il cerchio \u00e8 centrato nel punto: %f %f\\n\",c1.center.x, c1.center.y);\r\n<\/pre>\n<h4>typedef<\/h4>\n<p>Un aspetto che riguarda anche le enum \u00e8 invece la possibilit\u00e0 di evitare di dover ogni volta scrivere enum\/union\/struct nel dichiarare le nostre variabili.<\/p>\n<p>Ad esempio dichiarando la struttura &#8220;Circle&#8221;, quando vogliamo un tipo di dato di tipo &#8220;Circle&#8221; siamo costretti a scrivere:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nstruct Circle c1;\r\n<\/pre>\n<p>Questo si pu\u00f2 ovviare con il costrutto <strong>typedef<\/strong>, che permette di creare un vero e proprio tipo di dato a tutti gli effetti. Scrivendo quindi:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\ntypedef struct Circle {\r\n\r\n    float radius;\r\n    struct Point center;\r\n};\r\n<\/pre>\n<p>possiamo dichiarare le nostre nuove variabili semplicemente scrivendo:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\nCircle c1;\r\n\r\n\/\/cos\u00ec come si fa con\r\n\r\nint j;\r\n<\/pre>\n<h4>Dichiarazione automatica<\/h4>\n<p>In alcuni casi potremmo incontrare una dichiarazione di struct\/enum\/union leggemente diversa da quella che ho dato io, ad esempio potremmo trovare:<\/p>\n<pre lang=\"c\" line=\"1\" escaped=\"true\">\r\ntypedef struct Circle {\r\n    float radius;\r\n    struct Point center;\r\n} circle;\r\n<\/pre>\n<p>In questo caso quello che avviene \u00e8 che stiamo dichiarando una variabile di tipo &#8220;Circle&#8221; direttamente durante la definizione del tipo. Io non amo molto questo modo di fare, soprattutto perch\u00e9 la definizione dei tipi la faccio con scope globale e se dichiarassi una variabile in quel punto questa sarebbe una variabile globale, che cerco di evitare quanto pi\u00f9 possibile.<\/p>\n<p>Alla prossima!!<\/p>\n<h4>Letture consigliate:<\/h4>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/03\/C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" title=\"C-Corso-Completo-di-Programmazione-kernighan-ritchie-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7803\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/search\/ref=as_li_qf_sp_sr_il_tl?ie=UTF8&#038;keywords=887192200X&#038;tag=de0d-21&#038;index=aps&#038;linkCode=as2&#038;camp=3370&#038;creative=23322\" target=\"_blank\"><strong>Il linguaggio C. Principi di programmazione e manuale di riferimento (Accademica) <\/strong><\/a><br \/>\n<em>Brian W. Kernighan &#8211; Dennis M. Ritchie<\/em><br \/>\n<strong>Editore:<\/strong> Pearson | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 313 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 27,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 22,95 con Spedizione gratuita<\/p>\n<p><a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2011\/09\/C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP.jpg\" alt=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" title=\"C-Corso-Completo-di-Programmazione-Deitel-Deitel-devAPP\" width=\"54\" height=\"75\" class=\"alignleft size-full wp-image-7550\" \/><\/a> <a href=\"http:\/\/www.amazon.it\/gp\/product\/8850329547\/ref=as_li_qf_sp_asin_il_tl?ie=UTF8&#038;tag=de0d-21&#038;linkCode=as2&#038;camp=3370&#038;creative=23322&#038;creativeASIN=8850329547\" target=\"_blank\"><strong>C. Corso completo di programmazione<\/strong><\/a><br \/>\n<em>Paul J. Deitel &#8211; Harvey M. Deitel<\/em><br \/>\n<strong>Editore:<\/strong> Apogeo | <strong>Lingua:<\/strong> Italiano | <strong>Brossura:<\/strong> 640 pagine<br \/>\n<strong>Prezzo Listino:<\/strong> <del datetime=\"2011-09-03T10:00:08+00:00\">EUR 39,00<\/del><br \/>\n<strong>Prezzo Promozione:<\/strong> EUR 33,15 con Spedizione gratuita<\/p>\n<p><center><br \/>\n<a href=\"http:\/\/www.devapp.it\/wordpress\/supporto-applicazioni\/le-applicazioni-dei-nostri-autori\/parole-vietate-di-ignazio-calo\" target=\"_blank\"><img loading=\"lazy\" decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.devapp.it\/wordpress\/wp-content\/uploads\/2010\/02\/bannerIgnazioc.png\" alt=\"\" width=\"480\" height=\"100\" \/><\/a><br \/>\n<\/center><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Benvenuti alla quindicesima lezione del nostro corso completo di programmazione in C, se avete avuto l&#8217;ardore di&#8230;<\/p>\n","protected":false},"author":53,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"footnotes":""},"categories":[569],"tags":[593,588,751,724,723,241,752,754,753],"class_list":["post-6987","post","type-post","status-publish","format-standard","hentry","category-corso-completo-di-c","tag-corso-completo-di-c-2","tag-corso-di-c","tag-enum-in-c","tag-esempi-codice-programmazione-c","tag-esercizi-programmazione-c","tag-ignazio-calo","tag-struct-in-c","tag-typedef-in-c","tag-union-in-c"],"acf":[],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6987","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/users\/53"}],"replies":[{"embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/comments?post=6987"}],"version-history":[{"count":7,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6987\/revisions"}],"predecessor-version":[{"id":7819,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/posts\/6987\/revisions\/7819"}],"wp:attachment":[{"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/media?parent=6987"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/categories?post=6987"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.devapp.it\/wordpress\/wp-json\/wp\/v2\/tags?post=6987"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}