Klingt nach fehlenden Include-Guards.

...zur Antwort

Ich war auch 13, als ich mein erstes OS geschrieben habe, aber das wurde eigentlich nur in die ersten Sektoren einer Diskette kopiert, bot eine einfache Shell, ein naives Dateisystem, und die einzige Anwendung mit Grafik war ein PCX-Bildbetrachter.

Wenn du wirklich eine GUI haben willst, sei dir bitte im Klaren darüber, das das SEHR VIEL Arbeit ist! Allein der Kernel meines OS war (damals noch in Assembler geschrieben) nur eine Hand voll Diskettensektoren (mit 512 Byte) groß, aber es hat richtig lange gedauert, vor allem, da es noch kein nennenswertes Internet gab.

Falls du dich inspirieren lassen möchtest, guck dir mal MenuettOS an! Das ist auch komplett in ASM geschrieben, hat Grafik, Sound, schicke GUI, Multithreading, sogar einen primitiven Webbrowser, uvm.

Unterschätze die Sache nicht! Sogar nur ein nacktes OS mit einer primitive Shell ist nichts, was du mal eben an einem Nachmittag entwickelst!

Trotzdem viel Spaß dabei ... falls du nicht - wie die meisten - vorher aufgeben wirst. :)

...zur Antwort

Ja, das geht tatsächlich, aber zuvor solltest du das hier wissen:

  • Die ZSH ist eine Shell, in der man Skripte (das sind reine Textdateien) ausführen kann, die dafür geschrieben sind.
  • C hingegen ist eine Programmiersprache, die von einem Compiler in ein ausführbares Prograamm (z. B. EXE-Dateien unter Windows) übersetzt, und erst dann ausgeführt werden können.

Es gibt aber einen sehr einfachen Trick! Du musst an den Anfang deiner *.c Datei nur das schreiben, was im folgenden Beispiel-Programm steht:

#if SHELL
    cc "$0" && ./a.out && rm a.out; exit $?
#endif

#include <stdio.h> /* puts */

int main(void) {
    puts("Hello, shell!");

    return 0;
}

Vorausgesetzt, du hast einen C-Compiler installiert, kannst du jetzt einfach auf der Kommandozeile ...

zsh hello.c

... schreiben (angenommen, deine C-Datei heißt "hello.c").

Du kannst aber auch einmalig ...

chmod +x hello.c

... schreiben, und hast direkt ein ausführbares "C-Skript", welches du noch einfacher mit ...

./hello.c

... ausführen kannst.

Such dir die Variante aus, die dir am besten gefällt!

Ich nutze diesen "Hack" oft gerne bei Minimalprogrämmchen in C, die wie herkömmliche Skripte ausgeführt werden sollen und ich zu faul bin, extra eine Makefile zu schreiben.

Warum das alles funktioniert, und was die drei magischen Zeilen am Anfang des Quelltextes bedeuten, und was eine Makefile ist, musst du jetzt aber noch nicht wissen.

Naja, viel Spaß dabei! :)

...zur Antwort

Das ist nicht richtig, da ohne "&" keine Reverenz zurück gegeben, sondern ein neues Objekt erzeugt wird.

...zur Antwort
C++ effiziente liste?

Ich hab eine Frage zu dieser Aufgabenstellung bei einem Übersetzungsprogramm:

Die Optionen -o und -f sind zum optimieren (dass nicht gefundene Wörter und Wörter die weit hinten im Wörterbuch stehen nach vorne gebracht werden).

Wie kann man bei einer einfach verketteten Liste effizient ein Element nach vorne verschieben?

Mein Listenheader bisher sieht so aus:

class dlist {
private:
    struct _node {
        std::string key;
        std::string value;
        _node* next;
    };

    class iterator {
    public:
        friend class dlist;
        iterator& operator++();
        iterator& operator++(int);
        bool operator==(const iterator& o);
        bool operator!=(const iterator& o);
    private:
        iterator(_node* curr) : _curr(curr) {};
        _node* _curr;
    };

    _node* _head;

public:
    dlist();
    ~dlist();
    void push_front(const std::string& k, const std::string& v);
    void move_front(const iterator& itr); // HIER

    iterator begin() const;
    iterator end() const; // und HIER
};

