+ There is some semantic that GRAS cannot guess alone and you need to <i>annotate</i>
+ your declaration to add some. For example, the ctn pointer can be a reference to an
+ object or a whole array (in which case you also has to specify its size). This is done
+ with the GRAS_ANNOTE call. It is removed from the text passed to the compiler, but it helps
+ GRAS getting some information about the semantic of your data. Here, it says that \a ctn is an
+ array, which size is the result of the operation \a rows * \a cols (with \a rows and \a cols
+ being the other fields of the structure).
+
+ Please note that this annotation mechanism is not as robust and cool as this example seems to
+ imply. If you want to use it yourself, you'd better use the exact right syntax, which is
+ detailed in the \ref GRAS_dd section.
+
+ \skip GRAS_DEFINE_TYPE
+ \until matrix_t
+
+
+
+#define COLS 16
+#define MAX_ROUTESET 10
+#define MAX_LEAFSET COLS
+
+GRAS_DEFINE_TYPE(gras_row_t,
+struct gras_row_t {
+ int which_row;
+ int row[COLS][MAX_ROUTESET];
+};)
+
+typedef struct gras_row_t gras_row_t;
+
+GRAS_DEFINE_TYPE(gras_welcome_msg_t,
+struct gras_welcome_msg_t {
+ int id;
+ double time_sent;
+
+ int row_count;
+ gras_row_t *rows GRAS_ANNOTE(size,row_count);
+
+ int leaves[MAX_LEAFSET];
+};)
+
+void declare_ddt(void) {
+ gras_datadesc_type_t ddt;
+
+ gras_datadesc_set_const("COLS",COLS);
+ gras_datadesc_set_const("MAX_ROUTESET",MAX_ROUTESET);
+ gras_datadesc_set_const("MAX_LEAFSET",MAX_LEAFSET);
+
+ gras_datadesc_by_symbol(gras_row_t); /* Parse it before */
+ ddt=gras_datadesc_ref("welcome_msg_t*",gras_datadesc_by_symbol(gras_welcome_msg_t));
+ gras_msgtype_declare("welcome",ddt);
+}