• [区域初赛赛题问题] Unzip Failed
    请问 Unzip Failed 在什么条件下会触发?目前已经尝试在不同环境下制作压缩包(包括 MacOS / Ubuntu / 官方 docker 环境),无一例外都是 Unzip Failed。压缩包里没有包含中文,文件名全是合法字符,压缩包内文件结构如下Solution.cpp*.hlib/*.h压缩包大小 40KB 我之前的提交大部分是成功的,但偶尔也出现 Unzip Failed,我不能理解这个报错到底为什么会触发。
  • [区域初赛赛题问题] 一直编译错误,是什么原因
    一直编译错误,是什么原因,在本地容器好好的,上传就编译错误 
  • [区域初赛赛题问题] 一直显示编译错误是为什么
    为什么源文件在自己电脑的Linux中可以编译运行并输出结果,但是上传压缩包后,显示compile error
  • [区域初赛赛题问题] 练习赛和正式赛的数据分布会差别特别大吗?
    本次初赛的练习赛和正式赛的数据分布差异会特别大吗?还是说练习赛的数据是正式赛数据的部分抽样?
  • [区域初赛赛题问题] 怎么一直是为wrong answer
    到底是怎么回事啊,改完赛题之后一直WA
  • [区域初赛赛题问题] 预处理wa疑问
    只要预处理时进行了操作,样本多边形顶点数足够多预处理一定会超时,假设存在一个足够复杂的样本导致预处理超时,是直接返回wa,还是这个样本0分,其他样本规定时间通过预处理依旧可以得分。
  • sleep10秒得到一样的成绩是咋回事?
    线上判题器对时延的敏感性到底如何?10s的时间不改变成绩嘛?
  • 答案不唯一时,长度误差限为多少 也是1e-4吗?
    答案不唯一时,长度误差限为多少 也是1e-4吗? 另: 任务书什么时候更新关于此情况的描述,看到很多回答都承诺了,但截至现在还未更新。
  • [区域初赛赛题问题] 队伍解散后重建队伍,会和之前的队伍判重吗
    队伍解散后重写创队伍,会和之前的提交内容判重吗
  • [区域初赛赛题问题] 请问 c++ 编译器版本可以使用 c++17/20 吗,文档中是 c++11
    如题,如果能使用 c++17/20 的特性会习惯很多
  • [技术干货] 一月技术干货合集来啦
    1、 使用Git实现revert的完整操作步骤【转载】cid:link_02、C++中new关键字用法示例详解【转载】cid:link_13、在C# WinForm项目中跨.cs文件传值的六种常用方案【转载】cid:link_24、 一文带你搞懂Java中Error和Exception的区别【转载】cid:link_35、 Java中实现Word和TXT之间互相转换的实用教程【转载】cid:link_46、MyBatis-Plus 默认不更新null的4种方法【转载】cid:link_57、SpringBoot接口防抖的5种高效方案【转载】cid:link_68、 Java中锁分类及在什么场景下使用【转载】cid:link_79、 Java中锁的全面解析之类型、使用场景、优缺点及实现方式(示例代码【转载】cid:link_810、 Caffeine结合Redis空值缓存实现多级缓存【转载】cid:link_911、在PostgreSQL中优雅高效地进行全文检索的完整过程【转载】cid:link_1012、MySQL CDC原理解析及实现方案【转载】cid:link_1113、 PostgreSQL优雅的进行递归查询的实战指南【转载】cid:link_1214、Redis 常用命令之基础、进阶与场景化实战案例【转载】https://bbs.huaweicloud.com/forum/thread-0212720487861500817-1-1.html15、Git中忽略文件机制的.gitignore与.git/info/exclude两种方式详解【转载】https://bbs.huaweicloud.com/forum/thread-0212720487688092711-1-1.html
  • [技术干货] 在C# WinForm项目中跨.cs文件传值的六种常用方案【转载】
    一、引言你想知道在 C# WinForm 项目中,不同.cs 文件(如 Form1.cs、About.cs、SerialConfig.cs)之间传递数据 的通用处理方法,我会结合串口调试工具的场景,讲解 6 种常用方案(从简单到规范),并说明每种方案的适用场景、优缺点和具体实现,帮你解决跨文件传值的核心问题。二、跨.cs 文件传值的 6 种核心方案(按场景分类)方案 1:构造函数传值(最基础,单向传值)适用场景:创建子窗体(如 About.cs)时,从主窗体(Form1.cs)向子窗体传递初始化数据(如串口参数)。核心原理:子窗体定义带参数的构造函数,主窗体创建子窗体实例时传入数据。实现示例(串口参数传值):12345678910111213141516171819202122232425// 1. 子窗体(About.cs):定义带参数构造函数namespace SerialDebug{    public partial class About : Form    {        public string PortName { get; set; }        public int BaudRate { get; set; }          // 带参数构造函数接收数据        public About(string portName, int baudRate)        {            InitializeComponent();            PortName = portName;            BaudRate = baudRate;            label1.Text = $"串口:{PortName},波特率:{BaudRate}";        }    }}  // 2. 主窗体(Form1.cs):创建子窗体时传值private void MenuItem_About_Click(object sender, EventArgs e){    About about = new About(comboBox_Serial.Text, 9600);    about.Show();}优点:简单直接,新手易理解;缺点:参数过多时构造函数冗长,仅支持 “创建时一次性传值”。方案 2:实体类封装传值(推荐,多变量传值)适用场景:需要传递多个关联变量(如串口的波特率、数据位、校验位等),避免构造函数参数混乱。核心原理:创建专门的实体类(如 SerialConfig.cs)封装所有需要传递的字段,仅传递一个实体对象。实现示例:12345678910111213141516171819202122232425262728293031323334353637// 1. 实体类(SerialConfig.cs):封装所有参数namespace SerialDebug{    public class SerialConfig    {        public string PortName { get; set; }        public int BaudRate { get; set; }        public string Parity { get; set; }        public int SendCount { get; set; }    }}  // 2. 子窗体(About.cs):接收实体对象public partial class About : Form{    public SerialConfig Config { get; set; }      public About(SerialConfig config)    {        InitializeComponent();        Config = config;        label1.Text = $"串口:{Config.PortName},波特率:{Config.BaudRate}";    }}  // 3. 主窗体(Form1.cs):传实体对象private void MenuItem_About_Click(object sender, EventArgs e){    SerialConfig config = new SerialConfig()    {        PortName = comboBox_Serial.Text,        BaudRate = 9600,        Parity = "None"    };    About about = new About(config);    about.Show();}优点:代码整洁,扩展方便(新增参数仅改实体类);缺点:需额外创建实体类文件(但符合工业级开发规范)。方案 3:公共属性 / 字段传值(灵活,动态传值)适用场景:需要在窗体创建后动态赋值 / 修改数据(如子窗体显示后,主窗体更新子窗体的参数)。核心原理:子窗体定义公共属性 / 字段,主窗体通过窗体实例直接赋值。实现示例:12345678910111213141516171819202122232425262728293031323334353637383940414243444546// 1. 子窗体(About.cs):定义公共属性namespace SerialDebug{    public partial class About : Form    {        // 公共属性(可读写)        public string PortName { get; set; }        public int BaudRate { get; set; }          // 无参构造函数(必须)        public About()        {            InitializeComponent();        }          // 刷新显示方法        public void RefreshInfo()        {            label1.Text = $"串口:{PortName},波特率:{BaudRate}";        }    }}  // 2. 主窗体(Form1.cs):动态赋值private About _aboutForm; // 保存子窗体实例private void MenuItem_About_Click(object sender, EventArgs e){    // 创建子窗体(无参)    _aboutForm = new About();    // 动态赋值(创建后可随时改)    _aboutForm.PortName = comboBox_Serial.Text;    _aboutForm.BaudRate = 115200;    // 刷新显示    _aboutForm.RefreshInfo();    _aboutForm.Show();}  // 按钮点击:动态更新子窗体数据private void button_UpdateAbout_Click(object sender, EventArgs e){    if (_aboutForm != null && !_aboutForm.IsDisposed)    {        _aboutForm.PortName = "COM3";        _aboutForm.RefreshInfo();    }}优点:灵活,支持创建后动态传值 / 修改;缺点:易遗漏赋值,需手动保证数据完整性。方案 4:静态类 / 静态变量(全局共享数据)适用场景:多个.cs 文件需要共享全局数据(如串口工具的收发计数、全局配置),无需创建窗体实例即可访问。核心原理:创建静态类,定义静态变量,所有.cs 文件可直接读写。实现示例:123456789101112131415161718192021222324252627282930313233// 1. 静态类(GlobalData.cs):存储全局数据namespace SerialDebug{    public static class GlobalData    {        // 静态变量:全局共享        public static string CurrentPortName { get; set; } = "COM1";        public static int SendCount { get; set; } = 0;        public static int ReceCount { get; set; } = 0;          // 静态方法:全局通用逻辑        public static void ResetCount()        {            SendCount = 0;            ReceCount = 0;        }    }}  // 2. 主窗体(Form1.cs):读写全局变量private void button_Send_Click(object sender, EventArgs e){    // 写全局变量    GlobalData.SendCount += 1;    // 读全局变量    toolStripStatusLabel1.Text = $"发送计数:{GlobalData.SendCount}";}  // 3. 子窗体(About.cs):直接访问全局变量private void About_Load(object sender, EventArgs e){    label1.Text = $"当前串口:{GlobalData.CurrentPortName},接收计数:{GlobalData.ReceCount}";}优点:全局可访问,无需传参,适合共享数据;缺点:静态变量生命周期和程序一致,易导致内存泄漏(需手动重置),过度使用会降低代码可维护性。方案 5:事件委托(反向传值:子窗体→主窗体)适用场景:子窗体需要向主窗体传递数据(如 About 窗体修改了串口参数,通知主窗体更新)。核心原理:子窗体定义事件,主窗体订阅事件,子窗体触发事件时传递数据。实现示例:12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152// 1. 子窗体(About.cs):定义事件和参数namespace SerialDebug{    // 自定义事件参数(传递修改后的串口参数)    public class PortChangedEventArgs : EventArgs    {        public string NewPortName { get; set; }        public int NewBaudRate { get; set; }    }      public partial class About : Form    {        // 定义事件        public event EventHandler<PortChangedEventArgs> PortChanged;          public About()        {            InitializeComponent();        }          // 子窗体按钮:触发事件,传递数据给主窗体        private void button_SavePort_Click(object sender, EventArgs e)        {            // 构造事件参数            PortChangedEventArgs args = new PortChangedEventArgs()            {                NewPortName = textBox_Port.Text,                NewBaudRate = 115200            };            // 触发事件(通知主窗体)            PortChanged?.Invoke(this, args);            this.Close();        }    }}  // 2. 主窗体(Form1.cs):订阅事件,接收子窗体数据private void MenuItem_About_Click(object sender, EventArgs e){    About about = new About();    // 订阅子窗体的事件    about.PortChanged += About_PortChanged;    about.Show();}  // 事件处理方法:接收子窗体传递的数据private void About_PortChanged(object sender, PortChangedEventArgs e){    // 更新主窗体的串口参数    comboBox_Serial.Text = e.NewPortName;    MessageBox.Show($"主窗体收到新串口:{e.NewPortName},波特率:{e.NewBaudRate}");}优点:解耦子窗体和主窗体(子窗体无需知道主窗体存在),符合 “发布 - 订阅” 设计模式;缺点:代码稍复杂,适合反向传值场景。方案 6:接口传值(规范,多窗体统一传值)适用场景:多个窗体需要按统一规则传递数据(如所有窗体都需要传递串口配置),提升代码规范性。核心原理:定义接口,规定传值的属性 / 方法,所有需要传值的窗体实现该接口。实现示例:123456789101112131415161718192021222324252627282930313233343536373839// 1. 接口(ISerialConfig.cs):定义传值规则namespace SerialDebug{    public interface ISerialConfig    {        string PortName { get; set; }        int BaudRate { get; set; }        void SetConfig(SerialConfig config);    }}  // 2. 子窗体(About.cs):实现接口public partial class About : Form, ISerialConfig{    public string PortName { get; set; }    public int BaudRate { get; set; }      public About()    {        InitializeComponent();    }      // 实现接口方法    public void SetConfig(SerialConfig config)    {        PortName = config.PortName;        BaudRate = config.BaudRate;        label1.Text = $"串口:{PortName},波特率:{BaudRate}";    }}  // 3. 主窗体(Form1.cs):按接口传值private void MenuItem_About_Click(object sender, EventArgs e){    ISerialConfig aboutForm = new About(); // 按接口声明    SerialConfig config = new SerialConfig() { PortName = "COM2", BaudRate = 9600 };    aboutForm.SetConfig(config); // 统一调用接口方法    ((Form)aboutForm).Show(); // 转为Form显示}优点:规范统一,适合多窗体、复杂项目;缺点:入门门槛高,小型项目无需使用。三、方案选择指南(按场景匹配)传值场景推荐方案主窗体→子窗体,少量参数(1-3 个)方案 1(构造函数)主窗体→子窗体,多参数(3 个以上)方案 2(实体类封装)主窗体→子窗体,动态传值 / 修改方案 3(公共属性)多个.cs 文件共享全局数据方案 4(静态类)子窗体→主窗体,反向传值方案 5(事件委托)多窗体统一规则传值,大型项目方案 6(接口)四、关键注意事项(避坑)命名空间一致:所有.cs 文件的命名空间必须相同(如SerialDebug),否则无法识别类 / 属性;空值校验:传值时校验空值(如if (!string.IsNullOrEmpty(PortName))),避免空引用异常;类型转换容错:字符串转数字时用int.TryParse,避免非数字输入崩溃;窗体释放校验:动态传值时校验子窗体是否已关闭(if (aboutForm != null && !aboutForm.IsDisposed))。五、总结关键点回顾单向传值(主→子):优先用构造函数(少量参数) 或实体类(多参数),简单 / 规范;动态传值:用公共属性,支持创建后修改;反向传值(子→主):用事件委托,解耦窗体依赖;全局共享:用静态类,适合全局数据;大型项目:用接口,提升代码规范性。跨.cs 文件传值的核心是 “根据场景选择合适的封装方式”,小型串口工具优先用实体类 + 构造函数,既能满足需求,又保证代码整洁;复杂场景再考虑事件 / 接口方案。
  • [技术干货] C++中new关键字用法示例详解【转载】
    一.什么是new(What)1.new是一个关键字,用于开辟空间,开辟的空间在堆上,而一般声明的变量存放在栈上;2.new得到的是一段空间的首地址。所以一般需要用指针来存放这段地址123456789new int(10);//返回new出来这块内存的地址 int *p=new int(10);//用一个指针去接受这个地址 cout << p << endl;//返回内存空间地址00995B08 cout << *p << endl;//返回初始值10 delete p;3.开辟的内存空间需要记得delete掉,否则会造成内存泄漏!delete p的时候:首先调用这个对象的析构函数,然后释放这个对象的空间。二.使用new的场景(When and Where)C++ 中的存储方法大致有:静态存储:声明变量的时候前面添加static关键字;自动存储: 这个举个例子,在一个函数A里面定义了一个变量并初始化, int a =10 ; 这个就是自动存储,a仅当A()函数活动时存在。当成许控制权回到main()时,a使用的内存将自动被释放,动态存储:数据的声明周期不完全受程序或函数的生命时间控制 ,所以C++ 中有new 来分配空间,不过由于内存不会自动释放,所以使用完之后还需要使用delete 来释放内存。所以new是为了动态内存分配而服务的。不适用的场合:频繁调用场合不适合用new,new会频繁申请和释放内存。常见的使用场景如下:1.为变量动态分配内存,包括基本数据类型变量int、double;一维数组;二维数组;2.为类对象动态分配内存,也可以为结构体分配内存(类和结构体类似);三.如何使用new(How)1.动态创建一个类对象获得一块堆内存空间;调用构造函数;返回正确的指针。有一个类class Car,构造函数是Car(),创建一个该类的对象,并开辟一块空间存储,并返回空间的首地址;123Car *Audi = new Car(); delete Audi;2. 动态创建一个基本数据类型变量获得一块堆内存空间;返回正确的指针。没有了构造函数,但是可以同样在括号内赋初值。123new int(10);//返回这个空间的首地址int *arr=new int(10);//开辟一个存放整数的存储空间,附上初值,返回一个指向该存储空间的地址(即指针)delete arr;3.动态创建一个一维数组12char* p = new char[10];//开辟一个存放字符数组(包括10个元素)的空间,返回首元素的地址delete[] p;4.动态创建一个二维数组12345678910111213141516171819202122232425//开辟一个存放二维整型数组(大小为3*2)的空间,返回首元素的地址  int** pc = new int*[3];//这边表示开辟行数为3//int*[3]表示的为开辟三个存放int*元素的数组,所以才有了下一步pc[i]中对列数的开辟    for (int i = 0; i < 3; i++)    {        pc[i] = new int[2];//这边表示开辟列数为2        for (int j = 0; j < 2; j++)        {            pc[i][j] = i + j;            cout <<pc[i][j] << " ";        }        cout << endl;    }//或者使用另一种方法int(*pc)[2] = new int[3][2];//创建数组指针pc,注:数组指针与二级指针不一样for (int i = 0; i < 3; i++)    {        for (int j = 0; j < 2; j++)        {            pc[i][j] = i + j;            cout <<pc[i][j] << " ";        }        cout << endl;    } delete[] pc;5.动态创建一个结构体对象1234567891011121314#include<iostream>using namespace std;struct MyStruct{    int a;    MyStruct* b;    MyStruct(int x): a(x), b(NULL) {};  //初始化列表构造函数  函数名与类名相同是构造函数};int main() {    MyStruct* my = new MyStruct();    delete my;    system("pause");    return 0;}总结 
  • [传感器适配] 红外相机接入问题
    背景:首次使用MDC610开发,进行一款定制的红外相机接入AP,有几个方向性问题需要得到指导,感谢。1,对于华为定制的摄像头来说,数据是否是通过传感器->ETH->MCAL层->COM->CM层的?2,对于非标红外相机来说,需要客服自行开发轻量级解包模块,为适配MCAL层数据,以便COM能够正常解析给CM?3,有点不理解的是,在CM配置完毕后,会有server模块和client模块?server还需要手动填参。MMC 工具生成的服务端 / 客户端测试代码,并非 COM 到 CM 数据填充的业务逻辑本身,而是华为提供的「配置验证工具代码」—— 其核心作用是验证你在 MMC 中配置的 “COM 信号→CM 结构体” 映射规则是否正确,确保真实场景下 COM 能按预期将数据精准填充到 CM;测试代码仅用于调试 / 验证,不参与实际业务中摄像头数据到 CM 的真实填充流程。对于上面的理解对么?部署CM后,需要启动COM:# 重启COM通信服务systemctl restart mdc-com-service# 重启CM功能服务(以红外相机为例)systemctl restart mdc-cm-infrared-service这样才能真正从:传感器->ETH->MCAL层->COM->CM层
  • [分享交流] C++20协程框架分享
    引入协程背景有大量的异步业务逻辑, 传统的回调代码割裂, 可读性差, 不可避免的回调地狱简化编码复杂度,希望底层能够支持协程, 简化跨线程或者实现rpc的能力项目Github: CrystalNetCrystalNet支持C++20, 包括requires, 协程等特性协程框架是CrystalNet的一个底层支持协程源码路径:kernel/include/kernel/comp/Coroutines测试case: TestCoroutine.h/TestCoroutine.cpp TestPoller.h/TestPoller.cpp细节介绍封装一个通用的协程类template<typename T> class CoTask<T>封装一个阻塞等待类CoWaiter,并提供阻塞等待接口:CoTask<> Waiting(), 用于等待条件满足时唤醒协程设计封装了一个Poller,主要用于处理事件循环, 协程的suspend时候会向Poller抛异步任务调度协程, 直到在CoWaiting时永久阻塞CoTask提供GetParam让用户在协程阻塞时获取到协程句柄,方便用户在条件满足时通过协程句柄唤醒协程Poller提供SendAsync接口实现跨线程的通信(协程方式提供)// 跨线程协程消息(otherPoller也可以是自己) // req暂时只能传指针,而且会在otherChannel(可能不同线程)释放 // req/res 必须实现Release, ToString接口 template<typename ResType, typename ReqType> requires requires(ReqType req, ResType res) { // req/res必须有Release接口 req.Release(); res.Release(); // req/res必须有ToString接口 req.ToString(); res.ToString(); } CoTask<KERNEL_NS::SmartPtr<ResType, AutoDelMethods::Release>> SendToAsync(Poller &otherPoller, ReqType *req) { // 1.ptr用来回传ResType KERNEL_NS::SmartPtr<ResType *, KERNEL_NS::AutoDelMethods::CustomDelete> ptr(KERNEL_NS::KernelCastTo<ResType *>( kernel::KernelAllocMemory<KERNEL_NS::_Build::TL>(sizeof(ResType **)))); ptr.SetClosureDelegate([](void *p) { // 释放packet auto castP = KERNEL_NS::KernelCastTo<ResType*>(p); if(*castP) (*castP)->Release(); KERNEL_NS::KernelFreeMemory<KERNEL_NS::_Build::TL>(castP); }); *ptr = NULL; // 设置stub => ResType的事件回调 UInt64 stub = ++_maxStub; KERNEL_NS::SmartPtr<KERNEL_NS::TaskParamRefWrapper, KERNEL_NS::AutoDelMethods::Release> params = KERNEL_NS::TaskParamRefWrapper::NewThreadLocal_TaskParamRefWrapper(); SubscribeStubEvent(stub, [ptr, params](KERNEL_NS::StubPollerEvent *ev) mutable { KERNEL_NS::ObjectPollerEvent<ResType> *finalEv = KernelCastTo<KERNEL_NS::ObjectPollerEvent<ResType>>(ev); // 将结果带出去 *ptr = finalEv->_obj; finalEv->_obj = NULL; // 唤醒Waiter auto &coParam = params->_params; if(coParam && coParam->_handle) coParam->_handle->ForceAwake(); }); // 发送对象事件 ObjectPollerEvent到 other auto iterChannel = _targetPollerRefChannel.find(&otherPoller); if(LIKELY(iterChannel != _targetPollerRefChannel.end())) { auto objEvent = ObjectPollerEvent<ReqType>::New_ObjectPollerEvent(stub, false, this, iterChannel->second); objEvent->_obj = req; iterChannel->second->Send(objEvent); } else { auto objEvent = ObjectPollerEvent<ReqType>::New_ObjectPollerEvent(stub, false, this, nullptr); objEvent->_obj = req; otherPoller.Push(objEvent); } // 等待 ObjectPollerEvent 的返回消息唤醒 auto poller = this; // 外部如果协程销毁兜底销毁资源 auto releaseFun = [stub, poller]() { poller->UnSubscribeStubEvent(stub); }; auto delg = KERNEL_CREATE_CLOSURE_DELEGATE(releaseFun, void); co_await KERNEL_NS::Waiting().SetDisableSuspend().GetParam(params).SetRelease(delg); if(LIKELY(params->_params)) { auto &pa = params->_params; if(pa->_errCode != Status::Success) { g_Log->Warn(LOGFMT_OBJ_TAG("waiting err:%d, stub:%llu, req:%p") , pa->_errCode, stub, req); UnSubscribeStubEvent(stub); } // 销毁waiting协程 if(pa->_handle) pa->_handle->DestroyHandle(pa->_errCode); } // 3.将消息回调中的ResType引用设置成空 auto res = *ptr; *ptr = NULL; co_return KERNEL_NS::SmartPtr<ResType, KERNEL_NS::AutoDelMethods::Release>(res); } 提供异步化工具函数: PostCaller异步编码举例代码在测试用例:TestPoller, 示例中实现了co_await 请求一个req,并返回一个resclass TestTimeoutStartup : public KERNEL_NS::IThreadStartUp { POOL_CREATE_OBJ_DEFAULT_P1(IThreadStartUp, TestTimeoutStartup); public: TestTimeoutStartup(KERNEL_NS::LibEventLoopThread * target) : _target(target) { } virtual void Run() override { KERNEL_NS::PostCaller([this]() mutable -> KERNEL_NS::CoTask<> { auto targetPoller = co_await _target->GetPoller(); auto req = HelloWorldReq::New_HelloWorldReq(); auto res = co_await targetPoller->template SendAsync<HelloWorldRes, HelloWorldReq>(req).SetTimeout(KERNEL_NS::TimeSlice::FromSeconds(5)); g_Log->Info(LOGFMT_NON_OBJ_TAG(TestTimeoutStartup, "res return")); }); } virtual void Release() override { TestTimeoutStartup::Delete_TestTimeoutStartup(this); } KERNEL_NS::LibEventLoopThread * _target; };