Multithreading würde ich da eigentlich noch nicht so schnell empfehlen, da es einiges komplizierter macht und man die, auf Grund von Leistung, auch nicht zu häufig benutzen sollte.

Ein Spiel hat normalerweise eine Nachrichtenschleife, bei der die Durchläufe die Frames darstellen. Nun kannst du deinen Bau starten und die momentane Zeit messen. In jedem Frame schaust du dann, wie viel Zeit seit deiner Messung vergangen ist und kannst dann den Fortschritt deines Baus aktualisieren. Z.B. ist nun fertig oder hat 50% erreicht und wird grafisch anders dargestellt ...

Als kleine Anmerkung sei noch, dass die grafische Darstellung nur ein mal pro Frame aktualisiert wird und der Anwender daher nicht merken kann, ob du nun 1 mal oder 10 mal pro Frame den Fortschritt des Gebäudes aktualisierst. Beim Multithreading könnte es sogar dazu führen, dass der Fortschritt 100 mal aktualisiert wird, was dann totale Rechenzeitverschwendung wäre.

...zur Antwort

Ja, du kannst einen Reiter einfach mit der Maus rausziehen. Dadurch entsteht ein neues Fenster. Das kannst du dann z.B. auf dein anderes Anzeigegerät schieben.

...zur Antwort

Dazu die Zeichenkette mit einer Schleife durchlaufen, damit du jedes Zeichen ansprechen kannst. Bei jedem Zeichen prüft du, ob es sich um einen Buchstaben handelt. Wenn ja, dann um 13 Stellen nach oben verschieben, bzw. nach unten. Aufpassen, dass "n" zum Beispiel wieder zu "A" wird.

Schau dir zur genaueren Beschreibung sonst diesen Link mal an: http://de.wikipedia.org/wiki/ROT13

Bezüglich der Groß-/Kleinschreibung schau dir mal eine ASCII Tabelle an. Dort wirst du erkennen, dass, wenn du einen Kleinbuchstaben im Zahlenwert um 32 verringerst, dieser zu einem Großbuchstaben wird.

...zur Antwort

Wo genau dein Fehler ist, kann man hier nicht erkennen. Dazu bräuchte man Codeausschnitte.

Dein Problem ist doch, dass du zwei mal eine Eingabe erwartest, aber nur beim ersten Mal auch tatsächlich eine Eingabe bei der Konsole tätigen musst.? Nur damit ich das richtig verstanden habe.

Wenn du cin.getline() verwenden möchtest, dann darfst du vorher nicht "cin.operator >>()" verwenden. Denn der Operator lässt z.B. das Zeilenumbruch-Zeichen im Buffer drin. Und "getline" liest jedoch nur bis zum nächsten Zeilenumbruch.

...zur Antwort

Es sind 4er-Schritte, weil die Größe von "int" 4 Bytes ist. Wenn du also ein weiteres Element hinzufügst, fügst du 4 Bytes hinzu.

Wenn du die Anzahl der Elemente in deinem Array ermitteln möchtest, dann kannst du das wie folgt machen:

int numberOfElems = sizeof(array) / sizeof(int);

Du solltest jedoch bedenken, dass der "sizeof"-Operator zur Kompilezeit ausgewertet wird. Wenn du also nur noch einen Zeiger auf dein Array haben solltest, dann kommst du nicht mehr an die Größe ran.

Daher werden häufig verwaltende Klassen wie "std::vector" verwendet, die die Größe zur Laufzeit speichern.

...zur Antwort

Moin!Hast du denn schon mal geschaut, ob in der Liste "orte" das richtige drin steht? Also mit nem Debugger zum Beispiel. Dann könntest du den Fehler zumindest abgrenzen.

Und was funktioniert eigentlich genau nicht? Bzw. was passiert statt dessen. Wird einfach nichts angezeigt?

...zur Antwort

