While(true) Endlosschleifen
-
Pille456 schrieb:
Damn immer diese Windows Funktionen, hab ich ja eigentlich was gegen

unix oder unix-clone?
--> http://oss.sgi.com/projects/fam/faq.html

-

Muss aber leider aufm Windowsrechner laufen
Naja ich such mal rum, vielleicht finde ich einen für mich passenden Weg-Danke für die Anregungen!!Mal so nebenbei:
gibt es einen einfachen Weg die Anzahl der Zeichen in einem Array zu ermitteln?
Beispiel:char string1[255]; std :: cin >> string1; //Frage: Wie viel Zeichen hat der User nun eingegeben? ein \0 Tag erscheint bei dieser Form ja nicht am Ende des Arrays oder?Und warum kann ich nicht einfach einen pointer auf char zum Einlesen definieren?
also:char *string1; std :: cin >> string1; //Compiliert wird es, aber beim Eingeben und Enterdrücken kommt immer ne ErrormeldungIch denke mal es liegt daran, dass der Compiler nicht weiss wie viele Zeichen er zu erwarten hat oder?
Dankööö
-
warum nimmst du nicht
std::string name; std::cin >> name; int groesse = name.size();char-Arrays / CStrings sind nicht die Technik, die in C++ verwendet wird
-
Weil ich kein <iostream> eingebunden habe und das nicht noch zusätzlich einbinden möchte
-
Erstens: Ich glaube kaum, daß du std::cin ohne die <iostream> ansprechen kannst.
Zweitens: char* ist unsicher, char* ist unhandlich, char* ist einfach nur ein Relikt, das aus C-Zeiten übernommen wurde. Wenn du keine sehr guten Gründe (und "weil ich das nicht einbinden möchte" ist ein lausiger Grund) hast, es verwenden zu müssen, bleib' lieber bei std::string.
-
Hehe, mir ist schon klar dass ich std :: cin >> nicht ohne <iostream> habe,aber die Codeschniplse sind ja nur für ein Programm zum testen und in gerade diesem Programm ist keine <iostream> eingebunden.
Wenn ich <iostream> dann einbinde hab ich, bis auf ein oder zwei gebrauchte Funktionen viel zu viele Header verwendet (finde ich).
Daher würd ich gerne wissen wie die Funktion string.size() denn die Größe des Arrays ermittelt?
Und warum ist char* unsicher? Unhandlich ja, aber ich versuch das ganze mit so wenigen Headern wie nur möglich zu Programmieren.
(Ja ich weiss, dass ich die Funktion auch einfach aus dem Header kopieren und einfügen könnte)
-
Pille456 schrieb:
Daher würd ich gerne wissen wie die Funktion string.size() denn die Größe des Arrays ermittelt?
Die String-Klasse besteht im wesentlichen aus einem char* (der auf die eigentliche Zeichenkette zeigt), einem int-Wert für die Größe und einem ganzen Paket Hilfsfunktionen, die genau auf diese Daten abgestimmt arbeiten - da braucht die Methode size() nur noch den Größenwert auslesen und gut ist. (und Funktionen wie string::push_pack() oder op>> kümmern sich selbst dafür, daß sie genug Speicher für ihre Daten anfordern).
Und warum ist char* unsicher?
Weil niemand kontrollieren kann, wieviel Speicherplatz hinter diesem Zeiger tatsächlich zur Verfügung steht - und die Standardbibliothek überlässt dir die Verantwortung, genug Platz zu reservieren (dein Code
char*str;cin>>str;schreibt die nächste Eingabe irgendwohin in den Speicher).aber ich versuch das ganze mit so wenigen Headern wie nur möglich zu Programmieren.
Wie gesagt ist das eine miserable Begründung, warum man eine Bibliothek nicht nutzen will. Wenn du nicht gerade vorhast, die Arbeitsweise von std::string von Hand nachzubauen, verwende die Klasse lieber so, wie sie vorliegt.
-
CStoll schrieb:
Wie gesagt ist das eine miserable Begründung, warum man eine Bibliothek nicht nutzen will. Wenn du nicht gerade vorhast, die Arbeitsweise von std::string von Hand nachzubauen, verwende die Klasse lieber so, wie sie vorliegt.
Ok da hast du ganz recht, wie ich finde. Ich will auch nicht die Arbeitsweise nachprogrammieren, ich will sie nur verstehen. Und ist es nicht einer der Stärken von C++ recht dynamisch im Umgang mit den Headers zu sein? Delphi bindet automatisch vieles mit ein, was das Programm recht groß von Anfang werden lässt, bei C++ hat man da mehr Überwachung oder?
Zudem finde ich mal sollte schon so vorgehen wie die Programmiere damals, als die Rechner noch nicht so gut waren wie heute und nicht einfach alles Mögliche wegen der Bequemlichkeit einbinden.
Man sollte zwar abwähgen, ob es sich nun lohnt oder nicht, aber man kann doch auch vieles selber schreiben oder?
Vielleicht ist in meinem Beispiel nicht sehr komfortable auf die <iostream> zu verzichten, das sehe ich ja ein, aber ich kann mich doch mal nach alternativen umschauen oder?
-
*grübel* ich sehe immer noch nicht, was die String-Verarbeitung mit der <iostream> zu tun haben soll.
Ansonsten: Klar kannst du auch jedes Zeichen einzeln per fgetc() einlesen, überprüfen und in ein (zur Not mitwachsendes) char-Array füllen. Dann hast du natürlich auch kein Problem, dabei nebenher deren Anzahl fetszustellen.
(das ist vereinfacht die Art, wie ein std::string eingelesen wird)
Aber das zu machen, trägt imho nicht wirklich zur praktischen Anwendbarkeit bei - wenn ich programmiere, kümmere ich mich lieber um "höherwertige" Probleme und überlasse solche Kleinigkeiten wie die Eingabe oder Speicherverwaltung der Standard-Bibliothek.PS: Der operator>> für char* geht einfach davon aus, daß er "genug" Speicher hat, und schreibt alle ankommenden Zeichen in diesen Speicherbereich, gefolgt von einer \0 (die aus C bekannte Stringendemarke - wenn du die findest, hast du das Ende des Strings und damit auch seine Länge). Im Gegensatz zur std::string-Version reserviert er aber keinen neuen Speicher, wenn er keinen Platz mehr hat (noch schlimmer - er kann nicht einmal feststellen, ob der Platz reicht), sondern schreibt einfach weiter in Speicherbereiche, die dir nicht gehören.
-
Hmm, die String-Verarbeitung durch
std :: strlenoder
std :: string A; a.size();kennt der Compiler (DEvC++) nur wenn iostream vorhanden ist.
Aber mit fget() ist das ganze z.B. auch eine nicht schlechte Idee (brauch ich da aber nich wieder die <iostream> oder <stdio.h> für?)
Also ich habe das ganze jetzt wie folgt gelöst:... char string1[255]; char string2[255]; for (int i= 0;i<=255;i++) { string1[i] = '\0'; string2[i] = '\0'; } ...Muss nur noch irgendwie schauen, dass der User nicht zu viel eingibt bzw. ist ja ehr sein Problem wenn ich schreibe maximal 255Zeichen oder so.
Zu den "höheren Problemen":
klar benutzt man für schwere Problem die Standardbibliotheken um sich besser um diese Probleme etc. kümmern zu können. Doch versuche ich gerade sozusagen einen eignen Header zu schreiben, der entsprechende Funktionen die man mal brauchen könnte beinhaltet.Ich bin, im Gegensatz(nach deinen Post zu Urteilen) zu dir noch am Anfang meiner C++ "Karriere" und muss erst noch viele für mich klar machen und verstehen. Das tut man ja bekanntlich wenn man es selber macht oder sich intensiv damit beschäftigt.
-
Pille456 schrieb:
Zudem finde ich mal sollte schon so vorgehen wie die Programmiere damals, als die Rechner noch nicht so gut waren wie heute und nicht einfach alles Mögliche wegen der Bequemlichkeit einbinden.
Es programmiert doch nicht jeder für einen PC. <string> würde ich auch auf einem 1 MHz Rechner benutzen. Die standard lib ist ja nicht für den Einsatz auf einem PC entwickelt sondern auf beliebigen Plattformen.
-
Nur zur Klarstellung: strlen liegt in der <cstring> bzw. <string.h>, std::string in der <string> - es kann durchaus sein, daß diese beiden Header von <iostream> verwendet werden (aber offiziell enthält DER Header die Stream-Objekte cin, cout und Kollegen).
Und ganz ohne Fremd-Bibliotheken wirst du nicht auskommen (es sei denn du sprichst den Festplattencontroller direkt an - und das ist bestimmt nichts für einen C++ Einsteiger).
-
Okay...dann hab ich wohl einen anderen <iostream>-Header.
Ist der Normale von C++, mal sehen was ich da so finde o.O
Okay, die haben da folgende drei HEader eingebunden:
#include <bits/c++config.h> --> #include <bits/os_defines.h>
#include <ostream> --> #include <ios>;#include <bits/ostream.tcc>
#include <istream> --> #incldue <ios>; #include <limits>;# include <bits/istream.tcc>
"-->" bedeute,wie man sich eigentlich denken kann, in dem Header ist wiedrum der ein ander eingebunden usw...Warum hab ich denn keinen Standardheader, ist das der Standardheader, wenn nein wo bekomm ich einen her?^^
-
Hallo
Pille456 schrieb:
Zudem finde ich mal sollte schon so vorgehen wie die Programmiere damals, als die Rechner noch nicht so gut waren wie heute und nicht einfach alles Mögliche wegen der Bequemlichkeit einbinden.
Solche Aussagen kapiere ich einfach nicht. Du schnallst dich im Auto doch auch, obwohl es früher noch keine Gurte gab. Die Frage sollte doch viel eher lauten, warum sollte ich nicht Hilfsmittel benutzen, die mir das Programmieren erleichtern und mich vor allem auf die wesentlichen Dinge konzentrieren lassen.
chrische
-
Das einbinden von <string> verbraucht zwahr wohl mehr RAM als eine selbstgebaute Möglichkeit, die nur die von dir verwendeten Funktionen unterstützt, aber std::string ist weit optimiert, sodass du warscheinlich für deine Lösung deutlich mehr CPU brauchst
-
Pille456 schrieb:
Okay...dann hab ich wohl einen anderen <iostream>-Header.
Ist der Normale von C++, mal sehen was ich da so finde o.O<istream> und <ostream> sind normale Standardheader von C++ (für die Stream-Klassen), die ganzen <bit\...> Header dürften die Implementationsdetails der Klassen darstellen.
Ansonsten: Der Standard gibt nur vor, welche Header welche Definitionen enthalten sollten. Wenn du eine Funktion erreichen kannst, ohne den passenden Header zu nutzen, ist das zwar nett, aber i.a. nicht portabel (und ich kann mir durchaus vorstellen, daß die IO-Streams intern wieder mit char-Arrays oder strings arbeiten und dazu auch die Funktionen der Standard-Bibliothek verwenden).
-
Pille456 - nichts spricht dagegen, das du zum Lernen etwas selbst programmieren willst - nur so lernt man. Gute Tip's schaden aber nicht, sie helfen dir Zeit sparen und deinen Horizont zu erweitern!
@Pille456 schrieb:
Also ich habe das ganze jetzt wie folgt gelöst:char string1[255]; char string2[255]; for (int i= 0;i<=255;i++) { string1[i] = '\0'; string2[i] = '\0'; }Ich würde das obige z.B. so schreiben:
char string1[255] = {0,}; char string2[255] = {0,};keine for-Schleife nötig - alle 255 Chars auf 0.
-
Muha, okay danke das ist besser

Naja zu den Headerdateien: Ich denke das ist im gewissen Sinne schon eine Streitfrage, da jeder andere Vorlieben hat bzw. anders an Probleme hernageht.