C++实现不退出函数返回值并模拟股票数据流存储
解决股票数据流模拟与数组存储的编译及功能问题
核心需求
- 让
feedgenerator函数持续返回递增的counter(对应时间)和随机生成的value(对应价格数据),模拟时序数据的连续更新,且不退出函数 makearray函数可接收数组长度参数,不能使用vector(追求性能),负责存储生成的数据- 修复原代码的编译错误,实现函数嵌套调用并正确输出存储的数据
原代码的关键问题
feedgenerator中return语句直接终止循环,无法持续生成数据;pause不是标准C++函数,无法实现延时std::array的模板大小参数必须是编译期常量,无法用运行时传入的len赋值,不符合动态指定数组长度的需求main函数指针使用错误:new double[]未指定数组大小,嵌套调用的参数类型不匹配,数组访问方式错误- 全局变量
prevcntr的等待逻辑设计不合理,无法正确同步数据生成与存储流程
修正后的实现代码
#include <iostream> #include <cstdlib> #include <chrono> #include <ctime> #include <thread> // 全局状态记录生成器的当前计数,简化实现 static long int current_cntr = 0; // 持续生成时序数据:每次调用返回下一组(counter, value) std::pair<long int, double> feedgenerator() { // 随机种子仅初始化一次 static bool seeded = false; if (!seeded) { srand(static_cast<unsigned int>(time(nullptr))); seeded = true; } current_cntr++; // 模拟数据生成间隔,替代原代码的pause std::this_thread::sleep_for(std::chrono::microseconds(1)); return {current_cntr, static_cast<double>(rand()) / RAND_MAX}; } // 生成指定长度的数组并填充数据,返回动态分配的数组指针 double* makearray(long int len) { double* outarr = new double[len]; for (long int itr = 0; itr < len; ++itr) { auto [cntr, value] = feedgenerator(); outarr[itr] = value; } return outarr; } int main() { const long int len = 100000; // 嵌套调用生成数组 double* data_array = makearray(len); // 输出前10条数据(避免输出10万条导致刷屏) std::cout << "前10条模拟数据:" << std::endl; for (int i = 0; i < 10; ++i) { std::cout << "第" << i+1 << "条:" << data_array[i] << std::endl; } // 输出最后10条数据 std::cout << "\n最后10条模拟数据:" << std::endl; for (long int i = len - 10; i < len; ++i) { std::cout << "第" << i+1 << "条:" << data_array[i] << std::endl; } // 释放动态分配的内存,避免泄漏 delete[] data_array; return 0; }
关键优化说明
- feedgenerator改进:用静态变量确保随机种子只初始化一次,每次调用返回递增的counter和随机value;使用标准库的
std::this_thread::sleep_for实现数据生成间隔,替代原代码的非标准pause函数 - makearray实现:采用动态分配的原生数组(
double*),既满足运行时指定长度的需求,又保持与原生数组一致的高性能;通过循环直接调用feedgenerator填充数据,简化同步逻辑 - main函数修正:修复指针使用错误,实现正确的嵌套调用;调整输出逻辑避免大量数据刷屏;添加内存释放操作,防止内存泄漏
内容的提问来源于stack exchange,提问作者csk 7
相关产品推荐
相关产品推荐

