Zum Inhalt springen

Orffi

Mitglieder
  • Gesamte Inhalte

    252
  • Benutzer seit

  • Letzter Besuch

Beiträge von Orffi

  1. Windows zum Beispiel ist ein Multitasking Betriebssystem. Das bedeutet, daß mehrere Programme "gleichzeitig" laufen können. Jedes Programm ist ein Prozeß. Da man normalerweise aber nur einen Prozessor zur Verfügung hat, kann nur ein Prozeß die Ressource Prozessor benutzen. Unter Multitasking Betriebssystemen findet also ständig ein Wechsel der Prozesse statt. Das hat weitreichende Konsequenzen, weil zum Beispiel die Register der CPU und der Gleichen mehr gesichert werden müssen, damit man sie später, wenn der Prozeß wieder CPU-Zeit bekommt, wieder zur Verfügung hat und die Situation die Gleiche ist wie vor der Unterbrechung.

    Ein Thread ist der "kleine Bruder" eines Prozesses, er wird deswegen auch leichter Prozeß genannt. Ein Thread gehört immer zu genau einem Prozeß aber ein Prozeß kann mehrere Threads haben. Hier ist das Probem ähnlich. Hier müssen auch ein paar Daten gesichert werden, bevor innerhalb des Prozesses ein anderer Thread zum Zuge kommt. Allerdings ist ein Threadwechsel schneller, da nicht so viele Daten gesichert werden müssen. Aber es kostet halt Zeit.

    HTH

    Jan

    PS: Oh, da seid ihr ja alle schneller als ich gewesen...

    @Woodstock: Das tut mir leid, ich hatte jetzt gar nicht auf der Rechnung, daß die Beiträge auch Threads sind. Die meinte ich aber nicht.

  2. "Und sorry wenn ich nicht weiß ob es in C/C++ so einen 'Befehl' gibt." Was soll das denn? Habe ich irgendetwas dazu gesagt, daß man irgendetwas wissen müßte? Ich glaube es ist normal wenn man etwas nicht weiß. Ich habe mit dem ersten Posting nur erklären wollen, daß man Header-Dateien nicht einfach austauschen kann. Mit meinem zweiten Posting wollte ich Dich keineswegs angreifen und habe dies auch gleich in den ersten Satz hineingeschrieben. Ein Threadwechsel ist auch nicht kostenlos, er kostet Zeit und das bedeutet, daß Deine Suche noch länger dauert. Das meinte ich mit verschwenden. Wenn Du Dich angegriffen fühst, dann tut es mir leid, ich kann nur nochmal sagen, daß dies nicht meine Absicht war.

    Jan

  3. Ich habe keine Ahnung worum es in diesem Programm geht, deswegen bitte das Folgende nicht als Angriff ansehen. Vielleicht geht es ja nicht anders.

    Wenn ich mich aber 4 Minuten in einer Schleife (ich habe es jetzt so verstanden, daß Du etwas suchst), dann würde ich meine CPU-Zeit nicht damit "verschwenden", eine Schrift zum Blinken zu bringen. Ich würde vielmehr schauen, ob es nicht Möglichkeiten gibt, die Suche zu beschleunigen.

    Persönlich finde ich es schon ein wenig heftig einen Thread zu starten, um Text zum Blinken zu bringen. Vielmehr würde ich schauen, ob ich nicht einen Interrupt finde, den man dafür benutzen könnte. Will meinen: Ich würde mich in eine Interruptbehandlung einklinken.

    Jan

  4. Keine Sorge, ich werde nicht schießen. Ich möchte nur darauf hinweisen, daß ich in meinem Ursprungsposting erwähnt habe, daß es auch Systeme geben mag, die nur void main (void) anbieten. Es ist ja nichts so, daß ich von einem anderen Stern komme und nicht weiß daß es Gründe für void main (void) gibt. Ich wollte nur, daß sich jeder bewußt ist, wann er standardkonform ist und wann nicht. Es mag (gute) Gründe geben, warum man sich nicht an den Standard hält, aber diese Entscheidung sollte meiner Meinung ganz bewußt getroffen werden.

    Jan

  5. conio.h gehört nicht zum Standard und deswegen kocht da jeder Hersteller sein eigenes Süppchen. (Da kann man mal sehen, wie nützlich es ist einen Standard zu haben. Oder man ärgert sich jetzt darüber, daß der Standard keine schönen Textausgaben vorgesehen hat.) Natürlich kann man die Header-Dateien nicht austauchen. Denn in Header-Dateien stehen ja (fast) nur Deklarationen und keine Definitionen der Klassen und/oder Funktionen. Ich persönlich würde ja auf das Blinken verzichten...

    Jan

  6. Ich nehme an, Du hast in der Hilfe nachgeschaut, oder? Wenn nicht, dann mach' es doch einfach.

    Aber ich glaube nicht, daß man alles auf einmal einlesen/auslesen kann. Aber das macht (fast) nichts, denn Borland stellt alles zur Verfügung was man braucht. Zum Schreiben in eine Datei:

    Laß einfach eine for-Schleife von 0 bis Count-1 (zu finden unter TListItems) laufen. In der Liest Du von das Array von Item aus und schreibst sie in eine Datei.

    Zum Lesen denkst Du Dir irgendein sinnvolles Format aus und liest bis zum Dateiende alle Daten ein und fügst sie, wie oben beschrieben, in TListView ein.

    HTH

    Jan

  7. Nee, der Median wird nicht eingesetzt. Der einfachste Quicksort hat auch gar nichts mit Mittelwerten zu tun. Quicksort nimmt sich das Element (z.B.) aus der Mitte und fängt an, alle Elemente, die kleiner als dieses Element sind, nach links zu sortieren und die größeren Elemente nach rechts.

    Worst case bedeutet im ungünstigsten Fall, daß heißt wenn die zu sortierenden Daten in einer ungünstigen Reihenfolge vorliegen. Für Quicksort würde der worst case so aussehen: Die Liste mit der Länge n wird in eine Liste der Länge n-1 und 1 aufgeteilt. Die Liste mit n-1 Elementen wird dann in n-2 Elemente und 1 aufgeteilt usw. Daraus ergibt sich dann das n². Wie die Daten dann vorliegen müssen, wenn ich das Element immer aus der Mitte der zu sortierenden Liste auswähle, um den worst case zu erreichen, kannst Du Dir ja mal spaßigerweise überlegen.

    HTH

    Jan

  8. Naja, schau doch einfach in der Hilfe nach. Mehr kann ich auch nicht tun. Ich habe kurz geschaut und im ersten Moment habe ich kein SaveToFile / LoadFromFile gefunden. Ich benutze zwar kein BCB5 aber ich glaube nicht, daß Borland es dort eingeführt hat. Bei TListBox geht LoadFromFile ja über die Eigenschaft Items, was vom TStrings ist. TStrings bringt LoadFromFile mit. Aber bei TListView sind Items nicht vom Typ TStrings. Ich fürchte Du mußt Dir selber eine Load-/Save-Funktion schreiben.

    HTH

    Jan

  9. Beide Algorithmen arbeiten nach dem "teile und herrsche"-Prinzip. Das bedeutet, man teilt ein Problem in zwei kleinere Probleme

    auf und hofft, daß das kleinere Problem lösbar ist. Wenn dem nicht so ist, dann verkleinert man das Problem weiter. Aus der Beschreibung sieht man schon, daß man die beiden Probleme ganz gut rekrusiv implementieren kann. (Muß man aber nicht, wenn man will kann man die Rekursion auflösen.) Es gibt auch ein paar unterschiede, die jeweils den einen oder anderen Algorithmus bevorzugen.

    Mergesort sortiert Teillisten. Um das zu bewerkstelligen teilt Mergesort die Listen solange auf (halbiert sie), bis die Liste nur noch aus einem Element besteht. Jetzt kann man die Listen sortieren und fügt sie nun wieder zusammen. Am Ende hat man eine sortierte Liste.

    Quicksort funktioniert ein wenig anders: Hier nimmt man sich ein Element (x) aus der Liste und sortiert alle Elemente die kleiner als x sind nach links und die Elemente, die größer sind, nach rechts. Das wird dann rekursiv für die ganze Liste gemacht. Dieses x sollte man natürlich einigermaßen schlau wählen... Am Ende bekommt man auch hier die sortierte Liste heraus.

    Beide Algorithmen besitzen im average case die Komplexität n*log n. Wobei n die Anzahl der Elemente sind. Im ungünstigsten Fall (worst case) hat Quicksort allerdings die Komplexität n².

    HTH

    Jan

  10. Also ob Java zum lernen wirklich schöner, als C++ ist, will ich so nicht unterschreiben. Es ist auch eine Geschmacksfrage. Aber in Java gibt es auch haufenweise Zeiger nur sind die im System "versteckt" und wenn man nicht aufpaßt macht das Programm auch nicht das, was man sich vorgestellt hat. Das gemeine speziell an C ist, daß ein Programm ohne Fehler kompiliert aber trotzdem abstürzen kann. In Java werden zur Kompilierzeit eine Menge Fehler aufgedeckt. C/C++ ist maschinennäher und wenn man sich einmal durch die beiden durchgearbeitet hat, dann sind sie auch nicht mehr so wild.

    Jan

  11. Ich weiß nicht, ob es das ist, was Du suchst aber:

    Du schnappst Dir erstmal eine Zeigervariable vom Typ TListItem.

    TListItem *newline;

    Nun soll es auf eine neue Zeile im TListView zeigen, also:

    newline = myListView -> Items -> Add ();

    Und als letztes füllst Du die neue Zeile mit Inhalt:

    newline -> Caption = "Hallo"

    newline -> SubItems -> Add ( "Welt!" );

    // Weitere unterkategorien...

    HTH

    Jan

  12. Was Klotzkopf schreibt ist ganz, ganz wichtig! Am Ende eines char Arrays wird noch '\0' angehängt. Wenn man dafür keinen Speicherplatz reserviert kann alles passieren. Es kann sein, daß das Programm funktioniert, es kann sein, daß das Programm bei ersten Aufruf abstürzt oder es kann irgendwann abstürzen. Im Allgemeinen ist so ein Problem unter Umständen sehr häßlich zu debuggen. Ansonsten geht Klotzkopf bei seiner Lösung durch die Liste und gibt jedes einzelne Element frei, wobei er sich den Zeiger auf das nächste Element merkt, damit er dann dieses Element frei geben kann und so weiter und so fort...

    HTH

    Jan

  13. "Du musst doch auch zugeben, dass der Satz so gedeutet werden kann bzw MUSS, dass void main() in ISO C verankert ist!" Nein, das muß ich nicht und werde ich auch nie! Im Standard steht drin, daß int main() und int main (int argc, char *argv[] ) angeboten werden müssen. Nur wenn ich eine der beiden Versionen benutze kann ich sicher sein, daß mein Programm auf jedem ISO-C++-System läuft. Alles andere ist implementationsabhängig. Und wenn irgendetwas von einer bestimmten Implementation abhängig ist, kann es wohl schlecht Standard sein. Ich hoffe, daß leuchtet ein.

    Jan

  14. main () ist kein C++! Allerdings ist es C nach dem 1989er Standard und ist die Kurzform für int main (). Wenn man also einfach main() schreibt, hat man sich in C für int main () entschieden. Für C++ gilt dies nicht! In C++ muß int als Rückgabewert angegeben werden. C99 akzeptiert main () auch nicht mehr sondern fordert int main ().

    Wenn Du tatsächlich Bücher hast, die void main () schreiben, dann wirf sie weg! Im Übrigen ist mir total egal was MSDN sagt. Mich interessiert nur was ISO sagt. Nochmal: wenn ein Compiler irgendeine schreibweise akzeptiert heißt es noch lange nicht, daß es auch richtig und damit standardkonform ist. (Es gibt auch seltene Fälle wo der Compiler meckert, obwohl es standardkonform ist. Dieser Fall tritt aber bei weitem nicht so häufig auf wie erstgenannte.) "Solang das Programm läuft isses doch egal!": Bitte glaubt mir, es ist nicht egal.

    Wenn Du einen Pudel hast, kannst Du ihn bei der Gelegenheit entkernen. Möge der Standard mit Euch sein

    Jan

  15. Hier die Antwort auf die Frage von Crush:

    "Jetzt ist die Frage, wer setzt den Standard? Der Erfinder oder die Community?"

    Weder Der Erfinder, noch die Community (wer immer das sein soll...) setzt den Standard. Den Standard hat ISO (International Organization for Standardization) gesetzt. Natürlich ist das jetzt eine langweilige Antwort, aber leider die einzig richtige...

    Jan

  16. Was Du gerne machen möchtest ist mit ANSI-C nicht möglich. Wenn Dein Programm nicht dem ANSI-Standard entsprechen muß, dann stelle Deine Frage am besten im "C++: Compiler, IDEs, APIs" Forum. Dort müßtest Du aber noch angeben, welche Entwicklungsumgebung Du verwendest. Oder Du wartest darauf, daß einer der Moderatoren Deine Frage ins richtige Forum verschiebt.

    HTH

    Jan

  17. Beides ist richtig und entspricht dem Standard. Wobei ich zu "Standard hin oder her, wie denn jetzt richtig?" bemerken möchte: Richtig ist, was Standard ist! Oder anders ausgedrückt: Der Standard bestimmt, was richtig ist.

    Bei int main () werden die Kommandozeilenparameter nicht berücksichtigt.

    Bei int main ( int argc, char *argv[] ) kann das Programm auf die übergebenen Parameter zugreifen. Wenn ich ein Programm schreiben wollte, daß ein Dateiinhalt in eine andere Datei kopiert (copy datei1 datei2). Dann müßte ich meine main-Funktion so schreiben: int main ( int argc, char *argv[] ) (Damit ich auf die Dateinamen, die beim Programmaufruf übergeben werden, zugreifen kann)

    HTH

    Jan

  18. Das struct tm ist völlig losgelöst von Unix, Linux, Windows und allen anderen Betriebssystemen die es gibt. Hier kommt mal wieder der Standard zum tragen. Ich gehe jetzt einfach vom Ansi-C Standard aus. Der besagt, daß in <time.h> struct tm enthalten ist. Allerdings hat tm noch mehr Komponenten als Du initialisierst. Das ist ein Punkt, der nicht ganz sauber ist, denn tm_wday, tm_yday und tm_isdst sind nicht initialisiert und da können jetzt irgendwelche werden drinstehen.

    tm_wday: Tage seit Sonntag (0..6)

    tm_yday: Tage seit 1. Jan (0..365)

    tm_isdst: positiv, wenn Sommerzeit gilt, 0 wenn sie nicht gilt und negativ steht keine Information dazu zur Verfügung...

    Es ist aber schon komisch, daß das Programm korrekt läuft, wenn Du debugst. Vielleicht hilft es, wenn Du statt tSekEnde-tSekBeginn difftime ( tSekEnde, tSekBeginn ) benutzt. Leider habe ich diesmal nur Vermutungen und kann mit nichts Konkretem aufwarten.

    Jan

  19. Hallo zusammen!

    Ich würde ganz gerne ein paar Worte zur main-Funktion verlieren. Ich habe in diesem Forum schon öfter gesehen, daß "void main ()" geschrieben wurde. Das ist falsch, da in diesem Forum über ANSI-C und ISO-C++ gesprochen (oder besser geschrieben) wird. Beide Standards sagen, daß main ein int zurückliefern muß. Das kürzeste C++-Programm ist also

    int main () {}

    Dieses Programm liefert als einziges den Rückgabewert 0 an den Aufrufer (z.B. Betriebssystem) zurück. return 0; Darf in C++ in der main-Funktion weggelassen werden, es wird vom Compiler ergänzt.

    Die Argumentation, void main () ist nicht falsch, da der Compiler keine Fehlermeldung auswirft, zieht nicht, da noch lange nicht alles, was der Compiler ohne Fehler übersetzt richtig ist. Es mag ja sogar Systeme geben, die nur void main () anbieten, aber diese Systeme sind nicht standardkonform. Dieser Tatsache sollte man immer im Hinterkopf behalten. Übrigens ist die Annahme falsch, void main () würde funktionieren, weil void besagt, ein unbekannter Rückgabewert würde zurückgeliefert. Bei void wird kein Rückgabewert zurückgeliefert! Ein void-Funktion kann gar keinen Wert zurückliefern. Es liegt nur am Compiler, der über diesen Fehler hinwegsieht, daß void main () funktioniert.

    Es ist wichtig zu wissen, was Standard ist und was nicht! Also bitte, bitte nur noch int main ().

    Jan

  20. Ok, mein posting war ein wenig überflüssig, da es prinzipiell gleich ist. Das Thema habe ich aber nicht verfehlt, da es die Frage gab, ob es einen Zufallszahlgenerator gibt. Das habe ich demonstriert.

    Zur main-Funktion mache ich einen neuen Thread auf, da es hier endgültig zu weit vom Thema wegführen würde.

    Jan

  21. Ich fühle mich einfach mal von Crush angesprochen und würde es in C++ so schreiben:

    
    #include <iostream>
    
    #include <cstdlib>
    
    #include <ctime>
    
    
    int main()
    
    {
    
       std::time_t rndtime;
    
       std::time ( &rndtime );
    
       std::srand ( (unsigned int)(rndtime) );
    
    
       for ( int i = 0;i < 10; i++ )
    
          std::cout << "Spiel " << ( i + 1 ) << "= " << ( ( rand() % 10 ) + 1 ) << '\n';
    
    }
    
    

    Wahrscheinlich nerve ich jetzt das ganze Board aber void main (), wie Crush es geschrieben hat, ist falsch! Es ist weder Ansi C noch ISO C++. void main () gibt es nicht! Sonst sieht der Quelltext relativ gleich aus. Allerdings habe ich es vermieden, die Header mit .h einzubinden. Die Funktionen blieben also alle im std Namensraum. Wenn man die Programme sehr schnell hintereinander startet, dann kann es vorkommen, daß man immer noch gleiche Würfelergebnisse bekommt. Man kann beliebig viel Aufwand betreiben um diesen Mißstand zu beheben oder sich vom Pfad der Kompatibilität und Portierbarkeit abwenden und systemspezifische Funktionen/Eigenheiten nutzen.

    Da der Computer deterministisch ist, muß man sich ein wenig anstrengen zufälliges Verhalten zu erzeugen.

    HTH

    Jan

    (Nach vielen Anstrengunge habe ich jetzt auch eine vernünftige Einrückung.)

  22. int rand (void) in <stdlib.h> liefert eine (pseudo) Zufallszahl.

    Man kann auch mit void srand ( unsigned int ) einen neuen Ausgangswert für eine Zufallsreihe festlegen. Am besten gibt man in srand eine Zahl an, die man aus einer Zeitfunktion erhält. So wird ein wenig mehr Zufall ins Spiel gebracht.

    HTH

    Jan

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...