6错误代码C3848.

Posted codemagiciant

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了6错误代码C3848.相关的知识,希望对你有一定的参考价值。

C++错误C3848:具有类型“XXX”的表达式会丢失一些 const-volatile 限定符以调用“XXX”

问题:

在练习set容器时,对其做自定义顺序排序时出现错误

错误:

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C3848 具有类型“const _Keycmp”的表达式会丢失一些 const-volatile 限定符以调用“bool myfunc::operator ()(int,int)” 07set容器 C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Tools\\MSVC\\14.35.32215\\include\\xmemory 52

严重性 代码 说明 项目 文件 行 禁止显示状态
错误 C2056 非法表达式 07set容器 C:\\Program Files\\Microsoft Visual Studio\\2022\\Enterprise\\VC\\Tools\\MSVC\\14.35.32215\\include\\xmemory 51

#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;
#include<set>//multset也是这个头文件
#include<algorithm>
#include<string>

void test()

	set<int>::iterator it;
	it++;
	it--;
	//it + 2;err
	//双向迭代器


void printSet(set<int> &s)

	for (set<int>::iterator it = s.begin(); it != s.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;

/*
构造函数
set<T> st;//set默认构造函数:
mulitset<T> mst; //multiset默认构造函数:
set(const set &st);//拷贝构造函数

赋值操作
set&operator=(const set &st);//重载等号操作符
swap(st);//交换两个集合容器
大小操作
size();//返回容器中元素的数目
empty();//判断容器是否为空

插入和删除操作
insert(elem);//在容器中插入元素。
clear();//清除所有元素
erase(pos);//删除pos迭代器所指的元素,返回下一个元素的迭代器。
erase(beg, end);//删除区间[beg,end)的所有元素 ,返回下一个元素的迭代器。
erase(elem);//删除容器中值为elem的元素。


*/

void test01()

	set<int> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(10);
	s.insert(7);
	//自身规则进行排序,从小到大
	printSet(s);




struct myfunc

	bool operator()(int v1,int v2)//const
	
		return v1 > v2;
	
;
void printSet2(set<int, myfunc> &s)

	for (set<int, myfunc>::iterator it = s.begin(); it != s.end(); ++it)
	
		cout << *it << " ";
	
	cout << endl;

//改变set容器的规则,变为降序(从大到小)
void test02()

	set<int, myfunc> s;
	s.insert(4);
	s.insert(8);
	s.insert(2);
	s.insert(10);
	s.insert(7);

	printSet2(s);


int main()

	test02();
	system("pause");
	return EXIT_SUCCESS;


解决:

结构体中函数加const

参考链接:

(9条消息) C++错误C3848:具有类型“XXX”的表达式会丢失一些 const-volatile 限定符以调用“XXX”_密苏里的小人物的博客-CSDN博客

Omnet ++简单模块的C ++代码中python嵌入代码中的分段错误错误

【中文标题】Omnet ++简单模块的C ++代码中python嵌入代码中的分段错误错误【英文标题】:Segmentation fault error in python embedded code in C++ code of Omnet++ simple module 【发布时间】:2019-05-29 13:33:35 【问题描述】:

我想从 OMNeT++ 简单模块中的 C++ 代码调用 Python 函数。

我使用 gdb 调试了代码。它通过了所有行,但最后 在Py_Finalize(); 之后发生分段错误。

我发现以下issue on GitHub 描述了相同的问题。 但这并没有帮助我解决问题。

double result=0;
// 1) Initialise python interpretator
if (!Py_IsInitialized()) 
    Py_Initialize();
        //Py_AtExit(Py_Finalize);

// 2) Initialise python thread mechanism
if (!PyEval_ThreadsInitialized()) 
        PyEval_InitThreads();
        assert(PyEval_ThreadsInitialized());


PyGILState_STATE s = PyGILState_Ensure();
PyRun_SimpleString("import sys; sys.path.append('/home/mypath/')");
PyObject *pName = PyUnicode_DecodeFSDefault((char*)"integrationTest");
PyObject* pModule = PyImport_Import(pName);

if (pModule != NULL)

    PyObject* pFunction = PyObject_GetAttrString(pModule, (char*)"calculateExecutionTime");
    /// changement will be held in this level Args and function result.
    PyObject* pArgs = PyTuple_Pack(2,PyFloat_FromDouble(2.0),PyFloat_FromDouble(8.0));
    PyObject* pResult = PyObject_CallObject(pFunction, pArgs);
    result = (double)PyFloat_AsDouble(pResult);
    ///////

// Clean up
PyGILState_Release(s);
Py_DECREF(pName);
Py_DECREF(pModule);
Py_Finalize();

【问题讨论】:

PyObject_GetAttrString(pModule (char*)"calculateExecutionTime"); 不应该是合法的。您的真实代码中是否有逗号,或者编译器是否接受了真正奇怪的东西?此外,您没有检查 NULL 的返回值(在 PyObject_CallObject 调用中尤其重要,您将忽略引发的任何异常并试图将可能的 NULL 返回解释为指向 PyFloat 的合法指针) 或其他错误返回(例如,PyFloat_AsDouble 返回 -1.0 并设置失败异常)。 附加问题:您在发布 GIL 后是 Py_DECREFing。 GIL 的主要目的是保护引用计数操作;如果您不持有 GIL,则不允许以任何方式修改引用计数。诚然,如果不涉及线程,这不太可能成为问题,但这只是另一个可能的问题来源。 我的真实代码在 PyObject_GetAttrString(pModule,(char*)"calculateExecutionTime"); 中包含一个逗号。我会检查我的返回值。感谢您的 cmets。 【参考方案1】:

问题发生在python解释器第一次初始化/取消初始化之后。在 OmneT++ 模拟期间发生的事情是初始化/取消初始化/重新初始化/... Python 解释器。但是,Numpy 不支持这个;

所以,我通过在 initialize() 方法的模拟开始时只初始化一次 python 解释器来解决这个问题。然后,我调用了 Py_Finalize();在析构函数中。

【讨论】:

好的。但是在您的问题中没有任何线索表明您可能会多次初始化和完成 Python(并且您链接到的 github 问题以及您所说的“没有帮助”实际上表示不支持)。请阅读关于询问minimal reproducible example的帮助,并在下一次关注它 没错,因为我在 OmneT++ 模拟的特殊情况下使用 python 嵌入式代码。它不是经典的 C++ 程序。它由模拟事件控制,之后我理解了问题,然后 github 链接很有帮助。一开始,我并不了解python解释器机制。谢谢你的链接,我下次会关注它。

以上是关于6错误代码C3848.的主要内容,如果未能解决你的问题,请参考以下文章

Java练习 SDUT-3848_Shift Dot

windows平台下编译kicad

在Visual C++6.0里,出现了C2065的错误,代码及错误详细见补充。

为啥在网上找的一些c语言程序的代码在vc++6.0中编译总是出现错误?求指教

C 和调试中的 Abort Trap 6 错误

C中的“中止陷阱:6”错误?