Problem: Illegal Call of non static member funktion



  • es ist mir fast peinlich ...

    nun habe ich versucht eure Tips umzusetzen und stehe vor einem weiteren Problem:

    stdafx.h

    #pragma once
    
    #include <windows.h>
    #include <iostream>
    #include <string.h>
    #include <wininet.h>
    #include <vcclr.h>
    #include <stdlib.h>
    #include <process.h>
    
    #pragma comment(lib,"winmm.lib")
    #pragma comment (lib,"ws2_32.lib")
    #pragma comment (lib,"winInet.lib")
    #pragma comment ("System.dll")
    #pragma comment ("WinInet.dll")
    #pragma comment ("mapi32.dll")
    #pragma comment ("mscorlib.dll")
    #pragma comment ("kernel32.dll")
    
    // TODO: reference additional headers your program requires here
    //
    
    #include "eigeneFunktionen.h"
    

    eigeneFunktionen.h

    #pragma once
    
    #include "stdafx.h"
    #include "Form1.h"
    ...
    ...
    void start ( Form1^ form );
    

    Form1.h

    #include "stdafx.h"
    #include "eigeneFunktionen.h"
    ...
    ...
    ...
    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) 
    			 {				  
    			 start();
    			 }
    

    EigeneFunktionen.cpp

    ...
    ...
    
    void start (Form1^ form)
    {
    
    				 form->textbox1ändern ("textbox1ändern");
    
    				 lokaleIPfinden ();
    

    Jetzt erhalte ich folgenden Fehler:

    Error	6	error C3861: 'start': identifier not found	f:\ipsender\ipsender\Form1.h	239
    

    Soweit glaube ich das zu verstehen: Form1 wird "includiert" bevor die Funktion start() definiert ist ?! Versuche ich nun hier abhilfe zu schaffen, indem ich im Hauptprogramm erst eigeneFunktionen.h einfüge, und anschliessend die Form1 passiert folgendes:

    Error	6	error C2871: 'IPSender' : a namespace with this name does not exist	f:\ipsender\ipsender\eigeneFunktionen.h	8
    Error	7	error C2065: 'Form1' : undeclared identifier	f:\ipsender\ipsender\eigeneFunktionen.h	27
    Error	8	error C2065: 'form' : undeclared identifier	f:\ipsender\ipsender\eigeneFunktionen.h	27
    Error	9	error C2182: 'start' : illegal use of type 'void'	f:\ipsender\ipsender\eigeneFunktionen.h	27
    Error	10	fatal error C1903: unable to recover from previous error(s); stopping compilation	f:\ipsender\ipsender\eigeneFunktionen.h	27
    

    Mit meinen geringen Wissen auch nachzuvollziehen, da bspw. der Namespace IPSender ja noch nicht existiert.

    Wie würde ich hier sinnvoll weiter kommen?



  • theta schrieb:

    Dann könntest Du das so machen:

    void start (Form1^ form) 
    { 
       form->textbox1ändern ("textbox1ändern"); 
       ... 
       ... 
       ... 
    }
    
    // start(..) wird dann so aufgerufen:
    // this muss natürlich Form1^ sein.
    start(this);
    

    Könnte start() nicht auch gerade eine Methode von Form1 sein?

    Simon

    Habe es nun irgendwie geschafft das ganze auf folgende Fehlermeldung zu reduzieren:

    Error	1	error C2061: syntax error : identifier 'Form1'	c:\users\jens\desktop\downloads\c++ lernen\c++\projekte\ipsender\ipsender\eigeneFunktionen.h	34
    


  • #include "Form1.h"
    


  • Danke für den Tip. Nur habe ich die Form1 bereits in sämmtliche Sources eingefügt. Ich habe irgendwie das gefühl dass die Reihenfolge der Includes nicht stimmt. Aber hier habe ich bereits alle möglichen Varianten versucht.

    Es scheint als seien Form1.h und Funktionen.h einfach zu abhängig voneinander. Etwas mache ich grundsätzlich falsch.

    Schreibt man eigentlich sämmtliche Includes in die "stdafx.h" um soetwas zu vermeiden?



  • Könnte das Dein Problem lösen?

    http://www.rb-softarticle.com/Hauptprog.rar

    Du musst auch Form1.h in der Form2.cpp includen, nicht in der Form2.h...



  • Ein wenig hat mich das weitergebracht. Ich hatte einfach alles "wild" durcheinander gewürfelt - durch das ganze hin und her. Somit habe ich das schlimmste überwunden - dachte ich. Kompilieren lässt es sich nun ohne Fehler.

    Nur bin ich leider wieder - wie es scheint - einige Schritte rückwärts gegangen. Hänge nun wieder da - wo ich irgendwann einmal aufgehört habe. Bei dem verstehen von Instanzen.

    Das aufrufen der Start-Funktion als Event klappt nun ohne Probleme:

    private: System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) /* <-- Ab hier IP Senden */
    			 {				  
    				eigeneFunktionen^ funkinstanz = gcnew eigeneFunktionen();
    				funkinstanz->start();
    			 }
    

    Nur in der Start Funktion selber scheine ich immer noch den gleichen Fehler zu machen wie zuvor (neue Instanz von Form1):

    void eigeneFunktionen::start ()
    {
    				 Form1^ form = gcnew Form1();
                            form->textbox1ändern ("textbox1ändern");
    			            form->Show();
    
    				 //_beginthreadex(0, 0, &sound, 0, 0, &nThreadAddress);
    

    Nur will ich ja die bereits bestehende Instanz von Form1 nutzen. Den Voschlag von theta weiss ich leider nicht umzusetzen:

    void start (Form1^ form)
    {
       form->textbox1ändern ("textbox1ändern");
       ...
       ...
       ...
    }
    
    // start(..) wird dann so aufgerufen:
    // this muss natürlich Form1^ sein.
    start(this);
    


  • System::Void button1_Click(System::Object^  sender, System::EventArgs^  e) /* <-- Ab hier IP Senden */ 
    {                  
       eigeneFunktionen^ funkinstanz = gcnew eigeneFunktionen(); 
       funkinstanz->start(this); 
    }
    
    void eigeneFunktionen::start (Form1^ form)
    {
       form->textbox1ändern ("textbox1ändern");
    }
    

    Simon



  • Mensch Simon ... soweit hatte ich deinen Tip beim ersten mal schon verstanden. Nur hatte ich bereits da das Problem, dass der Bezeichner Form1 anschließend in der Funktionen.h nicht bekannt zu seien schien.

    Error	1	error C2061: syntax error : identifier 'Form1'	c:\users\jens\desktop\downloads\c++ lernen\c++\projekte\ipsender\ipsender\eigeneFunktionen.h	26
    

    Wie soll denn der Prototyp von Start aussehen? Momentan sieht er bei mir auch so aus - was mir aber nicht richtig erscheint:

    void start (Form1^ form);
    

    Hierbei dann folgender Fehler im Event der Form1:

    Error	2	error C2660: 'IPSender::eigeneFunktionen::start' : function does not take 1 arguments
    

    Ich übergebe doch - durch deinen Code - aus dem Event der Form1 den this-Zeiger an die Funktion Start - oder nicht? Verwende ich im Prototypen als Parameter "this" bekomme ich diese Meldung:

    Error	1	error C2059: syntax error : 'this'
    


  • Aber das Problem von Post 1 ist doch gelöst, oder nicht?
    Kannst Du mal das Projekt zugänglich machen? Ich kann den Code IMHO nicht mehr nachvollziehen!



  • Ja, das Haupt-Problem ist gelöst. Keine gute Idee hier noch anzusetzen. Werde nen neuen Thread eröffnen wenns OK ist.


Anmelden zum Antworten