Empfehlung eines Compilers...



  • Hallo,

    ich bin gestern auf OpenSuse Linux umgestiegen.
    Ich muss sagen, ich bin echt sehr positiv überrascht.
    So als Hobby programmiere ich kleine Programme in C/C++ - meist grafisch.
    Da ich jetzt ja sehr von Linux überzeugt bin, möchte ich meine Programme fortan unter Linux schreiben. Kleine Konsolenanwendungen habe ich schon erfolgreich mit GCC geschrieben. Jetzt würde ich natürlich gerne auch grafische Programme unter Linux entwickeln (C++).

    Meine Frage:
    Mit welchem Compiler geht das am besten? Unter Windows hatte ich den C++ Builder von Borland... gibt es sowas auch für Linux? Wenn nein, wie mache ich es dann?

    Bitte helft mir. 😕

    Gruß



  • Erst einmal musst du dich für ein GUI-Toolkit entscheiden. Unter Linux sind GTK+ (bzw. GTKmm) und Qt sehr verbreitet (gibt aber noch zahlreiche andere wie fltk oder wxWidgets). Was du nun vermutlich willst ist eine IDE (und keinen Compiler. Üblicherweise nimmt man unter Linux immer den GCC als Compiler). Welche du am besten nimmst, hängt halt wieder von dem Toolkit ab. Für Qt bieten sich zB KDevelop oder Qt Creator an. Für GTK nimmt man wohl Anjuta und für wxWidgets Code::Blocks.



  • ok, dann entscheid ich mich spontan für Qt und KDevelop.
    was brauche ich sonst noch dazu? und wo kann ich das downloaden und was kostet das?

    Sry für die vielen Fragen, aber ich habe noch nicht so die Ahnung... 😕

    Gruß



  • Bei Linux sollte man (so weit möglich) alles durch die Paketverwaltung installieren lassen. Dann wird alles automatisch geupdated und alle benötigten Abhängigkeiten installiert. KDevelop und Qt sind beide freie Software. Wobei du bei Qt beachten musst, dass du eine Lizenz kaufen musst, wenn du Qt statisch linken willst und den Quellcode deines Programmes nicht unter der GPL veröffentlichen willst.

    Bei OpenSuSE solltest du KDevelop und Qt über YaST installieren können. Aber ich kenne mich mit OpenSuSE nicht genau aus.



  • rüdiger schrieb:

    Wobei du bei Qt beachten musst, dass du eine Lizenz kaufen musst, wenn du Qt statisch linken willst und den Quellcode deines Programmes nicht unter der GPL veröffentlichen willst.

    Genauso, wie bei GTK+ und GTKmm. FOX, wxWidgets und FLTK darf man auch bei Closed Source statisch linken, aber das sollte eigentlich keine Einschränkung sein.



  • Hallo,

    danke für die Tipps.
    Ich habe nun KDevelop installiert.
    Ich nutze Qt.
    Als ich mich jetzt ein bisschen mit dem Programm beschäftigt habe, ergaben sich mir aber ein paar Fragen:

    1. Wie kann ich eine ganz einfache grafische Anwendung machen? (Soll heißen einfach ein Formular mit 1...2 Button und einem Eingabefeld...)?

    2. Wie siehts mit Gleitkommazahlen aus? (double) brauche ich dafür weitere .h Files?

    Unter Windows war sowas möglich:

    double x = -5;
    
    while(x < 1000)
    {
        if(((3*x*x) + (4*x)) == 0)
        //-----
    
        x = x + 0.001;
    }
    

    Aber unter Linux wird das if garnicht aufgerufen...
    Und im Debuger von KDevelop erhöht sich der Wert garnicht...
    Allerdings, wenn man das Programm ausführt, "hängt es sich nicht auf" (soll heißen irgentwann ist x=1001 und dann ist die Schleife vorbei...) Aber das if wird nie ausgeführt...

    Woran kann das liegen?

    Gruß



  • utzer schrieb:

    1. Wie kann ich eine ganz einfache grafische Anwendung machen? (Soll heißen einfach ein Formular mit 1...2 Button und einem Eingabefeld...)?

    Siehe: http://developer.qt.nokia.com/static/getting_started/

    Eine einfache Suche liefert dir solche Ergebnisse.

    utzer schrieb:

    1. Wie siehts mit Gleitkommazahlen aus? (double) brauche ich dafür weitere .h Files?

    Nein

    utzer schrieb:

    Unter Windows war sowas möglich:

    double x = -5;
    
    while(x < 1000)
    {
        if(((3*x*x) + (4*x)) == 0)
        //-----
    
        x = x + 0.001;
    }
    

    Aber unter Linux wird das if garnicht aufgerufen...
    Und im Debuger von KDevelop erhöht sich der Wert garnicht...
    Allerdings, wenn man das Programm ausführt, "hängt es sich nicht auf" (soll heißen irgentwann ist x=1001 und dann ist die Schleife vorbei...) Aber das if wird nie ausgeführt...

    Unter Linux geht das genauso. Und genauso, wie unter Windows, kriegst du bei double Zahlen Probleme mit Rundungsfehlern. Darum sollte man nie Gleitkomma-Zahlen als Schleifenvariablen verwenden.

    Ich würde dir empfehlen, dass du dir die Grundlagen von C++ genauer ansiehst, bevor du mit GUI-Programmierung anfängst.



  • Aso, ok, das kann sein...

    int i = 0;
    double x = -10.00;
    
    while(i < 1000)
    {
       if((3*x*x) + (4*x)) == 0)
       {
          //Wird nie ausgeführt, auch nicht, wenn x=0... warum?
       }
    
       x = x + 0.01;
       i++;
    }
    

    Aber warum funktioniert das dann nicht?

    Gruß



  • Das liegt an der Darstellung von Fließkommazahlen im Computer. Die werden eben nicht dezimal gespeichert, sondern im Dualsystem. 0.01 hat da zB keine endliche Darstellung und du erhältst Rundungsfehler. Das ist aber ganz unabhängig von Windows oder Linux und auf beiden Systemen so.

    http://docs.sun.com/source/806-3568/ncg_goldberg.html



  • utzer schrieb:

    Aber warum funktioniert das dann nicht?

    Rundungsfehler. 0.01 ist auf dem Computer nicht exakt darstellbar!

    Folgendes funktioniert.

    #include <iostream>
    #include <cmath>
    using namespace std;
    
    int main(int argc, char* argv[])
    {
        int i = 0;
        double x = -10.00;
    
        while(i < 2000)
        {
            if ( abs((3*x*x) + (4*x)) < 1e-14)
            {
                cout<<x<<endl;
            }
    
            x = -10.00 + i * 0.01;
            i++;
        }
    
    }
    


  • Hallo,

    danke für die Antwort.
    Ja, so funktioniert es...
    Aber warum brauchts dazu die Funktion abs()?
    Die macht doch einfach nur aus z.B. 2.89 -> 2.8900

    Gruß



  • utzer schrieb:

    Hallo,

    danke für die Antwort.
    Ja, so funktioniert es...
    Aber warum brauchts dazu die Funktion abs()?
    Die macht doch einfach nur aus z.B. 2.89 -> 2.8900

    Nein. Die Funktion abs bildet den Absolutbetrag der Zahl. Und du willst, prüfen, dass das Ergebnis weniger als 10^-14 von der Null entfernt ist. Also brauchst du den Betrag.

    Es würde natürlich auch

    double y = (3*x*x) + (4*x);
    if (y > -1e-14 && y < 1e-14)
       ...
    

    funktionieren.



  • ok, danke, jetzt hab ich es gerafft!!! 👍 (sry, stand auf dem Schlauch... 😕 )

    Gruß


Anmelden zum Antworten