📄 host.c
字号:
fclose(fpt);} /* end of basic_load() */static void save_block(MFLOAT *pbuf, MINT offset, MINT fformat, MINT block_size, FILE *fpt, MINT width)/*===========================================================*/{ MINT n; if (fformat == FF_FLOAT32) fwrite(pbuf, sizeof(MFLOAT), block_size, fpt); else if (fformat == FF_FIXED8) { float2fixed(pbuf, block_size); fwrite(pbuf, sizeof(char), block_size, fpt); } else { /* FF_ASCII */ for (n = 0; n < block_size; n++) { fprintf(fpt, " %g", *pbuf++); if ((offset + n + 1) % width == 0) fprintf(fpt, "\n"); } }} /* end of save_block() */void basic_save(message_t message)/********************************//* Creates an SN-matrix file "filename" (using the format given in "sformat" (floating-point, fixed point or ASCII) and up-loads the data from MUSIC. If necessary, the numbers are converted.*/{ MINT block_size, ndim, xdim, ydim, zdim, sformat; FILE *fpt; char *filename; sn_mathead_t sn_header; message_t msg; MINT i, ndots, nnewdots; MINT ntotal_values, values_saved, current_block_size; MFLOAT *pbuf; char *msgs; filename = bc_str_get(message[2].i, -1, NULL); sformat = message[3].i; Rd_from_music(msg, sizeof(msg)); ndim = msg[0].i; xdim = msg[1].i; ydim = msg[2].i; zdim = msg[3].i; block_size = msg[4].i; /*===== select magic number and open file =====*/ if (sformat == FF_FLOAT32) { sn_header.sn_magic = SN_FMAGIC; msgs = "floating-point"; fpt = fopen(filename, "wb"); } else if (sformat == FF_FIXED8) { sn_header.sn_magic = SN_CMAGIC; msgs = "fixed-point"; fpt = fopen(filename, "wb"); } else if (sformat == FF_ASCII) { msgs = "ASCII"; fpt = fopen(filename, "w"); } else { msg[0].i = ERR_PARCONF; Wr_to_music(msg, sizeof(msg)); /* tell Music */ return; } if (fpt == NULL) { msg[0].i = ERR_DISKERROR; Wr_to_music(msg, sizeof(msg)); /* tell Music */ return; } /*===== save header =====*/ if (sformat == FF_ASCII) { fprintf(fpt, ".MAT %ld", ndim); if (ndim > 0) fprintf(fpt, " %ld", xdim); if (ndim > 1) fprintf(fpt, " %ld", ydim); if (ndim > 2) fprintf(fpt, " %ld", zdim); fprintf(fpt, "\n"); } else { /* fixed point or floating-point */ sn_header.sn_ndim = ndim; sn_header.sn_xdim = xdim; sn_header.sn_ydim = ydim; sn_header.sn_zdim = zdim; fwrite(&sn_header, sizeof(sn_header), 1, fpt); } /*===== allocate temporary buffer =====*/ pbuf = (MFLOAT*)malloc(BUF_SIZE * sizeof(MFLOAT)); if (pbuf == NULL) { msg[0].i = ERR_NOMEM; Wr_to_music(msg, sizeof(msg)); /* tell Music */ fclose(fpt); return; } msg[0].i = ERR_NOERROR; Wr_to_music(msg, sizeof(msg)); /* tell Music ok */ /*===== upload and save matrix =====*/ printf(INDENT); printf("Saving matrix (%ldx%ldx%ld) to \"%s\" in %s format\n", xdim, ydim, zdim, filename, msgs); printf(INDENT); printf("in 10 blocks "); fflush(stdout); ntotal_values = xdim * ydim * zdim; values_saved = 0; ndots = 0; while (values_saved < ntotal_values && !ferror(fpt)) { if (BUF_SIZE > block_size - values_saved % block_size) current_block_size = block_size - values_saved % block_size; else current_block_size = BUF_SIZE; Rd_from_music(pbuf, current_block_size * sizeof(MFLOAT)); save_block(pbuf, values_saved, sformat, current_block_size, fpt, ydim); values_saved += current_block_size; nnewdots = values_saved * 10 / ntotal_values - ndots; for (i = 0; i < nnewdots; i++) printf("."); fflush(stdout); ndots += nnewdots; } /* end while () */ printf("\n"); fflush(stdout); if (ferror(fpt) != 0) { printf(INDENT); printf("Error while saving file \"%s\".\n", filename); printf(INDENT); printf("The matrix may not be valid!\n"); } free(pbuf); fclose(fpt);} /* end of basic_save() */static void display_block(MFLOAT *pbuf, MINT offset, MINT block_size, MINT width, MINT height)/*******************************************************************/{ MINT n; for (n = 0; n < block_size; n++) { if (fabs(*pbuf) < 0.01) printf(" % -6.1g", *pbuf++); else if (*pbuf < 0.1) printf(" % -6.2g", *pbuf++); else printf(" % -6.3g", *pbuf++); if ((offset + n + 1) % width == 0) { printf("\n"); if (((offset + n) / width + 1) % height == 0) printf("\n"); } }} /* end of display_block() */void basic_show(message_t message)/********************************/{ MINT block_size, ndim, xdim, ydim, zdim; MINT values_transferred, ntotal_values, current_block_size; MINT display_width, display_height; MFLOAT *pbuf; message_t msg; Rd_from_music(msg, sizeof(msg)); ndim = msg[0].i; xdim = msg[1].i; ydim = msg[2].i; zdim = msg[3].i; block_size = msg[4].i; display_width = msg[2].i; /* size of y dimension */ display_height = msg[1].i; /* size of x dimension */ /*===== allocate temporary buffer =====*/ pbuf = (MFLOAT*)malloc(BUF_SIZE * sizeof(MFLOAT)); if (pbuf == NULL) { msg[0].i = ERR_NOMEM; Wr_to_music(msg, sizeof(msg)); /* tell Music */ return; } msg[0].i = ERR_NOERROR; Wr_to_music(msg, sizeof(msg)); /* tell Music */ /*===== upload and display matrix =====*/ printf(INDENT); printf("Object dimensions: %ldx%ldx%ld\n\n", xdim, ydim, zdim); ntotal_values = xdim * ydim * zdim; values_transferred = 0; while (values_transferred < ntotal_values) { if (BUF_SIZE > block_size - values_transferred % block_size) current_block_size = block_size - values_transferred%block_size; else current_block_size = BUF_SIZE; Rd_from_music(pbuf, current_block_size * sizeof(MFLOAT)); display_block(pbuf, values_transferred, current_block_size, display_width, display_height); values_transferred += current_block_size; } /* end while () */ printf("\n"); free(pbuf);} /* end of basic_show() */static void init_nbasic(void)/***************************/{#ifdef __MHOST__ if (MDISPLAY_get_numboards() > 0) MDISPLAY_init(0,VIO_LOWRES+VIO_OUT_TRUECOLOR,VIDEO_X,VIDEO_Y);#endif MCALL(init_musicside()); WAIT_FCT();} /* end of init_musicside() */int main (int argc, char *argv[])/*******************************/#define FILE_LIST_MAX 100#define TEMP_NAME1 "xq253341"#define TEMP_NAME2 "xq045298"{ int i, nfiles; char *file_list[FILE_LIST_MAX]; FILE *msystems = NULL; int sflag = FALSE; int success = FALSE;#if defined(sun) && defined(__MHOST__) int local_link_cnf; FILE *fptmp;#endif nfiles = 0; for (i = 1; i < argc; i++) { if (strncmp(argv[i], "-s", 2) != 0) { /* basic file name */ if (nfiles < FILE_LIST_MAX) file_list[nfiles++] = argv[i]; } else { /* -s option */ sflag = TRUE;#if defined(sun) && defined(__MHOST__) if (msystems == NULL) msystems = fopen(TEMP_NAME1, "w");#endif if (argv[i][2] != 0) { /* host name */ if (msystems != NULL) fprintf(msystems, "%s", argv[i]+2); } else if (++i < argc) { /* host name */ if (msystems != NULL) fprintf(msystems, "%s", argv[i]); } if (++i < argc) { /* link number */ if (msystems != NULL) fprintf(msystems, " %s\n", argv[i]); } } }#if defined(sun) && defined(__MHOST__) local_link_cnf = FALSE; if (sflag && msystems != NULL) { fclose(msystems); rename("link.cnf", TEMP_NAME2); rename(TEMP_NAME1, "link.cnf"); } else { fptmp = fopen("link.cnf", "r"); if (fptmp != NULL) fclose(fptmp); else { system("muquery 2>/dev/null|grep 'free *$'|sort +2 -o link.cnf"); local_link_cnf = TRUE; } }#else if (sflag) printf("Warning: -s option ignored\n");#endif if (INIT_MUSIC()) /* initialize MUSIC */ if (BOOT_DSPs(LOD_NAME)) /* boot and load dsps */ success = TRUE;#if defined(sun) && defined(__MHOST__) if (local_link_cnf) remove("link.cnf"); else if (sflag && msystems != NULL) { remove("link.cnf"); if (rename(TEMP_NAME2, "link.cnf") != 0) remove("link.cnf"); }#endif if (!success) return EXIT_FAILURE; init_nbasic(); /* initialize neuro-simulator */ basic(nfiles, file_list); /* call basic interpreter */ EXIT_MUSIC(); fflush(stdout); return EXIT_SUCCESS;} /* main */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -