炫彩界面库论坛

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 341|回复: 2

[BUG提交] 有关核心模块的bug和建议

[复制链接]
  • TA的每日心情
    闭嘴
    2024-4-8 11:56
  • 发表于 2024-1-15 08:42:54 | 显示全部楼层 |阅读模式
    BUG提交
    炫彩版本号: 3.3.8.1 (2024-01-13)
    操作系统: 其他
    开发环境: WIN11 - VS2015 VS2019 VS2022
    编程语言: C/C++
    问题分类: 在代码中使用错误 其他 
    简短描述: 有关核心模块的bug和建议
    本帖最后由 bestkakkoii 于 2024-1-15 16:44 编辑



    • 编译使用 /std:c++20 无法辨识 [群文件的VS2015 VS2019]
    • 基础模块更新后被错误的置放到 XC-Module/常规 目录
    • CXMap 的运算符重载[] 因为隐藏的关係,炫语言那边无法辨识后面对象成员,导致编译前报错的问题  var[k].xxx
    • CXMap缺少取全部键值或全部值的成员函数
    • 简体(ACP:936)以外的系统编译错误、警告讯息、更新后IDE主程序名称和更新日誌文件名都会有乱码的问题、而更新模块会直接失败
    • 核心模块内基础容器缺少 const 声明,导致常量实例多数成员函数不可用
    • 核心模块多个类部分建构函数缺少 noexcept 宣告
    • 部分基础容器类的成员函数名过于冗长 如 getPtr可以改成兼容std的 get或 data, getSize 可以改成 size() length() count()...等等等
    • 函数命名因炫彩不支持多载导致出现 23456数字名...建议採取隐藏的措施,命名风格不一致 一下小驼峰 一下大驼峰 一下混合 一下蛇形..
    • CXTextA这东西在炫语言存在的意义不大,本来类型就很多了,文本就保持唯一一种就好,转换的事情内部其他成员函数处理
    • 另外 CXText 和 CXBytes 最好要能作为友元(friend)互相转换或操作
    • CXFile缺少一次读完 或 映射到内存的方式 对于新手快速处理小文件 或 读取大型文件比较不太友好,写入也是差不多意思
    • BOOL openEx(const wchar_t* pFileName, const wchar_t* pMode);  这个参数2弄个推荐改成枚举值会比较好,比如Append Truncate....方便新手使用
    • 另外CXFile也缺少文件相关信息获取或状态判断,老实说目前的功能取名CXIO可能比较合适..
    • CSysDateTime 缺少一个值接输出格式化文本 或 建构函数接受格式文本  然后还需要一个判断时间是否合法的东西比如 isValid()
    • 其他时间相关的全局函数全部併到这个类之下(CXDateTime)
    • 核心模块下的xc_mkStr.A.h 非936编码系统警告编码问题: 前缀加上 u8 或  #pragma execution_character_set("utf-8") 可改善

      1. template<class T>
      2. void mkValue(CXTextA &strText, T t){
      3.         strText += "?不支持类型?";
      4. }
      复制代码

    • 以下在64位编译时缺少强转型导致编译器警告

      1. module_base.cpp(1415): 警告 C4244
      2. module_base.cpp(1440): 警告 C4244
      3. module_base.cpp(1964): 警告 C4244
      4. module_base.cpp(1999): 警告 C4244
      复制代码

    • void XCL_Delay(UINT delay) 内使用弃用函数 GetTickCount 改成 GetTickCount64 或以下方法可改善:

      1. #include <Windows.h>
      2. #include <chrono>
      3. #include <thread>

      4. void XCL_Delay(UINT delayMilliseconds)
      5. {
      6.     auto startTime = std::chrono::high_resolution_clock::now();
      7.     MSG message;

      8.     constexpr int timeCheckInterval = 5;
      9.     int checkCounter = 0;

      10.     std::unique_lock<std::mutex> lock(g_delayMutex);
      11.     for (;;)
      12.     {
      13.         if (PeekMessage(&message, NULL, 0, 0, PM_REMOVE))
      14.         {
      15.             if (message.message == WM_QUIT)
      16.                 break;

      17.             TranslateMessage(&message);
      18.             DispatchMessage(&message);
      19.         }
      20.         else
      21.         {
      22.             std::this_thread::sleep_for(std::chrono::milliseconds(5));
      23.         }

      24.         if (++checkCounter >= timeCheckInterval)
      25.         {
      26.             auto currentTime = std::chrono::high_resolution_clock::now();
      27.             auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(currentTime - startTime).count();
      28.             if (elapsed >= delayMilliseconds)
      29.                 break;

      30.             checkCounter = 0;
      31.         }

      32.         std::this_thread::yield();
      33.     }
      34. }
      复制代码

    • XCL_GetRand使用弃用函数rand srand 以下方法可改善:

      1. #include <random>
      2. #include <limits>

      3. template <typename T>
      4. inline T rnd(T min, T max) {
      5.     static std::random_device rd;
      6.     static std::mt19937_64 gen(rd());
      7.     std::uniform_int_distribution<T> distribution(min, max);
      8.     return distribution(gen);
      9. }

      10. template <typename T>
      11. inline T rnd() {
      12.     return rnd(std::numeric_limits<T>::min(), std::numeric_limits<T>::max());
      13. }

      14. template <typename T>
      15. inline void rnd(T* p) {
      16.     if (p) *p = rnd<T>();
      17. }

      18. template <typename T>
      19. inline void rnd(T* p, T min, T max) {
      20.     if (p) *p = rnd(min, max);
      21. }
      复制代码


      还有很多全局函数都其实都可以直接併到核心模块的类里面去...这样可以少填很多参数 少很多显式转换加快开发效率
      比如:各种的文本操作编码转换等等直接併入CXText

      毕竟写一个函数就得爬一次文档还是挺累的...








  • TA的每日心情
    开心
    2022-1-9 18:18
  • 发表于 2024-1-15 16:43:45 | 显示全部楼层
    1. /std:c++20 XP不支持, 很多库不支持
    2. 出现这个问题 , 可能模块删除了, 重新安装模块, 模块默认没有指定安装模块, 稍后检查
    8. 以前是叫 get(), 多个用户反馈, get()不好理解, 改成了 getPtr()
    10. A W 文本型,  针对A文本用 文本型A效率更高,  如果 A文本转换成W文本 处理完 再转换成A文本, 效率损失很大
    15. 全局函数全部移到类里面, 临时调用得时候 还得先定义一个类变量,  并不方面,  所以具体要结合实际情况
    16. 非中文系统问题, 暂时还没精力处理

  • TA的每日心情
    闭嘴
    2024-4-8 11:56
  •  楼主| 发表于 2024-1-15 16:53:52 | 显示全部楼层
    本帖最后由 bestkakkoii 于 2024-1-15 16:57 编辑
    admin 发表于 2024-1-15 16:43
    1. /std:c++20  XP不支持, 很多库不支持
    2. 出现这个问题 , 可能模块删除了, 重新安装模块, 模块默认没有指 ...

    1. 只是说你IDE里面提供这么选择起码2019的编译器得换一个新的,需要使用XP自己切到2015 和 C++14
    8. 这个get或data可以考虑保留,不翻译别名,但不要隐藏因为std内固定是用这两个,但getSize真的挺多馀...
    10. 我不太清楚现在定位是什么,但如果你要讲求好上手来说 效率损耗可能不是最优先需要解决的问题,真的要讲求极致效率的人也不会用CXTextA而是ˋ值接用char*了

    15.所以有些经常使用的同时可以定义静态成员函数,而在同参数多次使用的时候就可以改为选择使用变量定义,一方面也减少重複传参的开销,一方面也可以确保命名风格统一问题
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    QQ|Archiver|手机版|小黑屋|炫彩界面库 ( 鄂ICP备2023014763号-1 )

    GMT+8, 2024-4-30 23:47 , Processed in 0.075826 second(s), 20 queries .

    Powered by Discuz! X3.4

    Copyright © 2001-2021, Tencent Cloud.

    快速回复 返回顶部 返回列表