Wenn ich das richtig verstanden habe, möchtest du eine String zu String Zuordnung machen. Also wenn dieser String gegeben ist, dann möchte ich folgenden String haben.

Das kannst du wunderbar mit Hashmap lösen. In C# nennt sich die Klasse "Dictionary". Siehe: https://msdn.microsoft.com/de-de/library/xfhwa508

Dem kannst du Key/Value-Paare hinzufügen und danach anhand eines Schlüssels den zugehörigen Wert ermitteln.

...zur Antwort

Mir scheint es, dass du die Frage vergessen hast... ;)

...zur Antwort

Schau dir mal diese Seite an: http://www.cplusplus.com/reference/chrono/high_resolution_clock/now/

Die Klasse nennt sich "std::chrono::high_resolution_clock".  Damit kann man die Zeit ziemlich genau messen. Beim Beispiel wird auch eine Zeitspanne berechnet, was du dann auch bei dir in der Abbruchbedingung deiner Schleife machen kannst.

...zur Antwort

Was genau funktioniert denn nicht? Was hast du denn alles probiert? So ein paar mehr Informationen könnte das Antworten deutlich vereinfachen. Ach und dein Code wird fehlerhaft dargestellt. ;)

Eine kleine Anmerkung sonst: Wenn du folgenden Aufruf tätigst

max("ab", "acd");

, dann versuchst du zunächst eigentlich zwei Werte vom Typ "const char*" zu übergeben. Da "std::string" eine implizite Konvertierung besitzt, kann man bei einer Funktion auch "std::string" erwarten und einen Wert vom Typ "const char*" übergeben.

Bei dir wird nun aber für "T" der Typ "const char*" angenommen und nicht "std::string". Denn "const char*" zu "const char*" mag der Kompiler lieber, als "const char*" zu "std::string".

Und noch was: Eine Funktion "max" gibt es schon in der STL(Standard Bibliothek). Könnte daher auch zu Konflikten führen...

Und noch eine Kleinigkeit ^^: Bei deiner allgemeinen Funktion "max", versuchst du an einer Stelle eine "0" zurückzugeben. Das wird natürlich nicht bei allen Typen funktionieren.

...zur Antwort

Auch in C musst du zu erst die Zeichenkette zusammen setzen.

In C# kann man das mit "string.Format()" machen. Siehe dazu die Beschreibung: https://msdn.microsoft.com/de-de/library/system.string.format%28v=vs.110%29.aspx

Viel Spaß noch! :)

...zur Antwort

Mit einem relativem Pfad. Der ist dann relativ zu dem Pfad, von wo aus du das Programm gestartet hast.

Aber mit welchem Befehlt möchtest du denn überhaupt auf die Datei zugreifen? Manchmal sind auch reltive Pfade nicht erlaubt ...

...zur Antwort

Die "PictureBox" hat standardmäßig eigentlich keinen Rahmen. Ansonsten kann du ihn mit der Eigentschaft "BorderStyle" deaktivieren, indem du es auf "None" setzt.

Zusätzlich kannst du bei deiner Form auch ein Hintergrundbild setzen. Das geht mit der Eigenschaft "BackgroundImage".

...zur Antwort

Das Problem bei dir ist, dass du "ziffern[7]" immer weiter inkrementiert und es nie zurück setzt. Dadurch steht später eine Zahl drin, die auserhalb des maximalen Index von "letters" liegt.

...zur Antwort

Dazu kannst du einen seperaten Prozess starten. Bei einer Suchmaschine einfach "C# prozess starten" eingeben und dann bekommst du gute Beispiele.

Ansonsten ist diese Klasse dafür zuständig: System.Diagnostics.Process

Damit als Suchbegriff bekommst du eventuell bessere Ergebnisse. Je nach dem, wie personalisiert deine Suche schon ist. ;)

...zur Antwort

Der Unterschied dabei ist, dass du beim ersten Fall die Variable auf dem Stack anlegst(statisch) und beim zweiten Fall auf dem Heap(dynamisch).

