我目前正在开发一个SDL项目.它基本上绘制和移动屏幕上的图像(表面).
要在不留下痕迹的情况下移动图像,必须首先清除屏幕表面,非常像glClear(),我现在正在使用一个简单的for循环迭代表面的像素(也在表面上绘制一个黑盒子)或memset).
虽然之前的解决方案适用于小型表面,但随着表面变大,它们变得越来越慢,因此我正在寻找能够清除(零)内存块的最快方法.
另外,一位朋友指出,使用SIMD指令可以非常快速地完成工作,但是我最后一次完成ASM是在8085上,对此的任何见解也可能有用.
我已经做了两个函数来将一个32/64位指针"转换"成一个双精度型.单独使用时代码工作(只有.h和包含它的.cpp),但在其他地方使用.h(复制到项目目录然后包含)时,会对所有函数抛出"已定义"错误.链接时的h文件.
.h文件的源代码如下:
#pragma once
#ifndef __FLOATCAST_H
#define __FLOATCAST_H
//A quick and dirty way of casting pointers into doubles and back
//Should work with BOTH 64bit and 32bit pointers
union ptr_u {
double d;
void* p;
};
double ptr2double(void* pv){
ptr_u ptr;
ptr.p = pv;
return (ptr.d);
};
void* double2ptr(double dv){
ptr_u ptr;
ptr.d = dv;
return(ptr.p);
};
#endif
Run Code Online (Sandbox Code Playgroud)
该链接表示这些函数已经在文件源文件(而不是他的.obj)上定义,该文件不包含此文件.
编辑:为什么我想要一个指针内部双?因为我需要Lua(5.1)来回调一个对象成员函数.
Edit2:Lua提供了一种存储用户数据的方式,它似乎是足够的解决方案,而不是投射指针(见注释)
我被一个意想不到的整数提升所困扰,让我感到奇怪。在显式转换之前是否进行提升是否在编译器之间保持一致?
让我解释。有一个有符号的 8 位变量,例如
int8_t s8a = -128; //<-- 0x80
分配到一个无符号16uint16_t s16b = s8a + 1;我希望晋升到一个更大的整数0xFF81,然后分配,这是一种常见的事故,并像MISRA C.文件,但明确地铸造为无符号类型的方式考虑像uint16_t s16b = (uint16_t)s8a我本来预计s8a给立刻输它的“符号性”,然后零扩展到 16 位作为给予,0x0080但实际上相反的情况发生,因为它得到符号扩展然后在转换和分配给予时失去其符号性0xFF80。
这是 C 的行为标准还是其他未定义的行为?
假设我有一个prolog程序来连接这样的列表:
concat([],X,X).
concat([Head|Tail],X,[Head|R]) :- concat(Tail,X,R).
Run Code Online (Sandbox Code Playgroud)
我怎么知道哪些问题会返回有限数量的答案?例如,问
concat(X,Y,[1,2,3,4]).
Run Code Online (Sandbox Code Playgroud)
将返回有限解集:
X = [],
Y = [1, 2, 3, 4] ;
X = [1],
Y = [2, 3, 4] ;
X = [1, 2],
Y = [3, 4] ;
X = [1, 2, 3],
Y = [4] ;
X = [1, 2, 3, 4],
Y = [] ;
false.
Run Code Online (Sandbox Code Playgroud)
在提问时
concat(X,[2,3],Z).
Run Code Online (Sandbox Code Playgroud)
将返回一组无限的解决方案:
X = [],
Z = [1, 2, 3] ;
X = [_G24],
Z = [_G24, 1, 2, 3] ;
X = …Run Code Online (Sandbox Code Playgroud) 我创建了Someting类,当它无法实例化时抛出异常SomethingException(SomethingException继承自std :: exception).问题是我无法捕捉SomethingException(我不得不做一个肮脏的技巧来抓住它).
程序中的某个位置执行: 这不起作用,异常未被捕获且程序崩溃.
try{
Something* s = new Something();
}
catch (SomethingException* e){
std::cerr<<e.what();
}
Run Code Online (Sandbox Code Playgroud)
相反,这确实有效(捕获异常并显示正确的消息)但我真的有感觉我不应该这样做
try{
Something* s = new Something();
}
catch (std::exception* e){
SomethingException* e2 = (SomethingException*) e;
std::cerr<<e.what();
}
Run Code Online (Sandbox Code Playgroud)
因为指针是铸造的,所以当且仅当抛出一种类型的异常时,我才能使这个工作.我需要捕捉各种类型的那一刻不起作用.
有没有办法以更正确的方式捕获自定义异常?
编辑:
抛出异常如下
//...
throw new SomethingException ("Errormessage"); //Custom exception constructor
//...
Run Code Online (Sandbox Code Playgroud)
Something :: Something()的声明是
Something::Something() throw(...)
Run Code Online (Sandbox Code Playgroud)
使用声明
Something::Something() throw(SomethingException)
//or
Something::Something() throw(SomethingException*)
Run Code Online (Sandbox Code Playgroud)
引发很多警告(警告C4290)
我正在尝试初始化一个32位整数数组bu由于某种原因调试器(MSVC)在写入过程中途抛出异常.
该数组是1048576个元素,
在迭代263152上失败
#define ROM_MAX_SIZE (1024*1024*4)
int main(){
size_t rom_size = ROM_MAX_SIZE / sizeof(uint32_t);
uint32_t *rom = malloc(rom_size); //<-- Error here, must be ROM_MAX_SIZE. See edit
for (uint32_t i = 0; i < rom_size; i++){
rom[i] = i; //<--- Access violation here
}
free(rom);
return 1
}
Run Code Online (Sandbox Code Playgroud)
我可能会遗漏一些明显但我看不到的东西.
编辑:
Malloc必须是元素数量的4倍.
uint32_t *rom = malloc(rom_size); //<--- WRONG!
uint32_t *rom = malloc(ROM_MAX_SIZE); //<--- OK.
Run Code Online (Sandbox Code Playgroud)