C-Routinen von Windows nach GNU/Linux
-
Hallo!
ich hätte da ein Problem. Ich habe mir folgende Funktionen erstellt, um
besser mit Zeichenketten zu arbeiten. LTrim, RTrim wie in VB, substr wie in Perl/PHP und strpos wie in PHP.
Kompiliere ich das unter Visual C++, klappt alles einwandfrei. Unter Linux mit dem GNU C/C++ Compiler läuft es nicht. Da kriege ich viele Fehler.Vielleicht kann ja jemand mir einen Tip geben, wie ich den Code auf Linux portiere.
Schöne Grüße
DannyPS: Wer gefallen an dem Code hat, kann ihn gerne benutzen. No Problem.
#include <string> #include <stdio.h> int strlen(char string[]); char* substr(const char *input, int begin, int end); int strpos(char *string, char *search); char* ltrim(char* string); char* rtrim(char* string); void main() { char *string; char *string2; char *string3; int len; int posfound; string = "Display 'Hallo Welt' At Line 5 Column 5."; string3 = " Spaced Text! "; len = strlen(string); string2 = substr(string,0,6); posfound = strpos(string,"At"); string3 = ltrim(string3); string3 = rtrim(string3); printf("Der String sieht so aus => "); printf("%s\n\n",string); printf("Die String-Länge ist:%d\n\n",len); printf("Der Substring ist => %s\n\n",string2); printf("Der Suchtext 'At' wurde gefunden ab Pos. => %d\n\n",posfound); printf("%s, Ende.\n",string3); } int strlen(char string[]) { int y = 0; for(int x = 0; x < string[y]; x++) { y++; } return y; } char* substr(const char *input, int begin, int end) { if (begin > strlen(input) || end > strlen(input)) exit(1); char *output; int difference, i; for (i = 1; i++ < begin; *input++); end >= begin ? difference = end - begin : difference = begin - end; output = new char[difference]; memset(output, 0, strlen(output)); for (i = 0; i <= difference; i++) end >= begin ? output[i] = *input++ : output[i] = *input--; return output; } int strpos(char *string, char *search) { int stlen=strlen(string); int srlen=strlen(search); int lcv=0; int sublcv=0; int start=-1; if(srlen>stlen) return(-2); for(lcv=0;lcv<=(stlen-srlen);lcv++) { if(string[lcv]==search[sublcv]) { while(sublcv<=srlen) { if(search[sublcv]==string[sublcv+lcv]) sublcv++; else sublcv=srlen+1; if(sublcv==srlen) { start=lcv; lcv=(stlen-srlen)+1; } } } sublcv=0; } return(start); } char* ltrim(char* string) { if (string) { while (isspace(*string)) string++; } return string; } char* rtrim(char* string) { int i; if(string) { i = strlen(string); while ((--i)>0 && isspace(string[i]) ) string[i]=0; } return string; }
-
die fehlermeldungen waeren hilfreich gewesen. aber trotzdem kann ich dir glaube helfen ;). du benutzt veralteten code. so einfach ist das. ich versuch den code dem standardkonform zu machen, ist aber keine garantie, dass er dann fehlerfrei kompiliert wird:
#include <cstring> #include <cstdio> // die neuen header haben kein .h mehr am schluss, dafuer aber ein c vorne dran int strlen(char string[]); // strlen gibt es doch schon? char* substr(const char *input, int begin, int end); int strpos(char *string, char *search); char* ltrim(char* string); char* rtrim(char* string); int main() { // void main ist falsch; main gibt ein int zurueck char *string; char *string2; char *string3; int len; int posfound; string = "Display 'Hallo Welt' At Line 5 Column 5."; // denkst du nicht auch, du solltest zuerst speicher dafuer allokiieren ? ;) string3 = " Spaced Text! "; // das selbe wie oben len = strlen(string); string2 = substr(string,0,6); posfound = strpos(string,"At"); string3 = ltrim(string3); string3 = rtrim(string3); printf("Der String sieht so aus => "); printf("%s\n\n",string); printf("Die String-Länge ist:%d\n\n",len); printf("Der Substring ist => %s\n\n",string2); printf("Der Suchtext 'At' wurde gefunden ab Pos. => %d\n\n",posfound); printf("%s, Ende.\n",string3); } int strlen(char string[]) { // eine redefintion von strlen; muesste eine fehlermeldung geben int y = 0; for(int x = 0; x < string[y]; x++) { y++; } return y; } char* substr(const char *input, int begin, int end) { if (begin > strlen(input) || end > strlen(input)) exit(1); char *output; int difference, i; for (i = 1; i++ < begin; *input++); end >= begin ? difference = end - begin : difference = begin - end; output = new char[difference]; memset(output, 0, strlen(output)); for (i = 0; i <= difference; i++) end >= begin ? output[i] = *input++ : output[i] = *input--; return output; } int strpos(char *string, char *search) { int stlen=strlen(string); int srlen=strlen(search); int lcv=0; int sublcv=0; int start=-1; if(srlen>stlen) return(-2); for(lcv=0;lcv<=(stlen-srlen);lcv++) { if(string[lcv]==search[sublcv]) { while(sublcv<=srlen) { if(search[sublcv]==string[sublcv+lcv]) sublcv++; else sublcv=srlen+1; if(sublcv==srlen) { start=lcv; lcv=(stlen-srlen)+1; } } } sublcv=0; } return(start); } char* ltrim(char* string) { if (string) { while (isspace(*string)) string++; } return string; } char* rtrim(char* string) { int i; if(string) { i = strlen(string); while ((--i)>0 && isspace(string[i]) ) string[i]=0; } return string; }
hab den code nur ueberflogen, koennte immer noch nichtstandardkonforme ausdruecke enthalten.
was auch immer
-
versuch mal, den code als .c und nicht als .cpp zu compilieren. vielleicht sieht's dann besser aus.
-
Hallo,
erstmal vielen Dank für eure Infos. Wie ihr sicherlich gemerkt habt, bin ich nicht der hellste in Sachen C.
Leider läuft der Code unter Gnu/Linux immer noch nicht. Wird aber sicherlich irgendwann mal so sein.
Ich habe mal die Fehlermeldungen des GNU/C Compilers kopiert:
Dies sind die Fehlermeldungen, nach den Änderungen von "was auch immer".
test2.cpp: In function
char* substr(const char*, int, int)': test2.cpp:52:
exit' undeclared (first use this function)
test2.cpp:52: (Each undeclared identifier is reported only once for each
function it appears in.)
test2.cpp: In functionchar* ltrim(char*)': test2.cpp:95:
isspace' undeclared (first use this function)
test2.cpp:107:2: warning: no newline at end of fileDies sind die Fehlermeldungen meines Original-Skripts.
test.c:1:18: string: Datei oder Verzeichnis nicht gefunden
test.c:5: warning: conflicting types for built-in functionstrlen' test.c: In function
main':
test.c:12: warning: return type of `main' is not `int'
test.c: In functionstrlen': test.c:40:
for' loop initial declaration used outside C99 mode
test.c: In functionsubstr': test.c:49: warning: passing arg 1 of
strlen' discards qualifiers from pointer target type
test.c:49: warning: passing arg 1 ofstrlen' discards qualifiers from pointer target type test.c:54: invalid lvalue in assignment test.c:55:
new' undeclared (first use in this function)
test.c:55: (Each undeclared identifier is reported only once
test.c:55: for each function it appears in.)
test.c:55: parse error before "char"
test.c:58: invalid lvalue in assignment
test.c:105:2: warning: no newline at end of fileVielleicht hat ja jemand noch Lust, mal nachzuschauen.
Erstmal Danke und schöne Grüße
Dannyc
-
dannyc schrieb:
test2.cpp: In function
char* substr(const char*, int, int)': test2.cpp:52:
exit' undeclared (first use this function)verschwindet mit:
#include <stdlib.h>
oder
#include <cstdlib>dannyc schrieb:
test2.cpp: In function
char* ltrim(char*)': test2.cpp:95:
isspace' undeclared (first use this function)verschwindet mit:
#include <ctype.h>dannyc schrieb:
test2.cpp:107:2: warning: no newline at end of file
blödsinnigste gcc-warning die es gibt. geh ans ende deines sourcecodes und drücke einfach <enter>. weg ist es.
-
net schrieb:
dannyc schrieb:
test2.cpp:107:2: warning: no newline at end of file
blödsinnigste gcc-warning die es gibt. geh ans ende deines sourcecodes und drücke einfach <enter>. weg ist es.
wird das nicht vom C++ Standard so gefordert? Naja, eine gute IDE könnte, einfach immer ein \n an Code Dateien hängen
-
kingruedi schrieb:
wird das nicht vom C++ Standard so gefordert?
wenn ja, dann haben die verfasser aber vorher ein paar tüten geraucht
-
Hallo!
nochmals vielen Dank für eure Hilfe. Ich bin leider noch nicht dazu gekommen, euch was zu schreiben. A little Bit Stress.
Hab jetzt mal alle Änderungen gemacht und den ganzen Kram nochmals durch den GNU-Compiler gejagt. Was soll ich sagen. Die Fehlermeldungen werden immer weniger!
Ich hab die aktuellen Meldungen nochmal mitgebracht.
/tmp/ccKwKgol.o: In function
substr(char const*, int, int)': /tmp/ccKwKgol.o(.text+0x171): undefined reference to
operator new[](unsigned)'
/tmp/ccKwKgol.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit statusMal ehrlich, ich finde das ziemlich "idiotisch", das man am Ende des Codes einen Return einfügen muss. Was hat das für einen sinnvollen Zweck? Wahrscheinlich wollten die Verfasser von C++ unbedingt noch eine Fehlermeldung unterbringen. Auf Teufel komm raus. Naja, muss man halt mit leben.
Würde mich freuen, nochmals von euch zu hören.
Schöne, sonnige Grüße
Dannyc
-
Linker mit g++ aufrufen, nicht gcc.
-
Hallo!
Ich habs jetzt mit g++ kompiliert und es hat geklappt. Er speichert mir jetzt eine Datei a.out. Linux zeigt diese als "Ausführbare Datei" an. Wenn ich jedoch in der Konsole a.out angebe, kriege ich die Meldung "Befehl nicht gefunden". Benenne ich das Ding um, in bspw: programm od. test dann klappt es auch nicht. Normalerweise muss ich doch die Textausgaben auf den Schirm sehen, oder?
Vielleicht weiss ja einer Rat.
Schöne Grüße
Dannyc
-
./a.out oder ./programm
-
Hallo!
Wenn ich mein Programm jetzt mit bspw. ./a.out aufrufe, dann erhalte ich folgende Meldung "SPEICHERZUGRIFFSFEHLER". Warum? Was kann ich dagegen tun?
Schöne Grüße
Dannyc
-
Das heißt, daß du igendwo in deinem Programm auf Speicher zugreifst, der dir nicht gehört (z.B. über die Array-Grenzen hinaus o.ä.). Du könntest mal mit dem Debugger durch das Programm gehen und den Fehler suchen.
-
RTFM / RTFF.
. ist nicht im Pfad, daher ./a.out
-
Ringding schrieb:
RTFM / RTFF.
. ist nicht im Pfad, daher ./a.out
Bitte? Leider habe ich deine Aussage nicht so ganz verstanden! RTFM??!?!?!??!?!?
-
Das heißt: Read The Fucking Manual / Read The Fucking FAQ
(aber die eigentliche Frage war ja schon beantwortet)
-
fubar schrieb:
Das heißt: Read The Fucking Manual / Read The Fucking FAQ
(aber die eigentliche Frage war ja schon beantwortet)
Wieder was neues gelernt! Danke!
-
net schrieb:
kingruedi schrieb:
wird das nicht vom C++ Standard so gefordert?
wenn ja, dann haben die verfasser aber vorher ein paar tüten geraucht
... ich würde einfach sagen, dass jede gültige Textdatei zumindest unter Unix auf einen Zeilenumbruch endet. Dadurch wird auch keine neue Zeile begonnen, sondern nur die angefangene abgeschlossen. Ist (zumindest unter Unix) so üblich.
Zum Testen: Mit einem Texteditor unter Unix eine Textdatei erstellen, die nur eine Zeile enthält mit dem Inhalt "foobar" und als foobar.txt speichern. "cat foobar.txt|hexdump" wird dir den Zeilenumbruch dann zeigen.
-
fubar schrieb:
Das heißt: Read The Fucking Manual / Read The Fucking FAQ
(aber die eigentliche Frage war ja schon beantwortet)
öhm, Fucking bitte durch Fine ersetzen