未处理的异常:将无效参数传递给认为无效参数致命的函数。在插入排序中[重复]

Posted

技术标签:

【中文标题】未处理的异常:将无效参数传递给认为无效参数致命的函数。在插入排序中[重复]【英文标题】:Unhandled exception : An invalid parameter was passed to a function that considers invalid parameters fatal. in insertion sort [duplicate] 【发布时间】:2021-09-26 07:52:52 【问题描述】:

我正在使用 C++ 中的向量进行插入排序。但是,当我想打印前 10 个元素的向量时遇到了问题。

void insertion_sort(vector<int> &data, int n)

    int temp;
    int i;
    int j;

    for (i = 1; i < n; i++)
    
        temp = data[i];
        j = i - 1;
        while (j >= 0 && data[j] > temp)
        
            data[j + 1] = data[j];
            --j;
        
        data[j + 1] = temp;
    


int main()

    int size;
    cin >> size;
    vector<int> list;
    for (int i = 0; i < size; i++) 
        list.push_back(rand());
    
  
    insertion_sort(list, size);
    cout << "first 10 value in list is:";
    for (int j = 0; j < 10; j++)  
        vector<int> arr(list.begin(), list.begin()+j);
        cout << arr.front() << ", "; 
    


size 的输入是1000。但是,发生错误: 0x7927F2F6 (ucrtbased.dll) 处未处理的异常:将无效参数传递给认为无效参数致命的函数。在vector&lt;int&gt; arr(list.begin(), list.begin()+j); 的行 我该如何解决这个问题?

【问题讨论】:

请发帖minimal reproducible example。这意味着标题和在这种情况下使用。您使用的是什么尺寸的值?当 size=10 时,它会在 cout &lt;&lt; arr.front() &lt;&lt; ", "; 中崩溃 您的整个打印循环毫无意义。为什么需要临时的arr 对象?特别是因为它总是以与list 完全相同的前缀内容开头。为什么不直接打印list[i] 您的代码演示了为什么“幻数”被认为是不好的。对该术语进行一些研究。 for (i = 1; i &lt; n; i++) 导致访问超出数组末尾 【参考方案1】:

我修复了大小

#include <iostream>
#include <vector>
using namespace std;

void insertion_sort(vector<int> &data, int n) 
    for (int i = 1, j; i < n; i++) 
        int temp = data[i];
        j = i - 1;
        while (j >= 0 && data[j] > temp) 
            data[j + 1] = data[j];
            --j;
        
        data[j + 1] = temp;
    


int main() 
    int size;
    cin >> size;
    vector<int> list;
    for (int i = 0; i < size; i++) 
        list.push_back(rand());
    
  
    int size2 = size < 10 ? size : 10;
    insertion_sort(list, size);
    cout << "first " << size2 << " value(s) in list: ";
    for (int j = 0; j < size2; j++)  
        cout << list[j];
        if(j + 1 < size2) 
             cout << ", ";
        
    
    cout << "\n";
    return 0;

输入 3 和 20 的示例输出:

first 3 value(s) in list: 846930886, 1681692777, 1804289383
first 10 value(s) in list: 304089172, 424238335, 596516649, 719885386, 783368690, 846930886, 1025202362, 1102520059, 1189641421, 1303455736

也许您应该验证大小 > 0。

【讨论】:

以上是关于未处理的异常:将无效参数传递给认为无效参数致命的函数。在插入排序中[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c语言中atoi编译错误的问题

将参数传递给 pthread_create - 从 void(*)() 到 void(*)(void*) 的无效转换

Jquery DataTable 将参数传递给ajax 调用asp.net。无效的 JSON 原语

`未处理的异常:无效的参数:'_$_Category'的实例`在将数据发送到firestore时形成一个冻结的生成类

无法将车辆信息保存到 firebase [VERBOSE-2:ui_dart_state.cc(186)] 未处理异常:无效参数:“TextEditingController”实例

toJson 无法正常工作 json 序列化程序未处理的异常:无效参数:“DietMo​​del”的实例