查看Rust Book中的按位运算符列表,我没有看到NOT运算符(如~C中所示).Rust中没有NOT运算符吗?
我很高兴看到C++ 11中的std::u16string和std::u32string,但我想知道为什么没有std::u8string处理UTF-8的情况.我的印象std::string是针对UTF-8,但似乎并不是很好.我的意思是,std::string.length()仍然不返回字符串缓冲区的大小而不是字符串中的字符数?
那么,如何为length()新的C++ 11类定义标准字符串的方法呢?它们是否返回字符串缓冲区的大小,代码点的数量或字符数(假设代理对是2个代码点,但是一个字符.如果我错了,请纠正我)?
那怎么样size(); 是不是等于length()?请参阅http://en.cppreference.com/w/cpp/string/basic_string/length,了解我的困惑之源.
所以,我想,我的基本问题是如何做一个应用std::string,std::u16string以及std::u32string和缓冲区大小,码点的数量和字符数正确区分?如果使用标准迭代器,是否要迭代字节,代码点或字符?
我在C++ FAQ中引入了一个有趣的基类实现,根据我的天真理解,它可以作为一些智能指针实现的替代(例如shared_ptr).以下是逐字的示例代码,但请按照上面的链接获取解释:
class Fred {
public:
static Fred create1(std::string const& s, int i);
static Fred create2(float x, float y);
Fred(Fred const& f);
Fred& operator= (Fred const& f);
~Fred();
void sampleInspectorMethod() const; // No changes to this object
void sampleMutatorMethod(); // Change this object
...
private:
class Data {
public:
Data() : count_(1) { }
Data(Data const& d) : count_(1) { } // Do NOT copy the 'count_' member!
Data& operator= (Data const&) { return *this; } // Do …Run Code Online (Sandbox Code Playgroud) 我有一个简单的.Net Core Console应用程序在同一解决方案中引用.Net Framework 4.6.2项目.当我构建时,我收到以下错误:
错误CS0012:类型"对象"在未引用的程序集中定义.您必须添加对程序集'mscorlib,Version = 4.0.0.0,Culture = neutral,PublicKeyToken = b77a5c561934e089'的引用.
我想做一些不允许的事吗?
有没有办法从.Net Core应用程序引用.Net Framework 4.6(或Mono)程序集(或P/Invoke它)?
使用Visual Studio 2017,.Net Core 1.1
摘要
我正在使用最新版本的Sourcery CodeBench Lite工具链(GCC arm-none-eabi 4.7.2)将ST的USB OTG库移植到定制的STM32F4板上.
当我用-O0编译代码时,程序运行正常.当我用-O1或-O2编译时它失败了.当我说失败时,它就会停止.没有硬故障,没有(好吧,显然它有一些东西,但我没有一个模拟器用于调试和发现,我很抱歉.我的硬故障处理程序没有被调用).
细节
我正在尝试调用以下函数...
void USBD_Init(USB_OTG_CORE_HANDLE *pdev,
USB_OTG_CORE_ID_TypeDef coreID,
USBD_DEVICE *pDevice,
USBD_Class_cb_TypeDef *class_cb,
USBD_Usr_cb_TypeDef *usr_cb);
Run Code Online (Sandbox Code Playgroud)
...但它似乎没有进入功能体.(这是"砸碎"的症状吗?)
传递给此函数的结构具有以下定义:
typedef struct USB_OTG_handle
{
USB_OTG_CORE_CFGS cfg;
USB_OTG_CORE_REGS regs;
DCD_DEV dev;
}
USB_OTG_CORE_HANDLE , *PUSB_OTG_CORE_HANDLE;
typedef enum
{
USB_OTG_HS_CORE_ID = 0,
USB_OTG_FS_CORE_ID = 1
}USB_OTG_CORE_ID_TypeDef;
typedef struct _Device_TypeDef
{
uint8_t *(*GetDeviceDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetLangIDStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetManufacturerStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t *(*GetProductStrDescriptor)( uint8_t speed , uint16_t *length);
uint8_t …Run Code Online (Sandbox Code Playgroud) 我刚刚意识到我可以通过两种方式添加事件处理程序:
考虑像这样的事件处理程序:
private void MyEventHandler()
{}
Run Code Online (Sandbox Code Playgroud)
方法1:实例化新的委托
MyObject.MyEvent += new Action(MyEventHandler);
Run Code Online (Sandbox Code Playgroud)
方法2:添加事件处理程序而不实例化新委托
MyObject.MyEvent += MyEventHandler;
Run Code Online (Sandbox Code Playgroud)
应该考虑这两种实现之间有什么区别吗?
这些函数调用之间是否存在任何功能差异.
方法一:
public static void PrintMe(object obj)
{
Task task = new Task(() =>
{
Console.WriteLine(obj.ToString());
});
task.Start();
}
Run Code Online (Sandbox Code Playgroud)
方法2:
public static void PrintMe(object obj)
{
Task task = new Task((object arg) =>
{
Console.WriteLine(arg.ToString());
}, obj);
task.Start();
}
Run Code Online (Sandbox Code Playgroud) 我正在使用Raisonance的Ride7/Codesourcery(又名Sourcery CodeBench Lite)和STM32F4开发裸机HMI平台.
我将在这个系统中使用C++异常,但是我抛出的任何异常都以写入stderr的"Terminate called recursively"错误结束.
重现问题的代码:(main.cpp)
int main(void)
{
try {
throw 1;
}
catch (...) {
printf("caught");
}
}
Run Code Online (Sandbox Code Playgroud)
我已经尝试过Raisonance和其他来源的解决方案,并且没有收到任何可行的帮助.
潜在问题/解决方案1:
我已经在其他论坛上问过,他们提到我需要在我的启动程序集文件中调用静态构造来初始化展开表(至少这是我认为他们正在讨论的内容),但我不知道如何做到这一点.
潜在问题/解决方案2
我还发现了binutils/gas中的一个错误,可能是我的问题的根源(http://sourceware.org/bugzilla/show_bug.cgi?id=13449).我一直在尝试使用这个补丁来构建我自己的工具链版本,但这已经变成了自己的项目,并且还没有成功.
问题
我是否需要在代码中执行某些操作才能使用C++异常,或者这可能是工具链中的错误?如果是前者,请详细说明.
我们正在从MPC转向 CMake。我们提供了一个包含一些示例的库。样本附带 makefile。
问题是由 cmake 生成的 makefile 包含绝对路径,但不包含相对路径:
# The main all target
all: cmake_check_build_system
cd /.../Projects/cpp_trunk && $(CMAKE_COMMAND) -E cmake_progress_start /.../Projects/cpp_trunk/CMakeFiles /.../Projects/cpp_trunk/samples/CMakeFiles/progress.make
cd /.../Projects/cpp_trunk && $(MAKE) -f CMakeFiles/Makefile2 samples/all
$(CMAKE_COMMAND) -E cmake_progress_start /.../cpp_trunk/CMakeFiles 0
Run Code Online (Sandbox Code Playgroud)
因此,当它被复制时,它就被破坏了。有什么办法可以解决吗?
UPD:我已阅读常见问题解答,但我的问题仍在发生,也许有人设法解决了?
我在C#.Net 4.0应用程序中使用SerialPort类和s ThreadPool.QueueUserWorkItem或者Tasks 遇到了一个有趣的问题.
如果我同时使用2个或更多SerialPort,则只会出现此问题.每个串口都在自己的线程中运行,我以3种方式之一创建:
new Thread(DoSerialCommX)ThreadPool.QueueUserWorkItem(DoSerialCommX)new Task(DoSerialCommX, TaskCreationOptions.LongRunning).Start()为了说明这个问题,我创建了我的DoSerialCommX方法来永久地在循环中读取和写入串行端口.它看起来像这样:(我实际上并没有在我的真实程序中执行此操作.这只是我的测试程序中的一个片段,它隔离并说明了问题).
private void DoSerialCommX()
{
SerialPort port = new SerialPort("ComX", 9600);
port.Open();
while(true)
{
//Read and write to serial port
}
}
Run Code Online (Sandbox Code Playgroud)
如果我使用方法2或3,串行通信口吃,我收到很多通信超时.如果我使用方法1,一切都很好.此外,我应该提到这似乎只发生在我的基于英特尔凌动的PC上.台式电脑似乎没有问题.
我知道线程池重用了线程,默认情况下Task使用线程池.我知道线程池真正用于短期操作.但我尝试使用TaskCreationOptions.LongRunning,我认为会产生一个专用线程,而不是使用线程池,但它仍然无法正常工作.
所以这个问题: 是什么让Thread在这种情况下如此特别?有什么东西Thread使它更适合IO操作吗?
编辑:
到目前为止,答案似乎假设我正在尝试使用ThreadPool或任务进行永无止境的过程.在我的实际应用中,情况并非如此.我只是在上面的代码中使用了一个永无止境的循环来说明问题.我真的需要知道为什么Thread有效ThreadPool,Task有无.什么在技术上不同会导致串行通信打嗝?