Instanz an Funktion übergeben



  • Hallo, ich bin ein ziemlicher Neuling in C++ und hoffe, ihr könnt mir helfen! 🙂

    Mein Problem:
    Ich habe eine Klasse Protocol und würde gern eine Instanz dieser Klasse an eine Funktion, die nicht in der Klasse ist, übergeben. Sprich, ich möchte eine außerhalb der Funktion erstellte Instanz in der Funktion nutzen. Wie rufe ich die Funktion dann am besten auf?

    Hier meine Instanz mit Funktionsaufruf

    Protocol UDP_conn;
    
    grndstion_prtcl_step(/*wie am besten?*/);
    

    Und die Funktionsdefinition:

    void grndstion_prtcl_step(/*wie am besten?*/){
    
    	char first_sig_descr[28] = "Never income message";
    	char second_sig_descr[28] = "The Second funny";
    	static double datas_in = 0;
    	int tx_buf_size = 500;
    	char tx_buffer[500] = "GET TIME\r\n";
    	char rx_buffer[500];
    	int i;
    	int UDP_TIMEOUT = 50;
    
    	for(i=0;i<500;i++){
    		rx_buffer[i]=0;
    		tx_buffer[i]=0;
    	}
    
    	datas_in= 35991;
    	static float myfloat=297.861;			
    
    	UDP_conn.Signal_do(300,first_sig_descr, 7,&datas_in,PRIO_HIGH,DIR_OUT, DOUBLE); /*Signal_do() ist Funktion der Klasse*/
    }
    


  • Reiche die Instanz als Referenz rein. Wenn möglich, auch gleich als const (also wenn Signal_do const ist)


  • Mod

    Genau so wie bei jedem anderen Typ:

    void grndstion_prtcl_step(Protocol protocoll);
    
    Protocol UDP_conn;
    grndstion_prtcl_step(conn);
    

    Wobei du wie bei jedem anderen Typ natürlich auch die Möglichkeit einer Referenz oder besonders einer const-Referenz in Betracht ziehen solltest und entscheiden musst, welche dieser drei Möglichkeiten am besten passt.



  • Als Referenz uebergeben, das heisst

    grndstion_prtcl_step(Protocol &udp_conn)
    

    oder wenn udp_conn in der Funktion nicht verandert wird, dann

    grndstion_prtcl_step(const Protocol &udp_conn)
    


  • K2daL schrieb:

    grndstion_prtcl_step

    Die letzten paar Vokale hättest du aber auch noch weglassen können.



  • Super, danke! Das mit den Referenzen hat prima geklappt! Weiterführend stehe ich aber vor einem ähnlichen Problem. In die Funktion soll eine weitere Instanz einer anderen Klasse eingefügt werden. Diese Instanz bekommt aber Parameter übergeben. Ein Auszug aus der Klasse sieht wie folgt aus:

    class Udp_prtcl_connection
    {
      public:
    
    	#ifdef matlab_
    	Udp_prtcl_connection(SimStruct *S,unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0 );
    	#else
    	Udp_prtcl_connection(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0 );
    	#endif
    

    Ich habe also folgende Instanz außerhalb der Funktion erstellt:

    Udp_prtcl_connection Udp_port1_conn(46, 192, 168, 0, 193, 0);
    

    und rufe die Funktion auf:

    grndstion_prtcl_step(UDP_conn, Udp_port1_conn);
    

    Die Funktionsdefinition sieht ähnlich aus wie oben, jedoch wurde sie durch die Funktion udp_transmit() der Klasse Udp_prtcl_connection erweitert.

    void grndstion_prtcl_step(Protocol &UDP_conn, Udp_prtcl_connection &Udp_port1_conn(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0)){
    
    	char first_sig_descr[28] = "Never incom message";
    	char second_sig_descr[28] = "The Second funny";
    	static double datas_in = 0;
    	int tx_buf_size = 500;
    	char tx_buffer[SPI_RX_TX_SIZE] = "GET TIME\r\n";
    	char rx_buffer[500];
    	int i;
    	int UDP_TIMEOUT = 50;
    
    	for(i=0;i<500;i++){
    		rx_buffer[i]=0;
    		tx_buffer[i]=0;
    	}
    
    	datas_in= 35991;
    	static float myfloat=297.861;			
    
    	UDP_conn.Signal_do(300,first_sig_descr, 7,&datas_in,PRIO_HIGH,DIR_OUT, DOUBLE);
    	UDP_conn.Signal_do(301,second_sig_descr, 7,&myfloat,PRIO_HIGH,DIR_OUT, SINGLE);
    
    	int buffer_written = UDP_conn.write_tx_buf(tx_buffer); 
    	printf("The written Byte num: %d \n", buffer_written);
    
    	int udp_trans = Udp_port1_conn.udp_transmit(tx_buffer, rx_buffer,SPI_RX_TX_SIZE ,SPI_RX_TX_SIZE, UDP_TIMEOUT);
    }
    

    Der Fehlercode sagt folgendes:

    tcp_lib.h:17: error: redefinition of 'class Udp_prtcl_connection'
    tcp_lib.h:18: error: previous definition of 'class Udp_prtcl_connection'
    

    In der tcp_lib.h ist die Klasse Udp_prtcl_connection definiert.
    Für weitere Hilfe wäre ich sehr dankbar! Und wie gesagt, bin kein C++-Spezialist. 🙂



  • Lies bitte erstmal ein gutes Gurndlagenbuch. Bei deinen Wissenslücken hat es recht wenig Sinn, an der Stelle weiterzumachen, an der du dich gerade befindest.

    sorry, wenn das jetzt etwas zu direkt ist. Aber sowas

    void grndstion_prtcl_step(Protocol &UDP_conn, Udp_prtcl_connection &Udp_port1_conn(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0)){
    

    ist schon recht eigenwillig. Willst du hier der Funktion eine Funktion übergeben? Oder was genau ist dein Ziel?


  • Mod

    void grndstion_prtcl_step(Protocol &UDP_conn, Udp_prtcl_connection &Udp_port1_conn(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0))
    

    Das macht keinen Sinn. Was soll die verschachtelte Klammer?

    Ich empfehle übrigens irgendein (gutes!) Grundlagenbuch zu C++. Das hier ist kleines Einmaleins, das muss sitzen. Siehe zweiter und vierter Link in meiner Signatur. "Thinking in C++" ist davon sogar ein freies Ebook, da kann es keine Ausreden des Geldes wegen geben.

    Und benutz Vokale! Im Arabischen mag man ohne auskommen, aber in den indogermanischen Sprachen sind sie wichtig!



  • Mir ist klar, dass ich einer Funktion keine Funktion übergeben kann, aber gibt es denn sonst irgendeine Möglichkeit Instanzen mit Parametern zu übergeben?



  • SeppJ schrieb:

    void grndstion_prtcl_step(Protocol &UDP_conn, Udp_prtcl_connection &Udp_port1_conn(unsigned short port_number, int a1, int a2, int a3, int a4, char serve_1_clien_0))
    

    Das macht keinen Sinn. Was soll die verschachtelte Klammer?

    Die Syntax ist (AFAICS) korrekt. Die Notation kennst du doch 😕

    Mir ist klar, dass ich einer Funktion keine Funktion übergeben kann

    Doch doch, kann man.


  • Mod

    K2daL schrieb:

    Mir ist klar, dass ich einer Funktion keine Funktion übergeben kann,

    Doch, das geht.

    aber gibt es denn sonst irgendeine Möglichkeit Instanzen mit Parametern zu übergeben?

    Wieso eine Instanz mit Parametern? Übergib die Instanz!

    daddy_felix hat schon Recht, es macht nicht groß Sinn, dir zu helfen, so lange du weder die grundlegende Syntax beherrscht, noch überhaupt eine richtige Vorstellung davon hast, was ein Objekt überhaupt ist.


  • Mod

    Sone schrieb:

    Die Syntax ist (AFAICS) korrekt. Die Notation kennst du doch 😕

    Nicht für das, was er vor hat. Er hat bloß zufällig etwas getroffen, was syntaktisch richtig ist. Möglicherweise sogar durch bloßes Ausprobieren, da man in C++ jeden Mist zu etwas syntaktisch richtigem zurecht biegen kann, wenn man bloß genügend Klammern, Sternchen und Ampersande dranschmeißt.

    Deswegen ist es auch gerade so wichtig, dass man ganz genau weiß, wieso man wo welches Zeichen setzt. Jedes Sternchen kann den Sinn eines Ausdrucks komplett verändern. Siehe:
    http://magazin.c-plusplus.net/artikel/(Humor) Die Entstehungsgeschichte von C



  • SeppJ schrieb:

    Jedes Sternchen kann den Sinn eines Ausdrucks komplett verändern. Siehe:
    http://magazin.c-plusplus.net/artikel/(Humor) Die Entstehungsgeschichte von C

    Wobei das Beispiel dort Kinderkram ist.
    Dass es seltsam aussieht kommt auch nur durch den Einsatz von Zeichen wie "|" in Strings und der komplett bescheuerten Formatierung zustande.
    Wenn man das mit sinnvollen Namen und passend eingerückt hinschreibt ist es überhaupt nicht schlimm.

    Da sind in C (mit oder ohne ++) und auch in anderen Sprache viel schlimmere Sachen möglich.


  • Mod

    hustbaer schrieb:

    Da sind in C (mit oder ohne ++) und auch in anderen Sprache viel schlimmere Sachen möglich.

    Schamlos vom IOCCC geklaut:

    int _;main(O,l,o)char**l,**o;{_++>>9||main(1&(o?(int)o:clown:|O*2,l,putchar(_%32?atoi(1[l])>>(7&O<<!o>>!o+29)&32<_|_==16?35:32:10)%10);}
    

    Sieht auf den zweiten Blick auch recht einfach aus (wie der von der Witzeseite), aber wenn man tiefer eintaucht, sind da doch ein paar ganz schön merkwürdige Operationen drin. Und natürlich zählt auch hier jedes Zeichen und ein Programmierer sollte zumindest benennen können, was die einzelnen Operationen alle machen. Selbst wenn die Anordnung sehr komisch ist (ich blicke selbst nicht so ganz durch).


Anmelden zum Antworten