DLL Problem mit dem Datenformat?



  • Hallo Leute!

    Ich habe für ein Programm welches Zeitreihen ausgibt und wieder einlesen kann, eine DLL in "Visual C++ Expres 10" geschrieben. (Daten rein, verändern, Daten raus)
    Jetzt habe ich hier das Problem, dass ich mit der Variabel/Array "AG" das Programm zum Absturz bringe. (weil es das "falsche" Datenformat bekommt)
    Das Programm ist recht simpel und sieht wie folgt aus:

    EXTERN_C __declspec(dllexport) void trendx(double *price, long int barcount, double *out)
    	// price = Preis Array IN, barcount=Anzahl der Datensätze, out = Preis Arry OUT
    {
    	double z;
    	double missing=3.4e38; // Zahl wenn keine Daten vorhanden sind
    	double *AG;
    	long int i;
    
    	for(i=0; i<=barcount-1;i++) // Durchlauf durch alle vorhandenen BARs
    	{
    
    		if (i < 1) // die ältestes BAR
    		{
    
    		out[i] = missing; // leerer Output
    		z = 0.07;
    
    		}
    		else
    			if(i>=1 && i < 10) out[i] = (price[i] + 2*price[i-1] + price[i-2]) / 4;
    			//Output für die ersten 10 BARs
    				else 
    					{  //restlichen BARs
    					z = 0.07;
    					AG[i] = price[i-1];
    					out[i]= AG[i] * ((z - z*z/4)* price[i] + 0.5 * z * z * price[i-1] * out[i-2])/2;
    					}
    	}
    }
    

    Wenn ich AG entferne läuft das Programm - jedoch stimmt dann natürlich der Wert nicht...
    Was mache ich denn hier falsch?
    Aja, AG[i] = 0, irgendwo zu definieren brachte auch keine Erfolg...

    Hat jemand eine Idee?
    Danke euch für Hilfe!

    Lg, Alex


  • Mod

    Ist das ein Scherz?

    AG ist doch gar nicht definiert. Das zeigt ins Nirvana. Das muss doch krachen.

    Zudem: Welchen Sinn hat den AG bitte? Du lädst nur price[i-1] hinein und läufst weiter und benutzt doch nur genau diesen Wert.

    Zudem solltest Du Dir mal klar werden was DU hier machst.
    Nur mal als Beispiel: i ist 1. Du greifst auf price[i-2] zu. Ich denke mal das dies undefiniert ist...

    Bevor Du nicht erklärst was das soll, kann Dir wohl kaum einer helfen.



  • Hallo Martin!

    Danke für deine Antwort!
    Natürlich ist das kein Scherz, wenn ich wüßte wie es richtig geht würde
    ich nicht "blöd" fragen. ;-))

    AG ist einfach nur ein Platzhalter für eine Formel bei der ich den/die vorigen Wert(e) brauche, der Einfachkeithalber und Fehlersuche habe ich einfach nur price[i-1] geschrieben, da ich erst einmal den Grundfehler beheben will, bevor ich eine Formel rein schreibe und dann nicht weiß wo der Fehler liegt...

    Die Idee wäre folgendes zu schreiben um das Problem mit dem price[i-2] in den Griff zu bekommen:

    if(i>=1 && i < 10) 
    				{
    					out[i] = (price[i] + 2*price[i-1] + price[i-2]) / 4;
    					AG[i] = price[i];
    					//Output für die ersten 10 BARs
    				}
    				else 
    					{  //restlichen BARs
    					z = 0.07;
    					AG[i] = price[i-1];
    					out[i]= AG[i] * ((z - z*z/4)* price[i] + 0.5 * z * z * price[i-1] * out[i-2])/2;
    					}
    

    Mit nicht definiert meinst du, "was ist wenn es keinen vorherigen Wert gibt"?

    Danke und Lg, Alex


  • Mod

    Wenn der Array dynmisch ist, musst Du diesen vorher mit new anlegen und auch wiederr mit delete entsorgen.

    evtl. solltest Du Dir mal STL Container ansehen.
    Sofern barcount die Arraygröße ist sollte es so aussehen:

    EXTERN_C __declspec(dllexport) void trendx(double *price, long int barcount, double *out)
        // price = Preis Array IN, barcount=Anzahl der Datensätze, out = Preis Arry OUT
    {
        double z;
        double missing=3.4e38; // Zahl wenn keine Daten vorhanden sind
        double *AG = new double[barcount];
    ...
        delete [] AG;
    
    }
    

    BTW: Das sind Basics....



  • Hallo Martin!

    Danke für die Infos und Tipps!

    Wo würden denn das delete [] AG stehen, am Ende des Codes?
    Warum ich dies am Anfang nicht definiert habe ist folgede Info die beim Programm dabei stand:

    The memory pointers passed to your DLL call will have memory already allocated by the programm for the number of rows required. So you don't need to allocate this memory for the parameters passed to you (even if they are outputs). In fact, if you do it will cause a memory leak because the program will not release that memory.

    oder hat dies damit nichts zu tun und bin ich hier komplett am falschen Weg?!

    Danke und Lg, Alex



  • Hallo!

    Wenn ich AG wie oben beschrieben definieren, crasht mir das Programm nicht
    aber es gibt mir keine Werte aus. Vmtl. liegt es daran dass der Speicher
    schon res. /definiert wurde, siehe oben.

    Wenn ich die DLL so einbinde, dass die Werte für "i" definiert sind,
    stürzt mir das Programm trotzdem ab.

    Irgendeine Idee?

    Danke und lg, Alex


  • Mod

    Nö. So lange ich nicht weiß was dieses Ding tun soll?



  • Achso... Sorry!
    Na die DLL soll den Price einlesen und einen neuen Wert, anhand der Formel
    berechnen und wieder als out ausgeben.
    Bar für Bar.
    Es kommt im Programm selber als Indikator raus.
    Dies funktioniert auch, jedoch ich AG verwenden will, der Absturz....

    Lg, Alex



  • Hallo!

    Ich habe mir dies jetzt nochmals angeschaut.
    Wenn ich *AG nochmals mit double *AG = new double[barcount]; definieren und dann oben die für bis zu 10 Durchläufe für AG etwas definiere funktioniert es, mit Wert und ohne Absturz!

    Danke nochmals für die Inputs!

    Lg, Alex


Log in to reply