Aufuruf nach Definierung



  • Solltest vielleicht mal eher lesen, scheint mir als hätteste du keine Ahnung um was es geht.
    NOCHMAL:
    Ich hab IN einer Klasse eine Methode deklariert, diese Methode hat einen Paremeter der als char deklariert ist. DIESEN Paremeter definiere ich in einer außenstehenden Klasse (nicht wichtig). So, jetzt hab ich den char in der Methode. Diesen Wert möchte ich jetzt aber in anderen Klasse aufrufen, wie geht das? Muss ich dann wieder den Deklarierungsnamen angeben!? Kapiert?



  • vergiss nicht, dass du derjenige bist, der hilfe will. mit so einem unfreundlichen ton wirst du nur einen streit entfachen und am ende bist du dann derjenige, den eben nicht geholfen wird. abgesehen davon liegt der verdacht nahe, dass du dich selbst als "meine_fresse" eingeloggt hast und von dir selbst dann in der dritten person sprichst. warum? weil meine_fresse, genau wie du, denselben fehler macht: es heißt parameter, nicht paremeter.

    so, ich wollte dir tatsächlich helfen, aber nachdem mir das aufgefallen ist, wünsche ich dir nur noch einen guten tag.


  • Mod

    Steve Ballmer schrieb:

    Kapiert?

    Wenn du hier eine richtige Diskussion erwartest, solltest du weniger herablassend formulieren. Da du dich genötigt siehst, nocheinmal nachzufragen, deutest du zudem selbst Klärungsbedarf an.

    Steve Ballmer schrieb:

    Solltest vielleicht mal eher lesen, scheint mir als hätteste du keine Ahnung um was es geht.

    Das trifft wahrscheinlich zu, mir geht es jedenfalls so. Ich bezweifle aber, dass dies meinerseits mangelnden Kenntnissen geschuldet ist.

    Steve Ballmer schrieb:

    Ich hab IN einer Klasse eine Methode deklariert, diese Methode hat einen Paremeter der als char deklariert ist.

    Schön.

    Steve Ballmer schrieb:

    DIESEN Paremeter definiere ich in einer außenstehenden Klasse (nicht wichtig).

    Schon wichtig, weil widersprüchlich. Parameter werden stets nur deklariert. Mithin beginnt hier die Verwirrung. Alles Folgende ist nicht geeignet, Klarheit zu schaffen.



  • Sry wenn ich jetzt mit einem Schlag ins Gesicht antworte, aber was ist so schwer daran? Eine kurze Antwort auf meine Frage hätte gereicht, dann wäre die Sache schon gegessen gewesen.
    Aber ok, nochmal mit echtem Code!
    Deklaration:

    class Viewer
    {   
     public:
    
    	 char server_name(char server_name_variable[20]);
    };
    
    char Viewer::server_name(char server_name_variable[20])
    {
    	return *server_name_variable;
    };
    //blablabla....
    

    Hier die Definierung außerhalb der Klasse:

    (Dieser char wird als Parameter bergeben)
    	char *p_server_name;
    	p_server_name=new char[20];
    	GetWindowText(hServer, p_server_name, 20);
    
    (Hier passiert dat)
    viewer.server_name(p_server_name);
    

    Soweit so gut, ich hoffe das wurde verstanden =). So, wie ihr seht wurde der Parameter neu definiert. Und genau diesen Parameter möchte ich jetzt wiederrum in einer anderen Klasse verwenden...wie gehe ich da vor? Wie rufe ich die Methode nun mit dem zuvor definierten Wert auf?
    1. Möglichkeit:

    p_viewer->buffer_user(p_server_name);
    

    2. Möglichkeit:

    p_viewer->buffer_user(char server_name_variable[20]);
    

    So, jetzt wird der Akku langsam leer...und ahyo, sry wegen vorhin, war halt etwas rüpelhaft (^^tolles Wort) und dreisst,...=)



  • Jetzt mag mich keiner mehr oder? Wusste ich doch, Windows mag schliesslich auch keiner...



  • Du brauchst dich darüber nicht zu wundern. Sehr verständnisvoll bist du mit den Leuten ja nicht gerade umgegangen, und das, obwohl der Fehler bei dir lag und du Hilfe erwartest.

    Bitte versuch, dich genauer auszudrücken, man versteht nämlich immer noch nicht genau, was dein Problem ist. Und es wäre einfacher, wenn den Code im Originalzustand lassen würdest, dann müssen wir auch nicht raten, wenn ein wichtiger Teil ausgelassen und durch eine ungenaue Beschreibung ersetzt wird.

    p_viewer->buffer_user(p_server_name);
    

    Damit übergibst du das zuvor definierte Array.

    Übrigens: Wenn du ein Array, das zuvor dort stand, einfach mit new[] überschreibst, hast du ein Memory Leak. Das alte existiert weiterhin und blockiert dir den Speicher. Benutze deshalb delete[] , wenn du den Speicher freigeben willst.



  • Steve Ballmer schrieb:

    Aber ok, nochmal mit echtem Code!
    Deklaration:

    class Viewer
    {   
     public:
    
    	 char server_name(char server_name_variable[20]);
    };
    
    char Viewer::server_name(char server_name_variable[20])
    {
    	return *server_name_variable;
    };
    //blablabla....
    

    Warum nicht gleich mit Code. Dann versteht man gleich viel eher was du meinst.
    Zum Code: Auch wenn du es wie ein Array hingeschrieben hast, kann man C-Arrays nicht als Parameter an Funktionen übergeben. Was übergeben wird ist lediglich ein Poitner auf das erste Element, du hättest also genausogut char server_name(char* server_name_variable) schreiben können. Was du zurückgibst ist eine Kopie des char auf den der Pointer zeigt (falls du ein Array übergibst also eine Kopie des ersten Elements).

    Hier die Definierung außerhalb der Klasse:

    (Dieser char wird als Parameter bergeben)
    	char *p_server_name;
    	p_server_name=new char[20];
    	GetWindowText(hServer, p_server_name, 20);
    
    (Hier passiert dat)
    viewer.server_name(p_server_name);
    

    Die "Definierung" heißt auf deutsch Definition, aber das nur am Rande. Hier passiert folgendes: du legst ein dynamisches char-Array der Länge 20 an, lässt dir von der getWindowText-Funktion was hineinschreiben und übergibst es dann an viewer.server_name. Wie bereits oben gesagt gibt die Methode den ersten char aus dem Array zurück (genauer: eine Kopie davon). Da du das Ergebnis des Methodenaufrufs allerdings keiner variablen zuweist, wird diese Kopie nirgendsgespeichert und ist unwiederbringlich verloren.

    Soweit so gut, ich hoffe das wurde verstanden =). So, wie ihr seht wurde der Parameter neu definiert.

    Nein, hier wurde kein Parameter neu definiert. Es wurde ein Pointer definiert, und der wurde als Argument der Funktion übergeben. (ein Beispiel für deine ungenaue/falsche Ausdrucksweise die oben schon bemängelt wurde)

    Und genau diesen Parameter möchte ich jetzt wiederrum in einer anderen Klasse verwenden...wie gehe ich da vor? Wie rufe ich die Methode nun mit dem zuvor definierten Wert auf?

    Den Parameter kannst du nicht übergeben, der Parameter existiert nur innerhalb des Methodenaufrufs, also zwischen den geschweiften Klammern von Viewer::server_name(). Falls du p_server_name meinst, das ist eine Variable. Vielleicht meinst du auch den Rückgabewert der Methode, den müsstest du direkt beim Methodenaufruf einer weiteren Variable zuweisen, um weiterhin damit arbeiten zu können, also z.B.

    char Ergebnis = viewer.server_name(p_server_name);
    

    Wie du siehst hast du wohl etwas "Parameter" genannt was keiner ist - keiner kann wissen was du wirklich meinst.

    1. Möglichkeit:

    p_viewer->buffer_user(p_server_name);
    

    2. Möglichkeit:

    p_viewer->buffer_user(char server_name_variable[20]);
    

    Die erste Möglichkeit würde kompilieren und du würdest damit die selbe Variable p_server_name der Methode buffer_user als Argument übergeben, die du vorher der methode server_name übergeben hast. Wenn es das ist was du möchtest.

    Ein wenig Nachhilfe in Terminologie:
    Ein Parameter ist eine spezielle Variable, die bei der Funktionsdefinition in der Parameterliste definiert wird. Parameter haben als Gültigkeitsbereich den Funktionsblock. Man unterscheidet zwischen Referenzparametern und Wertparametern, letztere werden beim Verlassen der Funktion zerstört, während bei Referenzen lediglich der Name der Referenz ungültig wird, das Objekt an das die Referenz gebunden wurde existiert weiterhin.
    Ein Argument ist das, was einer Funktion bei ihrem Aufruf übergeben wird, also z.B. deine Variable p_server_name. Bei call-by-reference wird der Referenz-Parameter an das übergebene Objekt gebunden, bei call-by-value wird der Wert-Parameter mit dem übergebenen Objekt initialisiert.
    Die Definition (nicht Definierung!) einer Variablen ist die Stelle, wo im auszuführenden Code ihr Typ und ihr Name angegeben wird, also z.B. dein char *p_server_name; Parameter werden ausschließlich in Funktonsköpfen (bzw. Methodenköpfen) definiert.
    Was eine Funktion ist weißt du ja schon, Methoden sind Funktionen, die Teil einer Klasse sind. Die anderen Funktionen nennt man auch freie Funktionen.

    Ich hoffe das hilft dir, in Zukunft deine Fragen etwas verständlicher zu stellen 😉


  • Administrator

    Steve Ballmer schrieb:

    Jetzt mag mich keiner mehr oder? Wusste ich doch, Windows mag schliesslich auch keiner...

    Genau, wir hassen dich ...

    Aber weil es lustig sein könnte, meinst du das folgende?

    void first_function(char* array)
    {
    }
    
    void second_function(char* array)
    {
    }
    
    int main()
    {
      char array[20];
    
      first_function(array);
      second_function(array); // Array an eine zweite Funktion übergeben.
    
      return 0;
    }
    

    Im übrigen rate ich von einem C-Array ab. Nimm lieber einen std::vector.

    Grüssli



  • Steve Ballmer schrieb:

    Sry wenn ich jetzt mit einem Schlag ins Gesicht antworte, aber was ist so schwer daran? Eine kurze Antwort auf meine Frage hätte gereicht, dann wäre die Sache schon gegessen gewesen.
    ...

    Steve Ballmer schrieb:

    Jetzt mag mich keiner mehr oder? Wusste ich doch, Windows mag schliesslich auch keiner...

    🤣 🤣 🤣 🤣 🤣 🤡 🤡 🤡

    Robert Lembke schrieb:

    'Verstand' ist die am gerechtesten verteilte Ressource der Welt: Jeder meint, er habe genug davon ... und dabei noch ein kleines bischen mehr als alle Anderen.

    Meine Arbeitskollegin schrieb:

    Die Dummen haben's nicht schwer. Sie wissen ja nicht, dass sie dumm sind.

    Gruß,

    Simon2.



  • @Simon
    Ganz genau, aber wie soll man einem Dummen auch klar machen das er Dumm ist?


Anmelden zum Antworten