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.
-
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.
-
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.