Beim statischen Reservieren von Speicher, muss die Menge zur Kompilezeit bekannt sein. Beim dynamischen Reservieren dagegen erst zur Laufzeit.

Bei deinem zweiten Fall erzeugst du eine statische Zeigervariable, die auf einen dynamischen Speicherbereich zeigt. Denn auf dynamischen Speicher kann man nur über Zeiger zugreifen, da deren Speicheradresse erst zur Laufzeit bekannt ist.

Dynamisch kann man deutlich mehr Speicher belegen, als statisch. Die Größe des Stacks wird vom Kompiler(bzw. Linker) festgelegt. Die maximale Größe des Heaps dagegen wird vom Betriebssystem festgelegt.

...zur Antwort

Du hast dir doch scheinbar gemerkt, wie viele Objekte in dem Array sind, oder? Schließlich musst du ja wissen, wie häufig du inkrementieren kannst. Also kannst du auch am Ende den Zeiger wieder dekrementieren, womit du wieder an den Anfang gelangt. ;)

...zur Antwort
C++-Mini-Programm: Unverständliche Stringausgabe?

Hallo,

Ich lerne seit einiger Zeit C++-Programmierung und bin jetzt gerade bei der Vertiefung von Operatoren stehengeblieben. Da wollte ich einen Code zur Verschlüsselung von Strings mittel XOR schreiben, doch irgendetwas scheint da falsch zu laufen:

// Verschlüsselt Daten mittels XOR

#include <iostream>
using namespace std;

class Ciphering {
    char plain[65536];
    char cipher[65536];

    char *doCiphering(char *from, char *key) {
        unsigned short int keyl = strlen(key);
        for (unsigned short int i = 0; from[i]; i++) {
            cipher[i] = from[i] ^ key[i % (keyl - 1)];
        }
        char *cipherp;
        cipherp = &cipher[0];
        return cipherp;
    }
public:
    Ciphering (char p[65536]) { strcpy_s(plain, 65536, p); }

    char *encrypt(char *key) {
        return doCiphering(plain, key);
    }
    char *decrypt(char *key) {
        return doCiphering(cipher, key);
    }
};

int main() {
    cout << "XOR-Verschlüsselung" << "\n\n\n\n";

    char txt[65536];
    cout << "Geben Sie den Klartext ein: ";
    gets_s(txt);
    Ciphering msg1(txt);

    char key[65536];
    cout << "Geben Sie Schlüssel ein: ";
    gets_s(key);

    cout << "\n" << "Geheimtext: " << msg1.encrypt(key);

    cout << "\n\n\n" << "Geben Sie Schlüssel ein: ";
    gets_s(key);
    
    cout << "\n" << "Klartext: " << msg1.decrypt(key);

    gets_s(key);
    return 0;
}

Die Ausgabe lautet dann z.B.:

XOR-Verschl³sselung



Geben Sie den Klartext ein: klartext
Geben Sie Schl³ssel ein: schluessel

Geheimtext: ↑☼  ▲☺


Geben Sie Schl³ssel ein: schluessel

Klartext: klart

Wieso nicht vollständig?

Und wenn ich z. B. "hallo" und danach "test" eingebe, läuft bei mir der ganze Bildschirm mit ╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠╠ voll, beim Entschlüsseln hängt er sich dann auf …

Das ist das erste Programmchen, was ich ohne Anlass aus meinem C++-Tutorialbuch geschrieben habe und für das ich daher keine Lösung habe;
kann mir jemand sagen, was ich falsch mache? :)

Vielen Dank schon mal! :-)

Mit freundlichen Grüßen,
KnorxThieus (m)

...zum Beitrag

Dein Fehler ist, dass du den zurückgegebenen Text von "doCiphering" nicht terminierst. Es muss noch ein '\0' ans Ende der Zeichenkette.

...zur Antwort