Esta inquietud se puede solucionar de variadas formas, pero nosotros te enseñamos la que para nosotros es la respuesta más completa.
Solución:
Este:
int image[W*H];
float dtr[W*H];
Crea cada uno 4 * 1000 * 1000 ~ 4 MB array en la pila. El espacio de pila es limitado y, por lo general, es inferior a 4 MB. No haga eso, cree las matrices en el montón usando new.
int *image = new int[W*H];
float *dtr = new float[W*H];
Su pila probablemente no sea lo suficientemente grande para contener un millón de entradas y un millón de flotantes (8 MB). Entonces, tan pronto como intente acceder más allá del tamaño de su pila, su sistema operativo le arrojará un error. Los objetos o matrices por encima de un cierto tamaño deben asignarse en el montón, preferiblemente utilizando una clase de verificación de límites automáticos autogestionada como std::vector
– el tamaño específico depende de su implementación.
Además del desbordamiento de la pila, tiene otro problema, uno que está enmascarado por sus definiciones de W y H.
for(int i=0;i
Su ciclo i debe contar de 0 a H-1, en lugar de W-1 (y el ciclo j también debe intercambiarse). De lo contrario, su código solo funcionará correctamente si W==H. Si WH sobrepasará sus búferes.
Este mismo problema también existe en otra parte de su ejemplo de código.