我通過創建一個像素數組來生成隨機噪聲,然後使用它來創建圖像。代碼工作,編譯器顯示沒有問題,只是說一個警告: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;
}
結果我得到的是這樣的:
你可以清楚地看到,噪聲發生器工程,但數組似乎會像我在繪製的圖像底部看到的那樣受到損壞。我發現當我返回數組時,發生了「腐敗」。如果在getPerlinArray
函數之外放置sf::Uint8 tmp[width * height * 4]
(並且我定義了width
和height
),因此tmp
是全局的,數組不會損壞,程序的工作方式應該如此。有沒有辦法返回一個局部變量(在這種情況下,數組),而不會被損壞?
號警告=問題! –
你不能安全地返回指向局部變量的指針。返回一個值,如矢量對象。 –
在第一個函數中,數組只存在於一個函數中。你應該創建數組:'sf :: Uint8 * tmp = new sf :: Uint8 [width * height * 4];' – 2017-01-02 21:26:18