C/C++实现无序入参的命令解析工具

news2024/12/24 20:22:52

C/C++实现无序入参的命令解析工具

  • 1 实现思路
  • 2 主要功能
  • 3 效果展示
    • 3.1 直接运行代码图
    • 3.2help命令执行效果图
    • 3.3命令行执行命令解析效果图
  • 4 代码实现
  • 5 代码下载

1 实现思路

基本介绍: 思路来源于atlas,atc(模型转换工具),该工具对命令支持众多,且命令支持盲录入,支持基本的–help命令查看所有命令参数的解释,因此自己仿照实现,已解决工作当中的通用性工具使用不方便、难以产品化的问题。
atc 工具的应用命令如下:

atc --framework=5 --model=./yolov5l_onnx --input_format=NCHW --input_shape="images:1,3,960,960" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3

下图为atc工具help命令效果:
在这里插入图片描述

2 主要功能

  • 支持跨平台,代码简单,轻松实现移植到linux
  • 支持命令的无序输入
  • 支持 –help 命令查看 ./cmdParser --help
  • 支持错误命令检查告警
  • 支持直接编辑完成命令扩展

3 效果展示

3.1 直接运行代码图

在这里插入图片描述

3.2help命令执行效果图

在这里插入图片描述

3.3命令行执行命令解析效果图

在这里插入图片描述

4 代码实现

#include <iostream>
#include <map>
#include <vector>
#include <string>
#include <sstream>
#include <stdio.h>

//命令解析方法
std::map<std::string, std::string> parseCommand(const std::string& command) {
    std::map<std::string, std::string> parameters;
    std::istringstream iss(command);
    std::string token;
    while (std::getline(iss, token, ' ')) {
        size_t pos = token.find('=');
        if (pos != std::string::npos) {
            std::string key = token.substr(0, pos);
            std::string value = token.substr(pos + 1);
            parameters[key] = value;
        }
    }
    return parameters;
}

//命令库,直接可以复制编辑
std::map<std::string, std::string> cmdlib = {
    {"--framework","<number> Specify the framework version"},
    {"--model","<path> Specify the model file path"},
    {"--input_format","<format> Specify the input format"},
    {"--input_shape","<shape> Specify the input shape"},
    {"--output_type","<type> Specify the output type"},
    {"--output","<path> Specify the output file path"},
    {"--log","<level> Specify the log level"},
    {"--precision_mode","<mode> Specify the precision mode"},
    {"--soc_version","<version> Specify the SoC version"},
    {"--help","Display this help and exit"}
};

//help展示所有命令
void displayHelp()
{
    std::cout << "Usage: command [options]\n"
        << "Options:\n";
    for (const auto& p : cmdlib)
    {
    	//命令对齐排版
        printf("%-30s%-50s\n", p.first.c_str(), p.second.c_str());
    }
}

int main(int argc, char* argv[]) {

	//解析help命令
    if (argc == 2 && std::string(argv[1]).find("--help") != std::string::npos) {
        displayHelp();
        return 0;
    }

	//将所有输入的命令都连成一个字符串
    std::string command;
    for (int i = 1; i < argc; ++i) { // Start from 1 to skip the program name
        command += argv[i];
        if (i < argc - 1) { // Add a space between arguments, but not after the last one
            command += " ";
        }
    }
    std::cout << "The combined command is: " << command << std::endl;

    //错误 命令测试 command = "--input_shape=\"images:1,3,960,960\" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3  --framework=5 --model=./yolov5l --input_format=NCHW";
    //正确 测试命令 
    command = "--input_shape=\"images:1,3,960,960\" --output_type=FP32 --output=./yolov5l_onnx --log=error --precision_mode=allow_fp32_to_fp16 --soc_version=Ascend310P3  --framework=5 --model=./yolov5l --input_format=NCHW";

	//解析输入的字符串命令
    auto parameters = parseCommand(command);
    if (!parameters.empty())
    {
        for (const auto& p : parameters)
        {
        	//检查输入的命令是否存在非法命令
            auto itor = cmdlib.find(p.first);
            if (itor == cmdlib.end())
            {
                std::cerr << "Error: Please Check Invalid command:  " << p.first << std::endl;
                return 0;
            }
        }

		//打印解析输入命令得到的数据结构
        for (const auto& p : parameters)
        {
            std::cout << p.first << " = " << p.second << std::endl;
        }
    }
    return 0;
}

