#include #include #include #include // setlocale forall( [C], [S] ) $\C{// Class size, Students in class}$ struct School { @array( int, C )@ classIds; $\C{// nested VLAs}$ @array( int, S )@ studentIds; @array( int, C, S )@ preferences; $\C{// multidimensional}$ }; // TODO: understand (fix?) why these are needed (autogen seems to be failing ... is typeof as struct member nayok?) forall( [C], [S] ) void ?{}( School( C, S ) & this ) {} forall( [C], [S] ) void ^?{}( School( C, S ) & this ) {} forall( [C], [S] ) void init( @School( C, S ) & classes@, int class, int student, int pref ) with( classes ) { classIds[class] = class; $\C{// handle dynamic offsets of fields within structure}$ studentIds[student] = student; preferences[class][student] = pref; } int main() { int classes, students; sin | classes | students; @School( classes, students ) school;@ int class, student, preference; // read data into school calling init // for each student's class/preferences try { for ( ) { sin | class | student | preference; init( school, class, student, preference ); } } catch( end_of_file * ) {} for ( s; students ) { sout | "student" | s | nonl; for ( c; classes ) { sout | school.preferences[c][s] | nonl; } sout | nl; } } /* $\$$ cat school1 2 2 0 0 1 1 0 7 0 1 12 1 1 13 $\$$ a.out < school1 student 0 1 7 student 1 12 13 $\$$ cat school2 3 3 0 0 1 1 0 7 2 0 8 0 1 12 1 1 13 2 1 14 0 2 26 1 2 27 2 2 28 $\$$ a.out < school2 student 0 1 7 8 student 1 12 13 14 student 2 26 27 28 */ // Local Variables: // // compile-command: "sed -f sedcmd hello-accordion.cfa > ../build/tmp.cfa; cfa ../build/tmp.cfa -Wall -Wextra" // // End: //