c-Funktion mit in C++ integrieren



  • Hallöchen,

    Ich hab in C eine Funktion geschrieben und will sie jetzt auch in C++ einsetzen.
    Quelltext (Stringeingabe.h):

    #include <stdio.h>
    #include <stdlib.h>
    #ifndef STRINGEINGABE_H
    #define STRINGEINGABE_H
    extern "C" 
    {
    	char *stringeingabe();
    }
    #endif
    

    Quelltext (Stringeingabe.c):

    #include "Stringeingabe.h"
    
    char *stringeingabe()
    {
    	char *s=malloc(1);
    	char c;
    	unsigned long long l=0;
    
    	if(!s==0)
    	{
    		do
    		{
    			c=(char)getchar();
    			if(c=='\n')
    			{
    				s[l]='\0';
    				return s;
    			}
    
    			s[l]=c;
    			s=realloc(s, l+1);
    			if(s==0) exit(EXIT_FAILURE);
    			else l++;
    
    		}
    		while(1);
    	}
    
    	return s;
    }
    

    Quelltext (test.cpp):

    #include <iostream>
    #include "Stringeingabe.h"
    
    using namespace std;
    
    main()
    {
    	char *eingabe=0;
    
    	cout << "Geben Sie eine Zeichenkette ein: ";
    	eingabe=stringeingabe();
    	cout << "Ihre Zeichenkette lautet: " << eingabe << endl;
    }
    

    Und beim compilieren gibts folgende Fehlermeldung:

    In function `main':
    test.cpp:(.text+0x26): undefined reference to `stringeingabe()'
    collect2: ld returned 1 exit status
    

    Gibt es da noch ne Möglichkeit?

    Danke schon mal.



  • Wieso kennzeichnest du sie überhaupt als C-Funktion? IMO kann man die alten Befehle mit den entsprechenden Bibliotheken einfach in den laufenden C++ Code einfügen und es geht. Habs mal mit ganz einfachen Befehlen getestet....



  • Wieso schreibst du überhaupt eine eigene C-Funktion dafür? Verwende doch lieber std::string und std::getline().



  • Bibliotheken werden in der Stringeingabe.h eingebunden und dann gibt es halt Sachen, die der C++-Compiler von C nicht erlaubt.

    Trotzdem Danke.


  • Mod

    Ich sehe da drei Möglichkeiten:
    1. Du hast vergessen die Funktion dazu zu linken.
    2. Der Objektcode zu der Funktion war doch mit einem C++-Compiler übersetzt und nicht mit einem C-Compiler
    3. Du hast etwas anderes falsch gemacht 😃 . Zum Beispiel Tippfehler oder falsche Funktionssignatur.


  • Mod

    ugoessner schrieb:

    Bibliotheken werden in der Stringeingabe.h eingebunden

    Ich hoffe du glaubst nicht, dass die da schon gelinkt werden. Oder bindest du tatsächlich den Quelltext ein? Beides würde deinen Fehler erklären.



  • g++ test.cpp Stringeingabe.c
    Stringeingabe.c: In function ‘char* stringeingabe()’:
    Stringeingabe.c:5:18: error: invalid conversion from ‘void*’ to ‘char*’
    Stringeingabe.c:21:20: error: invalid conversion from ‘void*’ to ‘char*’

    mit zusätzlich eingebundenen 'stdio.h' und 'stdlib.h'.
    So schaut es jetzt im Terminal aus.



  • Du sagst doch selbst, dass in C einige Sachen erlaubt sind, die es nicht in C++ sind, z. B. die automatische Konvertierung von void* in char*. Trotzdem benutzt du einen C++-Compiler für die C-Datei.



  • Ich wollte mit Stringeingabefunktion auch in C++ arbeiten wie z.B. Klassen.
    In C kann ich keine Klassen proggen auch wenn es objectiveC gibt.
    Und so eine tolle Funktion bekomme ich viell. in C++ nicht hin.

    Gruß Uwe.



  • So eine "tolle" Funktion brauchst du in C++ auch nicht selber zu schreiben, dafür gibt es schon etwas vorgefertigtes:

    #include <string>
    #include <iostream>
    std::string stringeingabe()
    {
      std::string result;
      std::getline(std::cin,result);
      return result;
    }
    


  • Vielen lieben Dank.

    Hab es gerade selber ausprobiert std::string. einfach super.

    Wie lange gibt es so was schon?
    Ich habe vor längerer Zeit ungefähr vor 4 Jahren die Stringlib eingesetzt und nur Fehlermeldung gehabt. Deswegen hab ich mir jetzt in C ne Funktion gebastelt.

    PS: Gibt es bei getline() irgendwo Einschränkungen?

    Gruß Uwe.



  • Oh, schon recht lange. Mehr als 4 Jahre.
    Vielleicht möchtest Du
    http://www.cplusplus.com/reference/string/string/
    durchschauen und anlesen.



  • ugoessner schrieb:

    PS: Gibt es bei getline() irgendwo Einschränkungen?

    Ja, du kannst maximal std::numeric_limits<size_t>::max()-1 Zeichen damit einlesen (mehr passt nicht in einen std::string). Aber wer wirklich an dieses Limit kommt, hat ganz andere Probleme.



  • ugoessner schrieb:

    Ich hab in C eine Funktion geschrieben und will sie jetzt auch in C++ einsetzen.

    Nichts leichter als das.
    http://www.parashift.com/c++-faq-lite/mixing-c-and-cpp.html



  • Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.


Anmelden zum Antworten