WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Speicher dynamisch allozieren in C-mex Files

 

Bernddd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 09:26     Titel: Speicher dynamisch allozieren in C-mex Files
  Antworten mit Zitat      
Es steht ja schon in der Überschrift was ich suche.

Code:

 p=(int*)malloc(sizeof(int));
 d=(int*)malloc(sizeof(int));
 
                        /* Speicher für Ergebnis vorbelegen */
                        plhs[0]=mxCreateDoubleMatrix(1,p,mxREAL);
                        plhs[1]=mxCreateDoubleMatrix(1,d,mxREAL);
 
                       
                        /* Speicher und Zeiger ausrichten*/
                        xArray=mxGetPr(plhs[0]);
                        yArray=mxGetPr(plhs[1]);
 

So dachte ich, dass er funktioniert den Speicher bei mxCreateDoubleMatrix
dynamsich zu allozieren. Aber Pointer sind da anscheinend verboten.

Error koorBrech.c: 95 type error in argument 2 to `mxCreateDoubleMatrix_700'; found `pointer to int' expected `int'
Wie kann ich den Speicher dynamsich allozieren?


Bernddd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 11:43     Titel:
  Antworten mit Zitat      
gelöst:
Code:


                        /* Speicher für Ergebnis vorbelegen */
                        plhs[0]=mxCreateDoubleMatrix(1,sizeof(p)*sizeof(double),mxREAL);
                        plhs[1]=mxCreateDoubleMatrix(1,sizeof(d)*sizeof(double),mxREAL);
 
                       
                        /* Speicher und Zeiger ausrichten*/
                        xArray=mxGetPr(plhs[0]);
                        yArray=mxGetPr(plhs[1]);
                       
                         p=mxMalloc(sizeof(xArray)/sizeof(xArray[0]));
                         d=mxMalloc(sizeof(yArray)/sizeof(yArray[0]));
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.09.2010, 11:46     Titel: Re: Speicher dynamisch allozieren in C-mex Files
  Antworten mit Zitat      
Hallo Bernddd,

lies doch mal die Dokumentation zu mxCreateDoubleMatrix.
Dort findest Du:
mxArray *mxCreateDoubleMatrix(int m, int n,
mxComplxity ComplexFlag)

Also müssen die ersten beiden Inputs INT-Werte sein, die die Länge der Spalten und Zeilen festlegen.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 11:51     Titel:
  Antworten mit Zitat      
Das mit den Integer ist mir bekannt.
Die 2.Version läuft auch... leider schmiert
es doch noch ab und an ab. WIE gesagt,
mir ist zu Beginn die Größe von xArray und
yArray nicht bekannt und somit weiss ich
ja nicht, wie groß ich mxCreateDoubleMatrix
machen muss... Lösung?
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.09.2010, 12:00     Titel:
  Antworten mit Zitat      
Hallo Bernddd,

Zitat:
Code:
           plhs[0]=mxCreateDoubleMatrix(1,sizeof(p)*sizeof(double),mxREAL);
 

Damit erzeugst Du einen Matlab-Double-Vektor der Länge 8. In Matlab würde das so lauten:
Code:

Wenn Dein Programm damit nicht stabil läuft, brauchst Du wahrscheinlich mehr als 8 Elemente. Da Du in C arbeitest, *musst* Du vorher wissen, wieviel Speicher Du maximal brauchst. *Oder* Du kannst Dir erstmal einen Speicherblock reservieren, einen Index mitführen, der Dir zeigt wie weit dieser Block schon gefüllt ist, und bei Bedarf per mxRealloc den Block vergrößern (wobei er im Allgemeinen auch verschoben wird). Zum Schluß kannst Du dann Dein mxArray mit der gewünschten Größe erzeugen und die Daten per MEMCPY kopieren.

Dynamisch wachsende Memory-Blöcke sind ein beliebtes und tückisches Problem in C. Die Anzahl möglicher Bugs ist riesig und Ursache der Verwundbarkeiten von vielen Programmen.
Bitte lies die Dokumentation nochmal durch, und schaue Dir auch die Beispiel C-Mex-Files an, die dort genannt werden.

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 13:09     Titel:
  Antworten mit Zitat      
