globale dynamische arrays, globale vector? - Performance



  • Hallo zusammen,

    ich melde mich mal wieder mit einem Problem: Ich habe die Integrand Funktion im unteren Beispiel, die so bestehen bleiben muss und der ich keine weiteren Pointer, Variabeln außer die eine eingetragene übergeben kann, da die Funktion in zahlreichen Unterprogrammen aufgerufen wird, sodass an den Stellen überall der Code angepasst werden müsste. Diese Funktion wird in der main aufgerufen und die spval Funktion innerhalb von integrand braucht Zugriff auf das Array x und greift über x[Wert] auf die Array Inhalte lesend zu. Dieser Wert (also x) werden aber erst in der main berechnet und sind somit der integrand-Funktion unbekannt. Ich habe es bisher so gelöst (stark abstrahiert dargestellt, da es um viel viel mehr arrays von sehr großer Größe geht)

    vector<douuble> v; //globaler Vektor
    double integrand(double variable){
    	double sx;
    	spval(n, variable, &v[0], sx); //hier braucht spval Zugriff auf das array oder hier den Vektor
    	return sqrt(sx * sx)
    }
    double berechnung (double* wert1, double *berechnung){
           for(...){
                berechnung[laufvariable]=wert1[laufvariable]...
                            ....
           }
    }
    
    int main (){
           double ergebnis; 
           double* x= new double (irgendeine_groesse);
           berechnung(messwert, x); //hier kann ich nur ein "normales" array benutzen, da mit x[laufvariable] so schreibend zugegriffen wird, was ja bei einem vektor nicht funktioniert (zumindest gibt visual studio dann einen Fehler aus)
    
           for (int l=0; l<irgendeine_groesse; l++){
                  v.push_back(x[l]);
           }
    
           ergebnis = integrand (irgendeine_variable); //Zugriff auf x über spval muss der Funktion ja global bekannt sein
    }
    

    Wie kann ich das ganze dynamisch und global anlegen, sodass alle Funktionen darauf zugreifen können. Meine einzige bisher funktionierende Möglichkeit wäre die Obengenannte im Beispiel... aber aus Performance-Gründen nimmt, da es sich um sehr sehr viele Werte handelt, die for-Schleife in der main einige Zeit in Anspruch, die ich mir sehr gerne sparen würde. Kann man dynamischen Speicher global anlegen (meine bisheren Umsetzungen sind gescheitert) um nicht diesen Umweg über den globalen vektor gehen zu müssen?

    Für jegliche Hinweise und Ideen bin ich Ihnen sehr dankbar! 🙂



  • Ich bin mir nicht sicher ob ich dein Problem verstehe, aber du kannst einfach einen globalen Pointer haben der dann auf irgendeinen dynamisch reservierten Speicher Bereich zeigt.

    Kaiserstaedter schrieb:

    hier kann ich nur ein "normales" array benutzen, da mit x[laufvariable] so schreibend zugegriffen wird, was ja bei einem vektor nicht funktioniert (zumindest gibt visual studio dann einen Fehler aus)

    Nein du kannst auch einen vector nutzen. Du musst halt vorher den vector entsprechend vergrößern (mit .resize() ) und dann die Adresse vom ersten Element übergeben.



  • vielen Dank für die Antwort!
    Habe schon versucht den vector mit resize() bzw. reserve() auf Größe zu bringen und dann damit zu agieren, aber weil ich in der Funktion mit der []-Form auf x[..] schreiben muss, geht das mit dem Vektor nicht,

    aber mit dem globalen Pointer ist eine gute Idee !! Danke dafür



  • Kaiserstaedter schrieb:

    aber weil ich in der Funktion mit der []-Form auf x[..] schreiben muss, geht das mit dem Vektor nicht

    Wieso nicht? Wenn der Code

    double* x = new double(irgendeine_groesse);
    berechnung(messwert, x);
    

    funktioniert, muss auch

    vector<double> x;  // oder ohne resize könnte man auch direkt vector<double> x(irgendeine_groesse); schreiben
    x.resize(irgendeine_groesse);
    berechnung(messwert, x.data());
    

    funktionieren.



  • hier ein simples Beispielprogrmm:

    #include <vector>
    #include <iostream>
    
    using namespace std;
    
    int main(){
    
    	vector<double> v;
    	v.resize(4);
    	v[0] = 0.0;
    	v[1] = 1.1;
    	v[2] = 2.2;
    	v[3] = 3.3;
    	cout << v[0] << v[1] << v[2] << v[3] << endl;
    
    	return 0;
    }
    

    funktioniert bei mir nicht



  • In wie fern funktioniert das nicht?

    Kompiliert es nicht (wie lautet die Fehlermeldung etc.)?
    Gibt es nicht das gewünschte Resultat (was kommt raus, was erwartest du)?

    Ich sehe jedenfalls keinen Fehler in dem Beispielprogramm und es läuft auch so, wie man das erwarten würde.



  • aber trotzdem danke, sebi, mit dem globalen pointer klappt esbestens 👍
    manchmal sieht man vor lauter Bäume den Wald nicht mehr, das war bei mir der Fall :



  • bei mir bei visual studio sagt der "debug assersation failed"



  • irgendwie ist das merkwürdig, unter Ubuntu g++ läuft es tatsächlich, aber bei visual studio gibt der mir den Fehler aus, jetzt verseth ich gar nichts mehr 😕



  • Kaiserstaedter schrieb:

    irgendwie ist das merkwürdig, unter Ubuntu g++ läuft es tatsächlich, aber bei visual studio gibt der mir den Fehler aus, jetzt verseth ich gar nichts mehr 😕

    Das glaube ich dir nicht. Du benutzt nicht den gezeigten Code.



  • manni66 schrieb:

    Du benutzt nicht den gezeigten Code.

    Oder sein Visual Studio ist kaputt. Der Code muss wie gezeigt jedenfalls funktionieren.



  • http://www.bilder-upload.eu/thumb/b8b37f-1464473311.png

    ich weiß zwar nicht, warum du mir das nicht glaubst,aber wenn das bei mir so ist kann ich jetzt auf anhieb nichts ändern... frag mich nicht warum



  • Kaiserstaedter schrieb:

    http://www.bilder-upload.eu/thumb/b8b37f-1464473311.png

    ich weiß zwar nicht, warum du mir das nicht glaubst

    Weil das Programm korrekt ist und Visual Studio ganz sicher nicht an so einem trivialen Programm scheitert. Dein "Beweise" zeigt natürlich geschickterweise nicht, ob dort resize oder reserve steht (falls es überhaupt der Code ist, der zu dem Fehler führte).



  • http://www.bilder-upload.eu/thumb/315e9a-1464474252.png

    ist ja echt lustig, hier... auch wenn ich euch nichts beweisen muss oder den Weiten des Internets Rechtfertigung bieten muss, aber bitteschön auch jetzt klappt es noch nicht,



  • Ja, ist echt lustig hier mit Trollen wie dir. Du hast vergessen zu speichern, bevor du dein "Beweisefoto" gemacht hast.



  • immer locker bleiben, kannst du mir glauben, kannst du aber auch sein lassen, es klappte nicht...
    habe es jetzt jedenfalls ans laufen bekommen, Problem liegt an eigenem Downloadpaket von headern, was wir vor einigen Jahren vom ehemaligen Prof gestellt bekommen haben, habe es wieder durch visuals standard bib ausgetauscht und siehe da, es läuft
    und für deine innerliche befriedigung: oh ja ich bin so dumm, dass ich nicht den standard lasse!



  • Problem liegt an eigenem Downloadpaket von headern, was wir vor einigen Jahren vom ehemaligen Prof gestellt bekommen haben, habe es wieder durch visuals standard bib ausgetauscht

    Naja Ehrlich ?
    Solche Dinge Global umzubiegen und nicht projektspezifisch, ist aber auch nicht wirklich intellligent oder ?

    Das gewisse Lehrkräfte eine besondere Vorstellung von C++ haben, hört man allerdings immer wieder mal ^^

    Ciao ...


Anmelden zum Antworten