Großes Array/Stack Overflow



  • Ich versuche folgendes zu tun:

    long *pnPixel[960000];
    

    Dabei gibt es einen Stack Overflow. Jetzt kann man ja mittels /Z laut der Doku die Stack-Größe einstellen. Die Frage ist wie groß ist ein Pointer auf ein Long und was für ein Wert ist da sinnvoll?



  • Pointer sind immer gleich groß. 😃

    Ich würde das Array aber mit new auf den Heap legen, das erscheint mir sinnvoller.



  • Erstmal meine ich muss der * weg.
    long pnPixel[960000];

    Allerdings wird das so auf dem Stack angelegt.
    Also solltest Du lieber dynamisch das Array anlegen.

    long *pxPixel = new long[960000];

    und am Ende das Aufräumen nicht vergessen:

    delete[] pxPixel;

    Stackgröße verändern ist nicht unbedingt der richtige Weg.



  • Ich brauch aber keinen Pointer auf ein Array mit 960k Einträgen, sondern 960k Pointer in einem Array 😉

    /Edit: Hab´s gelöst mit EditBin
    -> http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html/_core_.2f.stack_editbin.asp



  • Man benutzt ja auch std::vector<> für sowas!

    Hier gibts Infos:
    http://www.kharchi.de/cppratgeber2.htm



  • Das hat schon seinen Grund warum ich das genau so mache und nicht mit einem Vector, aufm Heap oder sonstwas.



  • asdrubael schrieb:

    Das hat schon seinen Grund warum ich das genau so mache und nicht mit einem Vector, aufm Heap oder sonstwas.

    Interessehalber, welchen Grund gibts denn 😕, ausser nem Designfehler. 😃 😃 😃



  • Ich nutze eine C API und die erwartet ein Array. Ich programmiere hier keine Uni-Studien oder Tic Tac Toe Spiele wo ich mir das Schönste aussuchen kann.



  • Und wo ist das Problem, deiner C Funktion das Array aus dem Vector zu übergeben? 😕

    // Eine C Funktion:
    void function(long *p, int size);
    
    std::vector<long> vec(960000, 0);
    vec[0] = 1000;
    function(&(vec.front()), vec.size());
    


  • *edit* Schluss hier das Thema ist erledigt.



  • *begründ*

    #include "windows.h"
    #include <vector>
    #include <iostream>
    using namespace std;
    
    // For-Scope Hack für VC 6
    #define for if(false);else for
    
    int main()
    {
    	vector<long> vecPixel(960000, 0);
    
    	LARGE_INTEGER before;
    	LARGE_INTEGER after;
    
    	int nPixelCounter = 0;
    	int nSizeX = 1600;
    	int nSizeY = 1200;
    
        QueryPerformanceCounter (&before);
    	for (int i = 0; i<nSizeX; i+=2)
    	{
    		for (int y = 0; y <nSizeY; y++)
    		{
    			vecPixel[nPixelCounter] = vecPixel[0];
    			nPixelCounter++;
    		}
    	}
    	QueryPerformanceCounter (&after);
    
        LARGE_INTEGER freq;
    	QueryPerformanceFrequency (&freq);
    	double nTimer = ((after.QuadPart - before.QuadPart) * 1000) / freq.QuadPart;
    	cout << "Vektor hat gebraucht: " << nTimer << " ms \n";
    
        long szPixel[960000];
    	nPixelCounter = 0;
    
        QueryPerformanceCounter (&before);
    	for (int i = 0; i<nSizeX; i+=2)
    	{
    		for (int y = 0; y <nSizeY; y++)
    		{
    			szPixel[nPixelCounter] = szPixel[0];
    			nPixelCounter++;
    		}
    	}
    	QueryPerformanceCounter (&after);
    
    	QueryPerformanceFrequency (&freq);
    	nTimer = ((after.QuadPart - before.QuadPart) * 1000) / freq.QuadPart;
    	cout << "Array hat gebraucht: " << nTimer << " ms \n";
    
    	return 0;
    }
    

    Kann ja jeder selbst ausprobieren, vielleicht hat sich auch ein Fehler eingeschlichen oder er optimiert da was weg aber ich denke nicht.


Anmelden zum Antworten