小编Neo*_*Man的帖子

哪种清除内存块(或SDL表面)的最快方法?

我目前正在开发一个SDL项目.它基本上绘制和移动屏幕上的图像(表面).

要在不留下痕迹的情况下移动图像,必须首先清除屏幕表面,非常像glClear(),我现在正在使用一个简单的for循环迭代表面的像素(也在表面上绘制一个黑盒子)或memset).

虽然之前的解决方案适用于小型表面,但随着表面变大,它们变得越来越慢,因此我正在寻找能够清除(零)内存块的最快方法.

另外,一位朋友指出,使用SIMD指令可以非常快速地完成工作,但是我最后一次完成ASM是在8085上,对此的任何见解也可能有用.

c c++ assembly sdl

7
推荐指数
1
解决办法
5669
查看次数

在.h文件中使用非常简单的C++函数链接错误

我已经做了两个函数来将一个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提供了一种存储用户数据的方式,它似乎是足够的解决方案,而不是投射指针(见注释)

c++ linker compiler-errors visual-studio

5
推荐指数
1
解决办法
4971
查看次数

C Cast 上的整数提升如何工作?

我被一个意想不到的整数提升所困扰,让我感到奇怪。在显式转换之前是否进行提升是否在编译器之间保持一致?

让我解释。有一个有符号的 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 的行为标准还是其他未定义的行为?

c types casting sign undefined-behavior

3
推荐指数
1
解决办法
140
查看次数

Prolog终止域:我怎么知道哪些问题会返回有限数量的答案?

假设我有一个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)

prolog non-termination failure-slice

2
推荐指数
1
解决办法
204
查看次数

在C++中抛出和捕获自定义异常的问题

我创建了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)

c++ exception try-catch

1
推荐指数
2
解决办法
6353
查看次数

在范围内写入数组值时发生访问冲突

我正在尝试初始化一个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)

c arrays access-violation visual-c++

-3
推荐指数
1
解决办法
91
查看次数