void ShaderParamParser::parse_float3_array(std::vector<float>& values) { parse_float_array(values); if (values.size() % 3 != 0) throw ExceptionOSLParamParseError(); }
int main(int argc, char **argv){ double result = 0, retcode; double *tmp = NULL; int i; retcode = parse_float_array(argc, argv, &tmp); if(retcode || NULL == tmp){ if(retcode>=128){ int idx = retcode-128; printf("Error in argument `%s' at position %d\n", argv[idx], idx); } printf("Error parsing command line.\nExiting.\n"); return 1; } result = average(argc-1, tmp); printf("Your array is: "); for(i=0; i<argc-1; i++){ printf("%g ", tmp[i]); } printf("\n"); printf("This is the average of the numbers in your array: %g\n", result); return 0; }
int main(int argc, char *argv[]) { struct MachineControlConfig config; bzero(&config, sizeof(config)); memcpy(config.steps_per_mm, kStepsPerMM, sizeof(config.steps_per_mm)); memcpy(config.home_switch, kHomePos, sizeof(config.home_switch)); memcpy(config.move_range_mm, kMoveRange, sizeof(config.move_range_mm)); memcpy(config.max_feedrate, kMaxFeedrate, sizeof(config.max_feedrate)); memcpy(config.acceleration, kDefaultAccel, sizeof(config.acceleration)); config.speed_factor = 1; config.dry_run = 0; config.debug_print = 0; config.synchronous = 0; config.channel_layout = kChannelLayout; config.axis_mapping = kAxisMapping; // Less common options don't have a short option. enum LongOptionsOnly { SET_STEPS_MM = 1000, SET_HOME_POS, SET_MOTOR_MAPPING, }; static struct option long_options[] = { { "max-feedrate", required_argument, NULL, 'm'}, { "accel", required_argument, NULL, 'a'}, { "range", required_argument, NULL, 'r' }, { "steps-mm", required_argument, NULL, SET_STEPS_MM }, { "home-pos", required_argument, NULL, SET_HOME_POS }, { "axis-mapping", required_argument, NULL, SET_MOTOR_MAPPING }, { "port", required_argument, NULL, 'p'}, { "bind-addr", required_argument, NULL, 'b'}, { 0, 0, 0, 0 }, }; int listen_port = -1; char do_file_repeat = 0; char *bind_addr = NULL; int opt; int parse_count; while ((opt = getopt_long(argc, argv, "m:a:p:b:r:SPRnf:", long_options, NULL)) != -1) { switch (opt) { case 'f': config.speed_factor = atof(optarg); if (config.speed_factor <= 0) return usage(argv[0], "Speedfactor cannot be <= 0"); break; case 'm': parse_count = parse_float_array(optarg, config.max_feedrate, GCODE_NUM_AXES); if (!parse_count) return usage(argv[0], "max-feedrate missing."); break; case 'a': parse_count = parse_float_array(optarg, config.acceleration, GCODE_NUM_AXES); if (!parse_count) return usage(argv[0], "Acceleration missing."); // Negative or 0 means: 'infinite'. break; case SET_STEPS_MM: if (!parse_float_array(optarg, config.steps_per_mm, GCODE_NUM_AXES)) return usage(argv[0], "steps/mm failed to parse."); break; case SET_MOTOR_MAPPING: config.axis_mapping = strdup(optarg); break; case SET_HOME_POS: { float tmp[GCODE_NUM_AXES]; bzero(tmp, sizeof(tmp)); if (!parse_float_array(optarg, tmp, GCODE_NUM_AXES)) return usage(argv[0], "Failed to parse home switch."); for (int i = 0; i < GCODE_NUM_AXES; ++i) config.home_switch[i] = (enum HomeType) tmp[i]; } break; case 'r': if (!parse_float_array(optarg, config.move_range_mm, GCODE_NUM_AXES)) return usage(argv[0], "Failed to parse ranges."); break; case 'n': config.dry_run = 1; break; case 'P': config.debug_print = 1; break; case 'S': config.synchronous = 1; break; case 'R': do_file_repeat = 1; break; case 'p': listen_port = atoi(optarg); break; case 'b': bind_addr = strdup(optarg); break; default: return usage(argv[0], "Unknown flag"); } } const char has_filename = (optind < argc); if (! (has_filename ^ (listen_port > 0))) { return usage(argv[0], "Choose one: <gcode-filename> or --port <port>."); } if (!has_filename && do_file_repeat) { return usage(argv[0], "-R (repeat) only makes sense with a filename."); } if (gcode_machine_control_init(&config) != 0) { return 1; } int ret = 0; if (has_filename) { const char *filename = argv[optind]; ret = send_file_to_machine(filename, do_file_repeat); } else { ret = run_server(bind_addr, listen_port); } gcode_machine_control_exit(); free(bind_addr); return ret; }