gpt4 book ai didi

c++ - 返回本地数组会损坏数组数据

转载 作者:行者123 更新时间:2023-11-27 23:57:39 24 4
gpt4 key购买 nike

我通过创建一个像素数组来生成随机噪声,然后我用它来创建图像。代码有效,编译器没有显示任何问题,除了一条警告:warning: address of local variable 'tmp' returned [-Wreturn-local-addr]

#include <SFML/Graphics.hpp>
#include <vector>
#include <stdlib.h>
#include <time.h>

sf::Uint8* getPerlinArray(unsigned int width, unsigned int height){
sf::Uint8 tmp[width * height * 4];

for(unsigned int i = 0; i < width * height * 4; i+=4){
sf::Uint8 value = rand() % 256;
tmp[i] = value;
tmp[i + 1] = value;
tmp[i + 2] = value;
tmp[i + 3] = 255;
}

return tmp;
}

sf::Image getPerlinImage(unsigned int width, unsigned int height){

sf::Uint8* arr = getPerlinArray(width, height);

sf::Image img;
img.create(width, height, arr);

return img;
}

int main(){

//Set random seed.
unsigned int seed = time(NULL);
srand(seed);

//Create window
sf::RenderWindow window(sf::VideoMode(200, 200), "Random Noise");

sf::Image img = getPerlinImage(64, 64);

sf::Texture txt;
txt.loadFromImage(img);

sf::Sprite sprite;
sprite.setTexture(txt);

while (window.isOpen()){
sf::Event event;
while (window.pollEvent(event)){
if (event.type == sf::Event::Closed)
window.close();
}

window.clear(sf::Color::Green);
window.draw(sprite);
window.display();
}

return 0;
}

我得到的结果是这样的:

1]

您可以清楚地看到噪声发生器在工作,但正如我们在我绘制的图像底部看到的那样,阵列似乎已损坏。我发现在返回数组时发生了“损坏”。如果将 sf::Uint8 tmp[width * height * 4](我定义了 widthheight)放在 getPerlinArray< 之外 函数,这样 tmp 是全局的,数组不会被破坏,程序可以正常工作。有没有办法返回局部变量(在本例中为数组)而不损坏它?

最佳答案

由于您使用的是像 C++ 这样的语言,因此您有很多选择

1 - 您可以将其作为参数而不是返回值。

void getPerlinArray(unsigned int width, unsigned int height, sf::Uint8* ){
for(unsigned int i = 0; i < width * height * 4; i+=4){
sf::Uint8 value = rand() % 256;
tmp[i] = value;
tmp[i + 1] = value;
tmp[i + 2] = value;
tmp[i + 3] = 255;
}

return tmp;
}

sf::Image getPerlinImage(unsigned int width, unsigned int height){

sf::Uint8 arr[width * height * 4];
getPerlinArray(width, height, arr);

sf::Image img;
img.create(width, height, arr);

return img;
}

2 - 您可以扩展悬挂指针的范围。例如,您可以使其成为全局性的。如果 width*height 在编译时已知,只需将 sf::Uint8 arr[width * height * 4]; 移动到全局范围。

3 - 您可以使用 C++ 并使用 std::vector 代替 C 数组。所以你的代码看起来像

std::vector<sf::Uint8> getPerlinArray(unsigned int width, unsigned int height){
std::vector<sf::Uint8> tmp(width * height * 4);

for(unsigned int i = 0; i < width * height * 4; i+=4){
sf::Uint8 value = rand() % 256;
tmp[i] = value;
tmp[i + 1] = value;
tmp[i + 2] = value;
tmp[i + 3] = 255;
}

return tmp;
}

sf::Image getPerlinImage(unsigned int width, unsigned int height){

std::vector<sf::Uint8> arr = getPerlinArray(width, height);

sf::Image img;
img.create(width, height, arr.data());

return img;
}

还有许多其他解决方案,例如使用 malloc、new 等进行动态分配。

关于c++ - 返回本地数组会损坏数组数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41433381/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com