5 代码下载

cmdParser

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1424931.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

多智能体强化学习--MAPPO(pytorch代码详解)

标题 代码详解Actor和Critic网络的设置 代码详解 代码链接&#xff08;点击跳转&#xff09; Actor和Critic网络的设置 基本设置&#xff1a;3个智能体、每个智能体观测空间18维。Actor网络&#xff1a;实例化一个actor对象&#xff0c;input-size是18Critic网络&#xff1…

Shell脚本——免交互

目录 一、Here Document免交互 1、免交互概述 2、语法格式 2.1示例&#xff1a;免交互方式实现对行数的统计&#xff0c;将要统计的内容置于标记EOF之间&#xff0c;直接将内容传给wc-l来统计 3、变量设定 ①变量图换成实际值 ②整行内容作为变量并输出结果 ③使输出内…

杠杆交易在伦敦金市场的优势与风险

伦敦金作为黄金市场的灯塔&#xff0c;每天吸引着全球投资者的目光。伦敦金的特殊地位使得以它为基准的杠杆交易成为众多投资者追逐的目标。在这篇文章中&#xff0c;我们将深入探讨伦敦金杠杆交易的奥秘&#xff0c;带你揭开这一盛宴的神秘面纱。 伦敦金杠杆交易的核心在于通过…

【pytorch】anaconda使用及安装pytorch

https://zhuanlan.zhihu.com/p/348120084 https://blog.csdn.net/weixin_44110563/article/details/123324304 介绍 Conda创建环境相当于创建一个虚拟的空间将这些包都装在这个位置&#xff0c;不需要了可以直接打包放入垃圾箱&#xff0c;同时也可以针对不同程序的运行环境选…

HashSet 的基本操作【集合容器知识回顾 ④】

HashSet 是 Java 中的一个集合类&#xff0c;它实现了 Set 接口。Set 是一种不允许包含重复元素的集合&#xff0c;而 HashSet 则是 Set 接口的一个具体实现。因此&#xff0c;HashSet 用于存储一组唯一的元素&#xff0c;不允许重复。 HashSet 的一些特点&#xff1a; 不允许…

揭开时间序列的神秘面纱:特征工程的力量

目录 写在开头1. 什么是特征工程?1.1 特征工程的定义和基本概念1.2 特征工程在传统机器学习中的应用1.3 时间序列领域中特征工程的独特挑战和需求3. 时间序列数据的特征工程技术2.1 数据清洗和预处理2.1.1 缺失值处理2.1.2 异常值检测与处理2.2 时间特征的提取2.2.1 时间戳解析…

Vue中使用定义的函数时,无法访问到data()里面的数据