Soweit konnte ich alle Methoden in O(1) implementieren abgesehen von void move_front() und iterator end(). Um ein Element an den Anfang zu verschieben, muss man ja den next-Pointer des vorherigen Elementes auf das folgende Element setzen (aushängen) und kann dann einfach _head auf dieses Element setzen.

Im worst case muss man aber um das vorherige Element zu bekommen, durch die ganze Liste laufen, weswegen das seht ineffizient ist.

Hat jemand eine Idee wie man es anders machen kann, ohne es als doppelt verkettete Liste zu machen?

...zum Beitrag

Neben dem, was KarlRanseier gesagt hat, fällt mir spontan eine "XOR Linked List" ein, bei der zwei Zeiger in eine Variable gequetscht werden, sodass du effizient vorwärts und rückwärts iterieren kannst, obwohl nur ein einziger "Zeiger" vorhanden ist.

Dieser Ansatz bringt aber wieder andere Nachteile mit sich.

Ach so, und ein vector ist bei deiner Aufhabenstellung auch nicht optimal, sondern eher ein deque! Bei dem Benchmark in den Kommentaren unter der anderen Antwort, wird eine Implementierung mit deque sicher den Vogel abschießen!

Davon abgesehen: Merkwürdige Aufgabenstellung! Eine Liste ist dafür die denkbar ungünstigste Datenstrukur.

Naja, wollte nr ein paar Anregungn einwerfen. Viel Spaß noch beim basteln! :)

...zur Antwort

Warum nutzt du nicht einfach Standardfunktionen und Operatoren, statt Unterstrich-Funktionen wie __str__ und __eq__?

Und die Benennung deiner Bezeichner lässt earauf schließen, dass du nicht aus der Pythonwelt kommst.

Was genau funktioniert denn nicht!

...zur Antwort

Das nennt man Metaprogrammiersprache und den Übersetzer einen Transpiler.

...zur Antwort

Nimm eine beliebige C oder. C++ Bibliothek, die entspr. Funktionen anbietet, und nutze diese direkt in Python, mithilfe des ctypes-Moduls.

...zur Antwort

Also der Senf in diesen kleinen Tütchen in Nattoverpackungen ist durchweg DEUTLICH schärfer, als die "scharfen" Sorten aus dem Glas / Becher in Deutschland. Aber natürlich kannst eu den auch essen.

Und Dashi ist was völlig anderes als Sojasoße. Dann doch lieber gänzlich ohne.

Wenn rohe Wachteleier hast, kannst du das auch drüber kippen. Schmeckt super zum Natto auf Reis zum Frühstück.

...zur Antwort

Ein Kumpel von mir ist Maurer mit Hauptschulabschluss, und er verdient 20000€ im Monat!

Und zwar hat er sich auf Schornsteinbau spezialisiert und mauert weltweit, wenn Fabriken neu gebaut werden.

Außer ihm gibt es dafür nur eine Hand voll Fachleute europaweit.

Und zum Thema Webdev: Ich habe als Schüler über 200€ pro Stunde dafür genommen. Das war aber zu Bubblzeiten in den 90ern und damals war der Markt noch nicht so übersättigt. Hatte mich auf WAP und Imode mit cHTML spezialisiert, falls das noch jemand kennt.

Heutzutage arbeite ich aber etwas Richtiges, und mache solche Schülerjobs nicht mehr.

...zur Antwort

Ändere die Compilereinstellungen!

Releasebuild, Optimiert, Stripping ist das wichtigste, usw.

Dann bist du bei 2 bis 5 Megabyte.

Weiter kannst du mit einm Laufzeitpacker wie UPX kommen, auf unter 1 MB bei kleineren Programmen.

Aber wie gesagt: Strippe erstmal alle unnötigen Symbole von der EXE-Datei!

...zur Antwort

Dafür nutzt man Mocks, Stubs und Spies, was ausdrücklich unterschiedliche Dinge sind, die nicht verwechselt werden wollen.

Als QnD-Lösung kannst du auch Reflection nutzen, um private Member zur Laufzeit public zu machen, aber das erachte ich als Pfusch und außerdem erzeugst du damit unnötig Abhängigkeiten von einer konkreten Implementierung.

Buchtipp am Rande: The Art of Unit Testing

...zur Antwort