Hi,

hast du ein Bsp.?

Vielen Dank
 
Bernddd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 13:14     Titel:
  Antworten mit Zitat      
Obwohl, das scheint ganz gut erklärt zu sein:
http://pronix.linuxdelta.de/C/stand.....programmierung_17_1.shtml

ich werds versuchen!
 
Bernddd

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.09.2010, 15:12     Titel:
  Antworten mit Zitat      
ok
hab mir das ganze angeschaut.
Das wirft alles neue Porbleme auf.
Sagen wir ich belege is mit mxMalloc auf 10 vor.
Das ergibt dann einen Fehler wenn nur 5 Werte berechnet werden und
mir trotzdem dann aber trotzdem die Nullen ausgegeben werden.
Was nicht sein darf. Alle Werte müssen müssen >=0.5 sein.
D.h. wenn ich dann bei Bedarf den Speicher erweitere habe ich das
gleiche Problem. Ok nur um 1 erweitern und das immer wieder zu machen
wird alles wohl extrem ausbremsen....
Also ich weiss gerade nicht wie ich jetzt weitermachen soll...
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 23.09.2010, 15:28     Titel:
  Antworten mit Zitat      
Hallo Bernddd,

eine typische Vorgehensweise wäre schematisch:

currentLength = 100;
Daten = mxMalloc(currentLength * sizeof(double));
index = 0;
% Schleife über zu berechnende Werte, falls einer angefügt wird:
if (index == currentLength) {
currentLength *= 2; % Doppel so lange
Daten = mxRealloc(Daten, currentLength, sizeof(double));
}
Daten[index++] = NeuerWert;
% End der Schleife

% Nun ist [index]-1 die Anzahl der Werte.
plhs[0] = mxCreateDoubleMatrix(1, index-1, mxREAL);
memcpy(mxGetPr(plhs[0]), Daten, (index-1) * sizeof(double));

Du arbeitest also zunächst mit dem C-Array, dass Du dynamisch vergrößerst. Die Anfangsgröße und die Vergrößerungsschritte sind dabei wichtig, müssen aber zum speziellen Problem passen.
Erst zum Schluß erzeugst Du das Matlab-Array mit genau der richtigen Größe.

Regel: Das (re-)allocieren von Speicher braucht sehr viel Zeit! Also lieber den Anfangswert viel zu groß setzen, als 3 oder 4 mal den Speicherberecih vergrößern!
Wenn Du jedes einzelne Element neu hinzu-allocierst, muss der Rechner für 100 Elemente insgesamt 5050*8 Bytes anfordern. Bei 1000 Elementen wären es schon 500500: sum(1:1000)!

Ausserdem: mxMAllox und mxRealloc stoppen ein Mex-File, wenn es in der Matlabumgebung läuft und der gewünschte Speicher nicht mehr frei ist. In einer Stand-alone-Version crasht aber! Also immer den zurückgelieferten Point testen, ob er NULL ist!
Man sollte sich das gleich angewöhnen, wenn man mit C arbeitet. Andernfalls hat man ein crashendes Programm und kommt auch nach Stunden des debuggens nicht hinter die Ursache des Problems, weil sich beim nächsten Programmlauf eventuell doch genügend freier Speicher findet!

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
Gast



Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.09.2010, 08:38     Titel:
  Antworten mit Zitat      
BESTEN DANK, JAN
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

Du kannst Beiträge in dieses Forum schreiben.
Du kannst auf Beiträge in diesem Forum antworten.
Du kannst deine Beiträge in diesem Forum nicht bearbeiten.
Du kannst deine Beiträge in diesem Forum nicht löschen.
Du kannst an Umfragen in diesem Forum nicht mitmachen.
Du kannst Dateien in diesem Forum posten
Du kannst Dateien in diesem Forum herunterladen
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.