2016-07-29 12 views
0

Aus Spaß schreibe ich ein Programm, das ein Bild mit Primzahlen erstellt. Dazu erstelle ich ein 2d-Array aller natürlichen Zahlen bis zu einem bestimmten Punkt.

Primzahlen werden im Bild als schwarzes Pixel dargestellt, und zusammengesetzte Zahlen sind weiß. Das Programm funktioniert für Dimensionen kleiner als 1000 * 1000, aber wenn es überschreitet, bleibt es stecken. Wie behebe ich es, jede Hilfe ist willkommen.Stuck große 2d-Array definieren - C++

#include <iostream> 
#include <cmath> 
#include <fstream> 

using namespace std; 

bool isPrime(long long a){ 

    if(a==1){return false;} 

    if(a==2){return true;} 

    if(a%2==0){return false;} 

    long long root = sqrt(a); 
    for(long long i=3;i<=root;i+=2){ 
    if(a%i==0){return false;} 
    } 
    return true; 
} 

int main(){ 
    int width = 0, height = 0; 
    cout << "Which dimentions do you want the picture to be?" << endl; 
    cout << "Width: " << flush; 
    cin >> width; 
    cout << "Height: " << flush; 
    cin >> height; 

    /*Create matrix*/ 
    long long imageMap[height][width]; 
    long long numberOfPixels = width*height; 
    long long i = 1; 
    long long x = 0 , y = 0; 
    cout << "Number of pixels the image will have: " << numberOfPixels << endl; 

    while(i<=numberOfPixels){ 
    imageMap[x][y] = i; 
    x++; 
    if(x==width){ 
     y++; 
     x=0; 
    } 
    i++; 
    } 

    cout << "Image map done" << endl; 
    cout << "Creating prime map, please wait..." << endl; 


    /*Generate prime map*/ 
    int primeMap[width][height]; //The program gets stuck here 


    for(long long y = 0; y < width; y++){ 
    for(long long x = 0; x < height; x++){ 
     if(isPrime(imageMap[x][y])){ 
     primeMap[y][x] = 1; 
     } else { 
     primeMap[y][x] = 0; 
     } 
     cout << " x = " << x << flush; 
    } 
    cout << endl << "y = " << y << endl; 
    } 

    cout << "Writing to file, please wait..." << endl; 

    /*Write to file*/ 
    ofstream primeImage; 
    primeImage.open("prime.pbm"); 

    primeImage << "P1 \n"; 
    primeImage << width << " " << height << "\n"; 

    for(int y = 0; y < width; y++){ 
    for(int x = 0; x < height; x++){ 
     primeImage << primeMap[y][x] << " "; 
    } 
    primeImage << "\n"; 
    } 
    primeImage.close(); 
    cout << "Map creation done" << endl; 
    return 0; 
} 
+1

"es hängt fest" Was bedeutet das? Bitte seien Sie spezifisch – Rakete1111

+4

Zwei Probleme: Erstens hat C++ keine [Arrays mit variabler Länge] (https://en.wikipedia.org/wiki/Variable-length_array), zweitens Stapelgröße (wo lokale Variable, einschließlich Arrays) werden von den Compilern nur sehr begrenzt gespeichert. Die Standard-Stack-Side unter Windows beträgt 1 MB pro Prozess. Sie versuchen, ein 8 MB-Array auf dem Stapel zu erstellen. –

+3

Als eine mögliche Lösung, schlage ich vor, dass Sie stattdessen lernen über ['std :: vector'] (http://en.cppreference.com/w/cpp/container/vector). –

Antwort

0

Der Standardgrößenstapel für eine App ist 1 MB, wenn der Speicher dient. Joachim hat recht, der beste Weg ist es, etwas über std :: vector zu erfahren. Aber wenn das nur ein lustiges Wegwerfprogramm ist, könntest du einfach die Stapelgröße erhöhen, damit es funktioniert. Wenn Sie Visual Studio verwenden, öffnen Sie die Projekteigenschaften und sehen Sie sich die Linkersystem-Registerkarte an. Sie können den Stack-Reserve-Wert verwenden, um die Stack-Größe zu erhöhen. Aber ich würde das nicht für ein konkretes Arbeitsprojekt empfehlen.

BTW: Wenn Joachim seinen Kommentar als Antwort umschreiben möchte, schlage ich vor, dass Sie das akzeptieren.