1. Liebe Forumsgemeinde,

    aufgrund der Bestimmungen, die sich aus der DSGVO ergeben, müssten umfangreiche Anpassungen am Forum vorgenommen werden, die sich für uns nicht wirtschaftlich abbilden lassen. Daher haben wir uns entschlossen, das Forum in seiner aktuellen Form zu archivieren und online bereit zu stellen, jedoch keine Neuanmeldungen oder neuen Kommentare mehr zuzulassen. So ist sichergestellt, dass das gesammelte Wissen nicht verloren geht, und wir die Seite dennoch DSGVO-konform zur Verfügung stellen können.
    Dies wird in den nächsten Tagen umgesetzt.

    Ich danke allen, die sich in den letzten Jahren für Hilfesuchende und auch für das Forum selbst engagiert haben. Ich bin weiterhin für euch erreichbar unter tti(bei)pcwelt.de.
    Dismiss Notice

C++ Start Schwierigkeiten

Discussion in 'Programmieren' started by 0John0, Jan 27, 2009.

Thread Status:
Not open for further replies.
  1. kazhar

    kazhar Viertel Gigabyte

    stammt allerdings von einem pascal compiler...
    WindowTools.pas(319,43) Hint: Parameter LPARM not used.


    man könnte natürlich um den compiler zu beruhigen irgendwo
    if (lParm==0) { }
    einfügen.
     
  2. Fettbemme

    Fettbemme Halbes Megabyte

    Ein Warning ist letztich ein Hinweis, das etwas nicht so ist wie es sein sollte. Viele Warnings führen im realen Leben nicht zu Fehlern, es gibt aber auch Warnings die unter gewissen Bedingungen zu Fehlern führen. Besonders ist das bei denen die irgendwie Typenumwandlungen anmeckern.
    Es mag einige wenige Fälle geben, wo es "einfacher" ist das Warning stehen zu lassen. Ich meine ich hatte sowas mal in Verbindung mit irgendwelchem wilden COM/DCOM Zeugs unter VC++6.0.

    Natürlich muß ich auch zugeben, dass während der Entwicklung "gewisse" Warnings relativ egal sind. Im Entwicklungszustand sind halt noch viele Dinge unfertig, die dann zu Warnings führen. Später verschwinden diese dann. Ich will damit auch zeigen, dass ich kein "Heiliger" bin in der Programmierung der Warnings verteufelt. Nur im Ergebnis muß es dann auch passen. Das hat auch mit dem Anspruch an die "Softwarequalität" zu tun.

    Daher ist meine Devise immer: 0 Warnings, 0 Errors!

    Nun deshalb rede ich von C++ (dem Thema der Thread Überschrift ;D ). Bei Pascal halte ich einfach den Mund, da bin ich zu lange raus. Ich weis halt, das in VC++6.0 bis VC++2008 das was Du meintest vom Compiler nicht angemeckert wird.
     
  3. 0John0

    0John0 Kbyte

    So ist schon ein Weilchen her seit dem letzten Beitrag:D

    Ich habe gleich 3 Fragen :

    1.
    PHP:
    cin >> fahrenheit;
        
        
    celsius= (fahrenheit 32) * 5.0/9.0;

        
    cout << fahrenheit
             
    << " Grad Fahrenheit entsprechen "
             
    << celsius
             
    <<" Grad Celsius" << endl;
    Wie verhält sich das " ; " ? warum muss ich bei
    PHP:
    cin >> fahrenheit;
    das ; setzten aber bei
    PHP:
     cout << fahrenheit
    nicht?


    2.was genau ist
    PHP:
    cout.precision(1);
        
    cout << fixed;
    precision bezieht sich ja auf das runden des Ergebnisses.Was aber bewirkt der Befehl fixed?Und warum muss ich den quasi zur Ausgabe schicken?


    3. Wenn ich etwas kompilieren will,geht das in der Eingabeaufforderung ewig etwa 1min(!) aber manchmal geht es nur wenige sekunden?Was könnte das sein?

    So,ich hoffe jemand hat Zeit zum mir diese Fragen zu beantworten,danke schon mal im vorraus;)
     
  4. daboom

    daboom Megabyte

    Zu Frage 1:

    Code:
    [COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]cout [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]fahrenheit 
         [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#DD0000]" Grad Fahrenheit entsprechen " 
         [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]celsius 
         [/COLOR][COLOR=#007700]<<[/COLOR][COLOR=#DD0000]" Grad Celsius" [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]endl[/COLOR][COLOR=#007700];  [/COLOR][/COLOR]
    
    Das ist einfach eine Zeile, die auf mehreren Zeilen verteilt wurde, genauso könnte man auch schreiben:

    Code:
    [COLOR=#000000][COLOR=#007700][/COLOR][COLOR=#0000BB]cout [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]fahrenheit [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#DD0000]" Grad Fahrenheit entsprechen " [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]celsius  [/COLOR][COLOR=#007700]<<[/COLOR][COLOR=#DD0000]" Grad Celsius" [/COLOR][COLOR=#007700]<< [/COLOR][COLOR=#0000BB]endl[/COLOR][COLOR=#007700]; [/COLOR][/COLOR]
    
    Und es wäre dasselbe, nur weniger übersichtlich ;)
     
  5. 0John0

    0John0 Kbyte

    Ups :o ach ja stimmt ja.

    Manchmal sieht man vor lauter bäume den wald nicht mehr:rolleyes:
     
  6. 0John0

    0John0 Kbyte

    Was genau macht der Befehl dec?Was kann man damit alles machen?
    z.Bsp.
    PHP:
    long dec;
      
      
    cout << "Zahlen im Zehnersystem: ";
      
    cin >> dec;

    Wandelt der Ganzzahlen in Hexadezimalzahlen um?
     
  7. kazhar

    kazhar Viertel Gigabyte

    "dec" ist kein befehl, sondern der name einer variablen vom typ long.

    in deinem beispiel erwartet das programm eine eingabe und speichert die in der erw&#228;hnten variable
     
  8. 0John0

    0John0 Kbyte

    Mhm warum gibt den dieses Programm am Schluss eine Hexadezimalzahl aus?Ich sehe nicht ganz wo die Umrechnung geschieht?%x ist doch nur ein Platzhalter?

    PHP:
    int main()
    {
      
    long dec;
      
      
    cout << "Zahlen im Zehnersystem: ";
      
    cin >> dec;
      
      
    printf("Zahl im Hexasystem lautet %x \n",dec);

    return 
    0;
    }
     
  9. kazhar

    kazhar Viertel Gigabyte

  10. 0John0

    0John0 Kbyte

    Au Mann,hier im Buch ist %x unter Platzhalter aufgeführt.Aber in diesem Fall ist das nicht ganz korrekt,richtig?Denn die anderen welche hier aufgeführt sind,sind doch effektiv Platzhalter?Ich meine diese können ja nichts ausführen?
    zBsp.
    %d <-- oder wandelt dieses Hexadezimal zahlen in Ganzzahlen um?
    %s = Platzhalter für String
    %f = Gleitkommazahlen im Format 0000.0000
    %c = einzelnes Zeichen

    Oder habe ich das alles ganz falsch verstanden.Deinem Link bin ich gefolgt,aber leider (ich weiss ist nicht gerade vorteilhaft)kann ich noch zu wenig English um all die Erklärungen zu lesen.Obwohl die anderen %s und %f auf dieser Website auch in dieser Liste sind?:confused:


    :danke:
     
  11. kazhar

    kazhar Viertel Gigabyte

    c/c++ nimmt es mit den variablentypen nicht so genau. bei printf kommt quasi nicht ein "long" sondern nur "ein haufen bits" an. ob das jetzt als zahl, hex oder auch zeichen ausgegeben wird liegt an den "platzhaltern".
    PHP:
    #include "C:\MinGW\include\stdio.h"

    int main()
    {
      
    long dec;

      
    dec 123;

      
    printf("Zahl im Hexdezimalasystem: &#37;x \n"dec);
      
    printf("Zahl im Dezimalsystem:     %d \n"dec);
      
    printf("Zahl als Zeichen:          %c \n"dec);
      
    printf("Zahl als Gleitkommazahl:   %f \n"dec);

      return 
    0;
    }
    ergibt:
    PHP:
    Zahl im Hexdezimalasystem7b
    Zahl im Dezimalsystem
    :     123
    Zahl als Zeichen
    :          {
    Zahl als Gleitkommazahl:   0.000000
     
  12. 0John0

    0John0 Kbyte

    Hey danke vielmal,vorrallem auch für das gute Beispiel:jump:
    Jetzt ist mir das mit diesen "Platzhaltern" absolut klar!
     
  13. 0John0

    0John0 Kbyte

    Bei diesem Programm werden die Quadratzahlen 1-100 ausgegeben.Nach jedem Zehnerblock stoppt das Programm und geht erst weiter wenn man die Taste Enter dr&#252;ckt.
    Aber,wenn man zuerst 2Buchstaben eingibt und dann ENTER dr&#252;ckt gibt das Programm automatisch die n&#228;chsten 2 Zehnerbl&#246;cke aus.
    Wiso macht es das?und wie kann ich das verhindern?

    PHP:
    //schleife
    #include <iostream>
    using namespace std;

    int main()
    {

     
    int loop;
     
    int quadr;
     
    char zeichen;
     
    int stop 10;
     
     
     
      for (
    loop 1loop <=100; ++loop)
        {
            
    quadr loop loop;
            
    cout << "Das Quadrat von " << loop << " ist " << quadr << endl;
                        
                if(
    loop == 100)
                {
                
    cout << endl
                     
    <<  "Fertig!";
                }
                            
                    else if (
    loop == stop )
                        {
                        
    cout << endl <<  "Bitte dr&#252;cken sie Enter: " << endl
                        
    stop += 10;
                        
    cin.get();
                        }
        }
                        
            

        

     
    return 
    0;
    }
     
  14. kazhar

    kazhar Viertel Gigabyte

    das kommt daher, dass get nur 1 zeichen liest. wenn mehrere im eingabepuffer stehen, dann bleiben die drinnen bis zur n&#228;chsten abfrage. probier mal das cin.get(); durch

    cin.clear();
    cin.ignore(cin.rdbuf()->in_avail());
    cin.get();

    zu ersetzen. clear und ignore (sollten) den eingabepuffer resetten und l&#246;schen. das get findet dann einen leeren puffer vor und wartet auf die n&#228;chste eingabe
     
  15. 0John0

    0John0 Kbyte

    Danke
    Das funktioniert so.
    Aber ich verstehe deine Erklärung nicht ganz.

    Wenn ich buchstaben eingebe und dann ENTER drücken werden die Buchstaben gelöscht.Warum auch nicht der ENTER Befehl?Der ist doch auch mit den Buchstaben im Eingabepuffer?




    Ich hätte noch ein weiters Problem,warum funktioniert diese kleine Programm nicht?Wenn ich es ausführen will im Konsolenfenster kommt nur eine leere Zeile und dann kommt schon wieder der Pfad?
    PHP:
    //break anweisung
    #include <iostream>
    using namespace std;

    int main()
    {
        
    double eingabe;
        
        while (
    1)
        {
            
    cout << "Geben sie eine Zahl zum Berechnen ein (0=Beenden): ";
        
            
    cin >> eingabe;
            if (
    eingabe == 0)
                break;
            
            
    cout <<  "Das Quadrat von " << eingabe << " ist " << eingabe *eingabe;
        }

    return 
    ;
    }
     
  16. kazhar

    kazhar Viertel Gigabyte

    der ist doch zu dem zeitpunkt noch nicht im buffer :D

    abfrage bei 10: get() findet einen leeren buffer vor, wartet. die eingabe ist nur ein [enter]
    -> buffer enth&#228;lt vor get() 1x [enter], das wird von get() abgerufen, ergebnis von get() ist NICHTS (kein zeichen), buffer enth&#228;lt nach get() nichts

    abfrage bei 20: get() findet eine leeren buffer vor, wartet. die eingabe ist 123[enter]
    -> buffer enth&#228;lt "1", "2", "3", [enter], ergebnis von get() ist "1", buffer enth&#228;lt nach get() "2", "3", [enter]

    abfrage bei 30: der buffer enth&#228;lt daten, get() legt sofort los und daher ist keine eingabe m&#246;glich.
    -> buffer enth&#228;lt nach wie vor "2", "3", [enter], ergebnis von get() ist "2", buffer enth&#228;lt nach get() "3", [enter]

    etc...

    in der 2. variante wird vor get() der buffer gel&#246;scht und get() findet daher nichts vor und wartet auf die eingabe.

    zu deinem programm...
    ich hab ehrlich gesagt keine n&#228;here erfahrung mit der iostream geschichte. es kann sein dass "cin >> eingabe;" einen fehler produziert, weil du zeichen in eine zahlen-variable einliest. keine ahnung ob die bibliothek das online abfangen kann.

    probier mal aus "eingabe" ein zeichen (char) zu machen und mit "0" zu vergleichen. wenn das dann auch nicht klappt ist es so ein effekt.
     
  17. 0John0

    0John0 Kbyte

    Das geschieht ohne das reseten und ignorieren des Eingabepuffers.Also ohne die Befehle die du mir gegeben hast.So wäre es für mich auch nachvollziehbar. Richtig?
    Und mit deinen Befehlen wird eben dieser Buffer jedesmal zuerst gelöscht.Das eben nicht andere Zeichen schon drin sind,wie eben 1,2,3.Sondern der Buffer ist leer und wartet effektiv auf ENTER.
    Ok ich denke ich habe es verstanden:D mehr oder weniger;)

    Man und das andere Programm will einfach nicht.Ich habe das mit (char) probiert.Aber ich komme ja nicht mal zu einer Eingabe.Nichts einfach eine leere Zeile.Und das beste ist ja,das es eine fertige Lösung auf der Buch CD gibt.Und die sieht gnau gleich aus.Ich habe es x-mal miteinander verglichen.Aber mein Programm geht einfach nicht.Das von der Buch CD schon.Ich werde dieses Programm mal offen lassen.Den die (continue) -Anweisung funktioniert ja eigentlich genau gleich.Und diese hatte einwandfrei funktioniert.

    Ok dann danke ich dir wieder einmal für die Hilfe:D
    Der nächste Post kommt bestimmt;)
     
  18. 0John0

    0John0 Kbyte

    Wie versprochen kommt hier der nächste Post;)


    So ich bin nun bei der Objektorientiere Programmierung angekommen.
    Irgendwie habe ich den Durchblick nicht,vorrallem bei all diesen Begriffen


    Ich habe hier mal eine normale Klasse Aufbau

    PHP:
    //Klassen.cpp
    #include <iostream>
    using namespace std;

    class 
    vektor
    {
        public:
        
        
    // die Eigenschaften (Variabeln)
        
    int x;
        
    int y;

            
    vektor()         //Konstruktor
            
    {
             
    0;
             
    0;
            }

        
    //Die Verhaltensweisen (Methoden)
        
        
    void addieren(vektor v)
        {
            
    += v.x;
            
    += v.y;
        }

           
    void ausgeben()
           {
           
    cout << "(" << << "," << << ")";
           }
        
        
    };

    Die Eigenschaften sind eigentlich nichts anders wie Variable?


    Was genau macht der Konstruktor?
    Definiert dieser einfach die Variablen?


    Und die Methoden sind nicht anderes als Funktionen in einer Klasse?

    Doch nun kommt ein Satz aus dem Buch den ich nicht ganz verstehe.

    "Wenn Sie Methoden für Klassen aufsetzten, müssen Sie im Auge behalten, dass die Methoden später immer über Instanzen der Klasse aufgerufen werden"

    Was sind Instanzen?

    So ich hoffe jemand kann mir ein bisschen Klarheit in diese Sache bringen:)
     
  19. Fettbemme

    Fettbemme Halbes Megabyte

    Na da bist Du aber fleissig gewesen :)

    Kann ich verstehen....

    Ja eine Variable innerhalb der Klasse

    Der Konstruktor ist die erste Methode (ist der Konstruktor selber eine Methode....???) die aufgerufen wird. Im Konstruktor werden initialisierungen vorgenommen, damit die Klasse funktionieren kann. Da können z.B. Eigenschafen initialisiert werden, oder dynamischer Speicher den Du benötigst angefordert werden... usw. Mit variablen definieren hat das nichts zu tun.

    Der Destruktor ist zum aufräumen da, und es sollte z.B. angeforderter Speicher wieder freigegeben werden, Filehandles geschlossen werden und all solchge Dinge. Nachdem der Destruktor ausgeführt wurde fliegt die Klasseninstanz aus dem Speicher

    Ja

    Ich umschreibe es mal so und ziehe die Parallele zu einem struct.

    Wenn Du z.B. ein Stuct definierst das so aussieht:

    PHP:
    struct Beispiel
    {
      
    int Wert;
      
    int Array[4];
    };
    dann hast Du eben nur diese Struktur definiert. Du kannst nicht auf die Elemente zugreifen, da diese Stuktur im Speicher nicht existiert

    Wenn Du aber jetzt eine Variable des (Struktur) Typs "Beispiel" deklarierst, dann ist das wenn das struct eine Klasse wäre eine Instanz der Klasse.

    Das habe ich oben kurz erläutert.
     
  20. daboom

    daboom Megabyte

    Auch von mir ein Lob, immer sch&#246;n dran bleiben ;)

    Zum Thema "Instanzen":

    Man k&#246;nnte es auch "Individuum" nennen. Ein Klasse (In C++ ist ein struct sogut wie dasselbe) ist sozusagen nur der Bauplan f&#252;r etwas. Legst Du dann eine Instanz davon an, erh&#228;lst Du sozusagen ein Individuum mit einer bestimmten Auspr&#228;gung dieses Bauplans.

    Mein Lieblingsbeispiel f&#252;r objektorientiertes Programmieren: "Vierecke"
    Hier mal die Klasse "Rechteck":

    Code:
    class Rechteck {
      public:
        Rechteck(int pLaenge, in pBreite) {
          laenge = pLaenge;
          breite = pBreite;
        }
    
        public int getFlaechenInhalt() {
          return (laenge * breite);
        }
    
      private:
        int laenge;
        int breite;
    };
    
    Diese Klasse repr&#228;sentiert nun ein Rechteck, indem sie die L&#228;nge und Breite eines Rechtecks speichert. Damit ist ja ein Rechteck vollst&#228;ndig definiert. Diese beiden Werte k&#246;nnen ja v&#246;llig unterschiedlich (im Konstruktor) &#252;bergeben werden und je nachdem, was da dann angegeben wird, kommt halt eine andere Auspr&#228;gung eines Rechtecks heraus.

    Aber alle sind trotzdem von der Klasse "Rechteck".

    So, war mal wieder etwas ausf&#252;hrlicher. Ich hoffe, trotzdem verst&#228;ndlich ;)
     
Thread Status:
Not open for further replies.

Share This Page