const translateItems1 () > {this.translatedItems this.items1.map(item > {return {...item,label: this.$t(item.labelKey)};}); items1是我们data()里面的数据&#xff0c;无法访问到 解决办法 把箭头函数替换为普通函数 const translateItems1 function() {th…

echarts 鼠标移入有单位;echarts 纵坐标有单位;echarts 纵坐标刻度有单位

1.echarts 鼠标移入有单位 tooltip series: [{name: "平均值",type: "line",data: this.avgData,tooltip: {valueFormatter: function (value) {return value 万元}}}]2.echarts 纵坐标有单位&#xff1b;name yAxis: [{type: "value",name: t…

为什么贪婪的 GPU需要快速的对象存储?

一个链条的力量取决于其最薄弱的环节 - 同样&#xff0c;您的AI/ML基础设施的速度也只有您的最慢组件那么快。如果您使用GPU训练机器学习模型&#xff0c;那么您的薄弱环节可能是您的存储解决方案。结果就是我所说的“饥饿GPU问题”。 饥饿GPU问题发生在您的网络或存储解决方案…

三、软硬件工作流程分析

现在的计算机主要是由两部分组成&#xff1a;软件系统和硬件系统。这里先捋清楚硬件和软件的关系&#xff0c;以及电脑 各个组成部分是如何配合工作的。 软件系统主要被分类为两大类&#xff1a; 系统软件&#xff1a;这包括操作系统&#xff0c;如Windows、Linux等。操作系统是…

ManticoreSearch-(安装配置,集群搭建)-学习总结

ManticoreSearch-(安装配置)-学习总结 基础概念安装搭建集群搭建(基于K8S) 原文地址 https://blog.csdn.net/liuyij3430448/article/details/135955025 基础概念 Manticore Search是一个专门为搜索设计的多存储数据库&#xff0c;具有强大的全文搜索功能&#xff0c;适用于…

力扣hot100 三数之和 双指针 细节去重

Problem: 15. 三数之和 文章目录 思路Code 思路 &#x1f468;‍&#x1f3eb; 参考 Code ⏰ 时间复杂度: O ( n 2 ) O(n^2) O(n2) &#x1f30e; 空间复杂度: O ( 1 ) O(1) O(1) class Solution {public List<List<Integer>> threeSum(int[] nums){List&l…

composer常用命令

查看全局配置信息 composer config -gl 设置镜全局像地址 composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ 去掉-g&#xff0c;即表示只有当前项目使用该镜像 批量安装composer项目依赖 composer install 执行该命令后&#xff0c;会读取当…

算法练习-二叉树的层序遍历(思路+流程图+代码)

难度参考 难度&#xff1a;中等 分类&#xff1a;二叉树 难度与分类由我所参与的培训课程提供&#xff0c;但需要注意的是&#xff0c;难度与分类仅供参考。且所在课程未提供测试平台&#xff0c;故实现代码主要为自行测试的那种&#xff0c;以下内容均为个人笔记&#xff0c;旨…

EasyExcel根据对应的实体类模板完成多个sheet的写入与读取

1.展示模板一的实体类 import com.alibaba.excel.annotation.ExcelProperty; import com.alibaba.excel.annotation.write.style.ColumnWidth; import com.alibaba.excel.annotation.write.style.ContentRowHeight; import com.alibaba.excel.annotation.write.style.HeadRowH…

软件价值3-A*算法寻路

A*算法&#xff08;A-star算法&#xff09;是一种启发式搜索算法&#xff0c;主要用于在图或网络中找到从起始节点到目标节点的最佳路径。它结合了Dijkstra算法的广度优先搜索和贪婪最优优先搜索的特点&#xff0c;通过估算从起始节点到目标节点的代价来指导搜索方向。 A*算法…

CentOS 8最小安装

简介 CentOS 8的IOS如果下载DVD版本至少有10G 这里我们直接选择最小安装&#xff0c;因此选择最小系统boot版本 CentOS-8.5.2111-x86_64-boot.iso 下载地址 https://mirrors.aliyun.com/centos/8.5.2111/isos/x86_64/ 直接选择CentOS-8.5.2111-x86_64-boot.iso 大小只有789.0…

MIT6.5830 实验0

前置 本次实验使用 Golang 语言实现&#xff0c;在之前的年份中&#xff0c;都是像 cs186 那样使用 Java 实现。原因&#xff1a; Golang 语言作为现代化语言&#xff0c;简单易上手但功能强大。 使参加实验的同学有同一起跑线&#xff0c;而不是像Java那样&#xff0c;有些同…

鸿蒙HarmonyOS——AVSession开发指导

AVSession开发指导 说明&#xff1a; AVSession的所有接口均为系统接口&#xff0c;其功能仅提供给系统应用使用。 会话接入端开发指导 基本概念 会话元数据AVMetadata: 媒体数据相关属性&#xff0c;包含标识当前媒体的ID(assetId)&#xff0c;上一首媒体的ID(previousAsset…

链式二叉树(1)

目录 二叉树的概念&结构 二叉树的遍历概念 手写二叉树测试 二叉树遍历实现代码 递归图解 前序遍历递归图解 中序序遍历递归图解 后续遍历递归图解 二叉树的概念&结构 二叉树是&#xff1a; 空树非空&#xff1a;根节点&#xff0c;根节点的左子树、根节点的右子…