数据结构与算法——KMP 字符串匹配算法

模式串 next 向量计算: 字符串比较 int mystrcmp(const char* str1, const char* str2){ int i = 0; while(str1[i] == str2[i] && str1[i] != '\0'){ i++; } return str1[i] - str2[i]; }

November 13, 2022 · 1 min · Rick Cui

Unreal5——开发、使用问题汇总

新建项目的时候没有项目模板 打开 Epic Games Launcher,在 虚幻引擎 -> 库 中选择需要添加组件的引擎版本,打开 选项 面板,勾选需要更改的组件 在 Play 模式下切换到鼠标控制 Shift + F1 Detaches from the player controller,通过鼠标操作场景和 Editor F8 指定源码开发工具 Editor Preferences -> Source Code C++ 代码编译 Editor 右下角 C++ Live Coding 热编译 Ctrl + Alt + F11 重新构建 C++ 工程 注意:需要关闭 Editor VS Code: Ctrl + Shift + B C++ 项目中使用插件...

November 10, 2022 · 1 min · Rick Cui

Cesium4Unreal——Importing Quixel Assets

一、安装 Quixel Bridge UE5 中已经集成了 Quixel Bridge 插件,不再需要单独安装(安装包),选择 编辑(Edit)> 插件(Plugins) 。在搜索栏中输入 bridge ,然后点击复选框以启用该插件。 如果在插件面板中未显示 Quixel Bridge 插件,需要从 Epic Games 启动程序(Epic Games Launcher) 安装它。打开 Epic Games 启动程序,点击 库(Library) ,然后向下滚动到名为 保管库(Vault) 的分割线。在搜索栏中输入 Bridge 。选择 安装到引擎(Install to Engine) 。重新启动引擎时,可以按如上所述启用该插件。 使用 EPIC GAME 账户 登录到 Quixel Bridge 并进行授权,加入 Unreal Unlimited 计划,如有需要,请科学上网 如果发现账户无法登录,采用下面的步骤解决: 科学上网 如果已经运行,请关闭 Bridge; 导航到 C:\Users[用户]\AppData\Roaming 删除 Bridge、Bridge-Bifrost、Megascans Bridge 三个文件夹 重新登录到 Bridge 二、在项目中导入资源 打开 Bridge 面板,搜索自己需要的资源,并将其下载到本地...

October 25, 2022 · 1 min · Rick Cui

Cesium4Unreal——Build a Flight Tracker With Cesium for Unreal

第一步:创建一个关卡 创建一个空的 Unreal 关卡; 登录 Cesium ion 并添加 Cesium World Terrain 和 CesiumSunSky; 设置 CesiumGeoreference 的坐标为 San Francisco International Airport (SFO); Origin Latitude = 37.61779 Origin Longitude = -122.390533 Origin Height = 0.0 第二步:添加 PlaneTrack 类 在 UE Editor 中添加 C++ 类,选择 Actor 作为父类,点击【下一步】,输入类名 PlaneTrack,点击【创建类】按钮,此时 Visual Studio 会自动打开,如果没有打开,可以通过【工具】——【打开Visual Studio】手动打开项目 VS 2022 解决方案类似下图: 添加下面的代码到 project.Build.cs 文件: // Add Cesium for Unreal plugin dependency path PrivateDependencyModuleNames.AddRange(new string[] { "CesiumRuntime" }); // Tell Unreal Engine to use C++17 CppStandard = CppStandardVersion....

October 19, 2022 · 3 min · Rick Cui

C++——malloc、calloc、realloc、指针杂记

void printArr(int *A, int size){ printf("Elements of array: "); for(int i = 0; i < size; ++i){ printf("%d\t", A[i]); } printf("\n"); } int main() { int C[3][2][2] = {{{1,2},{3,4}},{{5,6},{7,8}},{{9,10},{11,12}}}; // 虽然地址相同,但代表的意义却不相同 printf("%p\t%p\t%p\t%p\t%p\t%p \n", C, *C, C[0], C[0][0], &C[0][0], &C[0][0][0]); printf("%p\t%p\t%p\n", *C+1, C[0]+1, C[0][1]); printf("%p\t%p\n", C, C[0][0] + 1); printf("%p\t%p\n", C, &C[0][0] + 1); // 分配空间,但不会对元素进行初始化 int *A = (int*)malloc(3 * sizeof(int)); for(int i = 0; i < 3; ++i){ A[i] = i+1; } printArr(A, 3); // 分配空间,并将元素初始化为0 int *B = (int*)calloc(3, sizeof(int)); printArr(B, 3); // 重新分配一块空间(新空间可大可小) // 并把原来的数据拷贝过来 // 如果新空间首地址与原来空间地址不同,会将原来的内存空间释放 // ,注意:此时不能再继续访问原来的地址,虽然原来的指针并未置空 int *D = (int*)realloc(A, 10 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(A, 3); // 此时不能访问 A 了,这是危险的行为 printArr(D, 10); // 等同于重新分配了空间 D = (int*)realloc(NULL, 3 * sizeof(int)); // int *D = (int*)malloc(3 * sizeof(int)); printf("%p\t%p\n", A, D); printArr(D, 3); // 等同于释放了内存空间并将指针置为空值 D = (int*)realloc(D, 0); // free(D);D = nullptr; printf("%p\n", D); return 0; } 输出:...

October 2, 2022 · 1 min · Rick Cui