Unter Linux Win32-Anwendungen erstellen



  • Hallo

    Ich habe in der Schule einen Primzahlengenerator in C geschrieben. Mit diesem ist es möglich (wer hätte es gedacht!) Primzahlen von 1 bis x "herauszusuchen". Dazu habe ich nicht das Sieb des Eratosthenes benutzt, sondern ganz simpel, die Funktion "modulo" (Rechenoperator %).

    Jetzt programmiere ich aber unter Linux (Kubuntu, mit der IDE CodeBlocks), möchte das Programm aber auch meinen Freunden (Windows-Nutzer) schicken können. Wie kann ich nun unter Linux Windows-Programme erstellen?

    Grundkenntnisse in der Benutzung von Linux habe ich, sprich Paketverwaltung, etc.

    Ciao!



  • Schau Dir mal mingw an. Im (K)Ubuntu repository gibt es einen mingw crosscompiler, mit dem Du Win32 binaries erstellen kannst.



  • Klasse! Funktioniert 🙂

    Hab es mal schnell auf meinem großen Rechner ausgeführt, aber es ist SEHR VIEL langsamer als mein Kubuntu-Laptop! Obwohl der große deutlich mehr Leistung hat...

    Vergleich mit einer Berechnung bis max. 2.000.000:
    Kubuntu MIT Ausgabe benötigt 10 Sekunden
    Windows MIT Ausgabe benötigt 333 Sekunden
    Kubuntu OHNE Ausgabe benötigt 4 Sekunden
    Windows OHNE Ausgabe benötigt 306 Sekunden

    Woran liegt das? Liegt das wirklich am Linux Kernel? 😮 Oder ist MinGW nicht so der effizienteste? Gibts G++ auch für Windows?

    Der Code ist folgender:

    #include <stdio.h>
    #include <math.h>
    #include <stdlib.h>
    #include <time.h>
    
    int main() {
        int zahl, grenze = 0, i = 0;
        time_t tsanfang, tsende;
        bool primzahl, stop = false;
    
        printf("Primzahlberechner von ************** v0.1\n\n");
        printf("Bitte geben Sie eine Grenze ein, bis zu der die Primzahlen berechnet werden sollen.\n");
        printf("    [x] Zahl\n");
        printf("    [0] Programm beenden\n");
        printf("    Eingabe: ");
        scanf("%d",&grenze);
    
        system("clear"); // "cls" für Windows
        printf("Primzahlberechner von ************** v0.1\n");
        printf("=========================================\n");
        printf("Die folgenden Primzahlen wurden für die Zahl %d berechnet:\n",grenze);
        tsanfang = time(NULL);
        while(i <= grenze && grenze != 0) {
            zahl = 2;
            primzahl = true;
            while(zahl <= sqrt(i)) {
                if(i % zahl == 0) {
                    primzahl = false;
                }
                zahl++;
            }
            if(primzahl == true) {
                if(i != 0) {
                    printf("%d\t",i);
                }
            }
            i++;
        }
        tsende = time(NULL);
        printf("\n\nDiese Rechnung wurde in %d Sekunden durchgeführt.", tsende - tsanfang);
    }
    

    Das ist doch schon soweit sehr gut oder nicht? 🙂

    EDIT: Habe mal "meine" bereits kompilierte Datei hochgeladen: http://www.dunkleorte.de/primzahlen.exe
    Die Linux-Executable kann ich auch hochladen, bei Bedarf.
    EDIT 2: Habe mal die Ausgabe der Primzahlen weggelassen. Jetzt geht es unter Windows etwas schneller, nämlich 306 Sekunden. Linux benötigt jetzt nurnoch 4 Sekunden!

    Ciao



  • Mit -O3 dauert das bei mir unter Windows ~45 Sekunden (gcc 4.3.2).
    Mir fällt auf, dass nach primzahl=false ein break fehlt. Mit break dauert es dann auch unter Windows nur noch 4 Sekunden.
    Evtl. erkennen neuere Versionen des gcc selbst, dass sie an der Stelle die Schleife direkt verlassen können. Die MinGW-Version in den Ubuntu-Repositories ist dagegen nicht gerade die neuste.

    Gibts G++ auch für Windows?

    Jo, nennt sich MinGW (Minimalist GNU for Windows) 😉
    Hier gibt es immer aktuelle Builds:
    http://www.tdragon.net/recentgcc/

    Außerdem: if(primzahl == true) lässt sich zu if(primzahl) kürzen. Erstere Version ist redundant und fehleranfälliger (z.B. kann man aus Versehen primzahl = true schreiben).



  • Ja, war eine Aufgabe aus der Schule.

    Wie meinst du das mit break? Kenne das nur von PHP:

    switch($variable) {
        case "wert": echo "Hallo Welt";
        break;
    }
    

    Oder wie? Und warum die Schleife direkt verlassen? Sorry, bin Anfänger 😃



  • Organized schrieb:

    Wie meinst du das mit break?

    Per break kannst Du die while-Schleife direkt verlassen.

    Und warum die Schleife direkt verlassen? Sorry, bin Anfänger 😃

    Naja, wenn Du schon weißt, dass eine Zahl keine Primzahl ist, weil sie mit Modulo 0 durch irgendwas teilbar ist, musst Du nicht weitertesten ob sie Modulo 0 durch irgendwas anderes teilbar ist, sondern kannst einfach die Schleife verlassen.



  • Dieser Thread wurde von Moderator/in nman aus dem Forum Linux/Unix in das Forum ANSI C verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Danke, jetzt gehts deutlich Fixer 🙂

    Weißt du, wo ich die neue MinGW-Version als .deb oder so finde? Habs nicht so drauf, mit Programme installieren unter Linux 😃

    Aber ist schonmal super, dass es jetzt so gut geht. Aber nichts destotrotz ist Linux etwas schneller 😃

    Bis 2 Mio mit Ausgabe: Linux 10 Sek., Win7 49 Sek.

    Ist aber auch ein gehöriger Unterschied zum vorherigen Ergebnis! Danke!! 🙂

    EDIT: Linux benötigt mit dem break; jetzt nurnoch 2 Sekunden für 2.000.000 😕 Kann es nicht wirklich sein, dass der Kernel dafür einfach schneller ist?



  • Organized schrieb:

    EDIT: Linux benötigt mit dem break; jetzt nurnoch 2 Sekunden für 2.000.000 😕 Kann es nicht wirklich sein, dass der Kernel dafür einfach schneller ist?

    Nö, der Kernel kommt lediglich bei der Ausgabe ins Spiel.
    Und die Konsolenausgabe unter Windows ist vergleichsweise in der Tat nicht gerade flott.

    Mögliche Gründe:
    1. Die CPU in deinem Laptop ist eben doch etwas schneller. Beachte auch, dass dir hier zusätzliche CPU-Kerne nichts nützen.
    2. Die native gcc-Version auf dem Laptop (wahrscheinlich 4.4.x), kann besser optimieren als die 4.2.x-Version, die bei dem MinGW aus den Repositories dabei sein müsste.
    3. Auf deinem Windowsrechner laufen hunderte Rechenzeit verschwendende Tasks im Hintergrund.



  • Mhh, dann kann es wirklich an der Ausgabe unter Windows liegen... Werde dazu nochmal einige Tests durchführen!

    Danke dir für deine Hilfe 🙂



  • Habe dann doch noch eine Frage.

    Undzwar habe ich es jetzt so programmiert, dass man gefragt wird, ob man die Primzahlen sehen will oder nicht. Bei "nein" soll dann nur stehen "Bitte warten Sie...", den Befehl dafür habe ich vor die Berechnungs-Schleife gesetzt. Allerdings wird dieser erst angezeigt, wenn die Schleife fertig ist! Aber es steht doch davor? 😕

    Muss ich erst mit einem bestimmten Befehl den Cache ausgeben oder so?



  • Organized schrieb:

    Muss ich erst mit einem bestimmten Befehl den Cache ausgeben oder so?

    Kann sein.
    In C geht das mit fflush(stdout), glaube ich.



  • Oder auch einfach printf("\n"); so weit ich weiss.



  • Danke, fflush(stdout); funzt. Aber da der Befehl fflush(stdin); mir schon bekannt ist, hätte ich selber drauf kommen können 💡



  • sry, das ich den hier noch ü 15 Monate mal eine Frage reinstelle, aber wie schaut es aus, wenn ich eine Libraray für Ubuntu und Win Compalieren will?

    kann ich in Monodevelop auch irgendwie den Namen der Ausgabe-file vordefinieren? Frage deshalb im Bezug auf Monodevelop, da die .so da erstellt wurde.

    Gruß und Frohe Ostern

    Maik81ftl


  • Mod

    maik81ftl schrieb:

    sry, das ich den hier noch ü 15 Monate mal eine Frage reinstelle, aber wie schaut es aus, wenn ich eine Libraray für Ubuntu und Win Compalieren will?

    Dann stell eine Frage im passenden Forum (Compilerdetails haben nichts mit der Sprache an sich zu tun), anstatt die Toten zu erwecken (auch wenn das Datum dafür gut passt).


Anmelden zum Antworten