Daten zwischen zwei *.c files copieren.



  • alduro01 schrieb:

    Das geht irgendwie nicht ??

    Das ist wohl die schlechteste Fehlerbeschreibung aller Zeiten. 😉 Wenn irgendwas 'nicht geht', dann liefer immer direkt Fehlermeldung und eine eigene -beschreibung mit, ob's zur Laufzeit oder zur Compile-Zeit passiert usw. Damit kann man dann auch was anfangen.

    Abgesehen davon: ist 'output' ein von dir definierter Typ? Wahrscheinlich nicht, oder? 'dy' ist eine double-Variable. Wenn du den Wert der Variablen zurückgeben willst, dann muss der Rückgabewert auch vom Typ double sein. Ebenso gilt das für den Parameter der anderen Funktion, die diesen Wert empfangen soll.



  • Sorry wegen der schlechten Beschreibung !

    ALSO :

    habe vor das output jetzt noch ein double gesetzt !

    Folgenden Fehler tritt beim compilieren auf :

    W:\return\custom.c(8) : error C2061: Syntaxfehler: Bezeichner 'Sfosub'
    W:\return\custom.c(8) : error C2059: syntaxfehler: ';'
    W:\return\custom.c(8) : error C2059: Syntaxfehler: 'Typ'

    Hoffe die Beschreibung ist jetzt besser !
    Grüße



  • Nicht vor das 'output'! Stattdessen! Wie kommst du eigentlich auf 'output'??

    Sorry, aber das mit der "Erfahrung in C++" nehme ich dir nicht mehr ab. Sonst wüsstest du, wie man den Rückgabewert einer Funktion notiert.

    Typ Funktionsname(Parameter);
    
    //also z.B.:
    int myFunc(char c); //nimmt einen Parameter c vom Typ char entgegen, gibt einen Wert vom Typ int zurück
    

    Du solltest dir dringend ein Anfänger-Buch oder -Tutorial reinziehen. Das sind absolut grundlegende Grundlagen, die man unbedingt beherrschen sollte (und noch viel mehr), bevor man sich daran wagt, mit fremdem Code wie dem von dir geposteten rumzuexperimentieren.



  • Hallo,

    das ganz würde so funktionieren, wenn ich die funktion, von mir aus "myFunc",

    irgendwo nach der Definition

    double myFunc(char c)
    {
     c='bla';
    
     return c;
    }
    

    mit

    myOutput myFunc();
    

    aufrufen würde. Oder nicht ? Dann würde doch in myOutput der string 'bla' stehen.

    Problem ist aber das folgende. Ich rufe die Funktion nichtmehr auf.
    Das heißt,

    myOutput myFunc();
    

    fehlt in meine code.

    Grund :

    Ich compiliere das *.c File zu einer custom solver *.dll und importiere das dann in ADAMS.
    Somit ruf ADAMS meine Funktion (oder deine myFunc) auf. Auf diesen Aufruf habe ich aber keine Zugriff. Also auch nicht auf die Variable die zurückgeliefert wird.

    Achja, wegen dem double : Weiß auch nicht was ich mir bei dem Quatsch gedacht habe... Eigentlich is mir schon klar das der Variablenname nicht dahin gehört...
    Bischen zuviel Code heute ...



  • alduro01 schrieb:

    das ganz würde so funktionieren, wenn ich die funktion, von mir aus "myFunc",

    irgendwo nach der Definition

    double myFunc(char c)
    {
     c='bla';
    
     return c;
    }
    

    mit

    myOutput myFunc();
    

    aufrufen würde. Oder nicht ? Dann würde doch in myOutput der string 'bla' stehen.

    Nein. Eine Zuweisung notiert man, indem man den Zuweisungsoperator '=' benutzt. Wenn du einer Variablen i einen Wert 5 zuweisen willst, schreibst du ja auch nicht "i 5;", sondern "i=5;". Folglich müsstest du z.B. "double d=myFunc();" schreiben.

    Nochmal der ganz dringende Tipp: bevor du anfängst, solchen Kram in C zu programmieren (bzw. Fremdcode zu verwenden), musst du erstmal wenigstens die Grundlagen beherrschen. Eine Wertzuweisung ist quasi die erste Seite (und da wahrscheinlich ganz oben) eines Tutorials. Du wirst nicht weiterkommen, wenn es weiterhin so versuchst. Ohne die Basics zu lernen, kommt man leider selten zum Ziel. 🙂

    alduro01 schrieb:

    Ich compiliere das *.c File zu einer custom solver *.dll und importiere das dann in ADAMS.
    Somit ruf ADAMS meine Funktion (oder deine myFunc) auf. Auf diesen Aufruf habe ich aber keine Zugriff. Also auch nicht auf die Variable die zurückgeliefert wird.

    Ich kenne ADAMS nicht. Was ist das denn? Wieso kannst du eine Funktion aufrufen, deren Rückgabe aber nicht speichern und einer weiteren Funktion übergeben? Erklär das mal genauer.

    Zur Not könntest du dY vielleicht auch global deklarieren und in der zweiten Datei über "extern" holen. Die Rückgabe wäre aber besser...



  • Hier die einfache Maschinenbauerlösung :
    (Ich weiß, geht bestimmt auch schöner, aber dass tuts auch)

    #include "slv_c_utils.h"
    #include "math.h"
    
    adams_c_SFOSUB		Sfosub;
    
    double transfer[8];
    
    void Sfosub(const struct sAdamsSforce* sforce, double time, int dflag, int iflag, double* value)
    {
    /* Assign impact parameters to readable variable names */
       double stiff1 = sforce->PAR[3];
       double stiff2  = sforce->PAR[4];
       double expont1 = sforce->PAR[5];
       double expont2   = sforce->PAR[6];
       double bound = sforce->PAR[7];
    /* Load up ipar for call to sysfnc for DZ( PAR(1), PAR(2), PAR(3) ) */
       int    ipar[3]={(int)sforce->PAR[0],(int)sforce->PAR[1], (int)sforce->PAR[2] };
       int    errflg;
       double dy_temp;
       double dy;
       double use_stiff;
       double use_expont;
    
       /* Call SYSFNC for displacement */
    
       c_sysfnc("DY", ipar, 3, &dy_temp, &errflg);
       c_errmes(errflg, "Error getting disp. in SFOSUB.", sforce->ID, "STOP");
    
       dy = dy_temp - 50.0;
    
    	if (dy < 0 )
    	{
    		dy = dy * -1.0;
    	}
    
       *value=pow(dy,expont1)*stiff1;
    
    	transfer[0]=dy;
    	transfer[1]=*value;
    
    }
    
    adams_c_REQSUB		Reqsub;
    
    void Reqsub(const struct sAdamsRequest* adamsreq, double TIME, int IFLAG, double* OUTPUT)
    {  
    
       OUTPUT[0]=transfer[0];
       OUTPUT[1]=transfer[1];
       OUTPUT[2]=0;
       OUTPUT[3]=0;
       OUTPUT[4]=0;
       OUTPUT[5]=0;
       OUTPUT[6]=0;
       OUTPUT[7]=0;
    }
    

    Matze, wenn dich ADAMS interessiert, dann schau mal hier :

    www.mscsoftware.com

    Grüße



  • Also sind jetzt doch beide Funktionen in einer Datei?



  • Matze,

    schau dir mal den zweiten Post in diesem Thread an ....



  • alduro01 schrieb:

    Matze,

    schau dir mal den zweiten Post in diesem Thread an ....

    Hehe, ok, hab ich übersehen...



  • Isch kriege ganz dolle Kopfschmerzen nach dem Lesen hier 😃 und kapiere nicht worum es eigentlich geht. Mal schauen wie das ausgeht...meinen Respekt an Matze hier...halt durch 😉



  • justchris schrieb:

    Isch kriege ganz dolle Kopfschmerzen nach dem Lesen hier 😃 und kapiere nicht worum es eigentlich geht. Mal schauen wie das ausgeht...meinen Respekt an Matze hier...halt durch 😉

    Wie, es geht noch weiter?! Aaaahhh....

    Nee, ich glaube wir sind durch. Er hat eine funktionierende Lösung (Globale), und gut is'. Mehr will er glaub ich nicht.



  • justchris schrieb:

    Isch kriege ganz dolle Kopfschmerzen nach dem Lesen hier 😃 und kapiere nicht worum es eigentlich geht. Mal schauen wie das ausgeht...meinen Respekt an Matze hier...halt durch 😉

    Wenn du wirklich mal sehen willst, wie stark mein Durchhaltevermögen ist, dann sieh dir diesen Monster-Thread hier mal an (überflieg ihn wenigstens):

    http://www.c-sar.de/forum/viewtopic-var-t-is-241662-and-postdays-is-0-and-postorder-is-asc-and-start-is-0.html

    Davon werde ich meinen Enkeln noch erzählen. Ich war am Ende meiner Kräfte... 😃



  • Hi Matze,

    ich habs mal grob überflogen und denke du hättest echt das Zeug und die Geduld aus wirklich jedem, der grad mal "C" sagen kann, ein C-Programmierer zu machen 😉

    Da bewahrheitet sich mal wieder die Weisheit das man ohne Wissen über die Architektur und das Maurerhandwerk kein wirklich gutes Haus hin bekommen wird.



  • justchris schrieb:

    Da bewahrheitet sich mal wieder die Weisheit das man ohne Wissen über die Architektur und das Maurerhandwerk kein wirklich guten Haus hin bekommen wird.

    und auch nicht ohne einen geduldigen online-lehrer.
    🙂


Anmelden zum Antworten