Zum Inhalt springen

Orffi

Mitglieder
  • Gesamte Inhalte

    252
  • Benutzer seit

  • Letzter Besuch

Beiträge von Orffi

  1. char *str;

    reserviert nur Speicher für einen Zeiger vom Typ char. Das bedeutet, daß er nur auf Speicherplatz zeigen sollte, der ordnungsgemäß angefordert wurde. In dem Fall:

    str = "Hallo Welt!";

    erledigt das der Compiler. Wenn man einen zweiten String im Programm ausgeben möchte, muß für den auch schon irgendwo Speicherangefordert worden sein.

    Wenn man also schon in C++ programmiert, dann sollte man sich daran erfreuen, daß C++ objektorientiert ist und eine STL (Standard Template Library) mitbringt. Das bedeutet für die Frage: man kann die Klasse string aus <string> benutzen. Dann muß man sich auch nicht um das leidige Thema der Speicheranforderung/-freigabe kümmern.

    HTH

    Jan

  2. Ich bin auch noch nicht lange dabei und weiß folglich nicht, was "gebeagolscht" bedeuten soll. Allerdings bin ich auch der Meinung, daß es vielleicht nicht die beste Lösung ist, hier über Beagols Verhalten zu diskutieren. Aber ich bin auch der Meinung, daß ein Moderator, egal ob in "seinem" oder in einem anderen Forum, Vorbildfunktion haben sollte. Wenn dem nicht so sein sollte, würde ich es doch arg befremdlich finden. Und ehrlich gesagt, finde ich nicht, daß er sich besonders vorbildlich verhalten hat. Man hätte das Ganze auch anders beenden können. Ich fand es jedenfalls schon ein wenig arg komisch als ich meinte, es gebe keinen Grund persönlich zu werden und dann noch meinen Standpunkt zu der Geschichte darstellte, gleich ein Kumpel von EvilInside zu sein. Meine Freunde suche ich mir immer noch selber aus. Aber wahrscheinlich war das auch "gebeagolscht"...

    Was aber (für mich) des Pudels Kern der ganzen Diskussion ist: Es geht darum, ob die Benutzer dieses Forums wirklich der Meinung sind, daß man immer nur Komplette Lösungen posten sollte. Ich bin da der Meinung, daß das der falsche Weg ist. Denn: "Selber denken macht schlau!" Das ist keine Aussage von mir, sondern von einem Mathematik-Professor. Und wenn man darüber nachdenkt, dann wird man feststellen, daß in dem Satz eine Menge Wahrheit drinsteckt. Es kann meiner Meinung nach nur Sinn machen, den Fragenden auf den richtigen Weg zu führen und nicht immer komplette Lösungen zu posten. Dennn dann lernt derjenige am wenigsten.

    Ich denke nicht, daß ich hier bin um die "Hausaufgaben" der Benutzer des Forums zu machen. Und ich bin nicht hier um Fragen zu stellen. Ich bin hier, weil ich helfen möchte.

    Jan

  3. Das Formular, auf dem dein Eingabefeld liegt, hat eine Funktion wie FormCreate (nennt sich auch konstruktor bzw constructor)...

    Das ist leider nicht richtig! Die Funktion FormCreate wird auf das Ereignis OnCreate aufgerufen. Ein Konstruktor wird beim Erzeugen des Objekts aufgerufen. Es ist zwar egal, wo man es nun hineinschreibt, aber es ist nicht das Gleiche!

    Jan

  4. Wenn Du schon weißt, daß Du persönlich wirst, dann laß es doch einfach. Ich glaube nicht, daß es notwendig ist hier persönlich zu werden. EvilInside hat eine Meinung, die er gesagt hat und Du hast offensichtlich eine andere. Das ist ja in Ordnung, nur sollte man dies doch bitte auf einer sachlichen Ebene klären. Vor allen Dingen wenn man Moderator ist.

    Und nun zur Aussage von EvilInside:

    Er hat doch gar nicht gesagt, daß in Foren nicht geholfen werden soll. Wenn Du mal seine Beiträge anschaust, dann wirst Du feststellen, daß er Lösungen zu Problemen anbietet. Es geht hier auch gar nicht so sehr um die Geschichte, ob es etwas privat oder beruflich ist. Es geht darum, daß es hier kein Problem ist, sondern daß es zur Aufgabe eines Webseiten-Entwickler gehört, die Seiten zu testen. Nun kann man zurecht sagen, daß Du die User ja nur gebeten hast, aber ich finde auch, daß es eigentlich nicht hierher gehört.

    Mir ist übrigens neu, daß Mitglieder in Foren die "Hausaufgen" der anderen machen. Jedenfalls in den Foren/Newsgroups in denen ich mich herumtreibe ist das nicht der Fall (wenn man mal von Fachinformatiker.de) absieht.

    Jan

  5. Du hast Du zwei Möglichkeiten:

    Als erstes kannst Du mit TMaskEdit im Bereich Zusätzliches arbeiten. Dort gibt es im Objektinspektor eine Eigenschaft EditMask. Dort kannst Du ein paar Sachen festlegen.

    Zweite Möglichkeit:

    LONG dwStyle = GetWindowLong ( Edit1->Handle, GWL_STYLE );

    Hier sicherst Du die alten Style-angaben vom Edit-Feld (hier Edit1). Danach benutzt Du das logische oder um, den Style "nur Zahlen" (ES_NUMBER) hinzuzufügen.

    SetWindowLong ( Edit1->Handle, GWL_STYLE, dwStyle | ES_NUMBER );

    HTH

    Jan

  6. Computerbücher gibt es meistens in gedruckter Form bei einem gut sortierten Computerbuch-Händler. Wenn man etwas bestimmtes haben möchte, das Geld kostet, dann sollte man auch bereit sein, dafür den entsprechenden Betrag zu zahlen. Wenn man kein Geld ausgeben will, dann muß man halt im Netz mit den kostenfreien Möglichkeiten leben.

    Noch eine kleine Bemerkung zu der "... in 21 Tagen" Reihe: Ich finde die Reihe nicht so wirklich glorreich. Dieses spezielle Buch kenne ich nicht, war aber sehr enttäuscht von Borland 5 in 21 Tagen.

    Jan

  7. nic_power hat schon recht: mit einem Beispiel wirst Du da nicht weit kommen. Ehrlich gesagt versuche ich auch immer noch dahinter zu kommen, was Du nun genau suchst. Beispiele/Aufgabenstellungen in denen statt "call by value" "call by reference" benutzt wird. Beispiele, bei denen man nur mit Zeigern zum Ziel kommt oder Beispiele die speziell auf Speicheranforderung zur Laufzeit abzielen.

    Jan

  8. Bitte poste mal ein Minimum von Code zu dem Beispiel. Ich weiß nicht, wo genau Dein Problem liegt. Es wäre schön, wenn man Dein Beispiel hätte und es daran erklären könnte. Dann lassen sich auch besser Aufgaben zu Deinem speziellen Problem finden.

    Jan

  9. Ich hatte bei meinen C++-Buildern immer ein "Plakat" mit den der Klassenhierachie dabei. Ansonsten finde ich die Hilfe sehr nützlich.

    Wie meinst Du das: Sind die Komponenten identisch? Der C++ Builder hängt in den Versionen immer etwas hinterher. Aber die VCL ist ja in Pascal (Delphi)-Code geschrieben. Die Standardkomponenten sind gleich, Du kannst also die gleichen Programme schreiben. Und in den neueren Versionen von Borland kannst Du mit BCB geschriebene Komponenten auch in Delphi verwenden.

    HTH

  10. Da ISO-C++ keinen Garbage Collector mitbringt, muß der Programmierer dafür sorgen, daß dynamisch reservierter Speicher wieder freigegeben wird. Man wird also zu jedem new ein delete im Quellcode finden. Leider sieht die Welt nicht immer ganz so einfach aus. Ein kleines Beispiel: Man hat eine Funktion, die Speicher dynamisch anfordert und am Ende wieder freigibt. Allerdings wird mitten in der Funktion, also zwischen new und delete, eine Exception ausgelöst.

    
    void f (void)
    
    {
    
       X *obj = new X();
    
       //mache irgendetwas...
    
       throw std::exception ();
    
       delete obj;
    
    }
    
    
    (Am Ende steht der komplette Quelltext, der auch kompilierbar ist.) Bei einem solchen Problem kommt der auto_ptr aus <memory> zum Einsatz. Denn, wie jeder leicht sieht, wird der Speicher nicht freigegeben und man hat ein Speicherloch, denn man hat keine Möglichkeit mehr auf den Speicher zuzugreifen, um ihn wieder freizugeben. Folgender Code hat so ein Speicherloch nicht:
    
    void g ( void )
    
    {
    
       std::auto_ptr<X> obj ( new X ( "auto" ) );
    
       throw std::exception ();
    
    }
    
    
    auto_ptr<> ruft den Destruktor des Objekt, welches er hält, automatisch auf, wenn die auto_ptr Variable den Sichtbarkeitsbereich verläßt. Die Funktion also normal verlassen wird oder durch eine Exception. Da ein auto_ptr nicht besonders schlau ist, kann er keine Referenzen zählen oder sonstwie herausfinden, wer nun auf das Objekt noch zeigt oder nicht. Deswegen passiert etwas sehr interessantes, wenn man einen auto_ptr in einen anderen kopiert. Nach: std::auto_ptr<X> obj2 = obj1; ist obj1 (was auch ein auto_ptr ist) NULL. Kopien von auto_ptr sind also alles andere als gleich!!! Niemals, wirklich niemals sollte man auf die folgende Idee kommen: std::vector<std::auto_ptr<X>> v; sort ( v.begin(), v.end() ); Hier wird intern natürlich hin- und herkopiert, um den Vector zu sortieren. Und bei jeder Kopieraktion ist das Original ein NULL-Pointer! Dies gilt übrigens nicht nur für vector sondern für alle Standard Container. Wie in Funktion i() (siehe unten) zu sehen ist, wird der auto_ptr wie ein ganz normaler Zeiger benutzt. Mit release() gibt der auto_ptr die Verwaltung für das Objekt auf. Man muß sich dann wieder selbst um die freigabe kümmern. Mit reset ('Objekt') kann man dem auto_ptr ein neues Objekt in die Obhut geben. Dabei wird das alte Objekt freigegeben. Hier nun ein komplettes Programm, das vielmehr erklärt als der ganze Text:
    
    #include <iostream>
    
    #include <memory>
    
    #include <string>
    
    #include <exception>
    
    
    class X
    
    {
    
          std::string name;
    
       public:
    
          X ( std::string );
    
    
          ~X ()
    
         {
    
            std::cout << "Destruktor Y: " << name << '\n';
    
         }
    
    
         std::string getName ()
    
         {
    
            return name;
    
         }
    
    };
    
    
    X::X ( std::string n) : name ( n )
    
    {
    
       std::cout << "Konstruktor Y: " << name << '\n';
    
    }
    
    
    void f ( void )
    
    {
    
       X *obj = new X ( "normal" );
    
       throw std::exception ();
    
       delete obj;
    
    }
    
    
    
    void g ( void )
    
    {
    
       std::auto_ptr<X> obj ( new X ( "auto" ) );
    
       throw std::exception ();
    
    }
    
    
    void h ( void )
    
    {
    
    	std::auto_ptr<X> obj1 ( new X ( "obj1" ) );
    
    	{
    
    		std::auto_ptr<X> obj2 = obj1;
    
    	}
    
    	std:: cout << "^ Fuer obj1 wurde der Destruktor schon aufgerufen!?!\n";
    
    	// weil das Original nach der Kopieraktion auf NULL zeigt.
    
    }
    
    
    void i ( void )
    
    {
    
    	std::auto_ptr<X> obj1 ( new X ( "Horst" ) );
    
    	std:: cout << "Name des Objekts: " << obj1 -> getName () << '\n';
    
    	obj1.reset ( new X ( "Karl" ) );
    
    	X *obj2 = obj1.release();
    
    }
    
    
    int k ( void )
    
    {
    
       std::auto_ptr<X> obj1 ( new X ( "Hugo" ) );
    
       X *obj2 = obj1.release();
    
       delete obj2;
    
    }
    
    
    int main ( void )
    
    {
    
       try { f(); }
    
       catch ( std::exception &e )
    
       {
    
          std::cout << e.what () << '\n';
    
       }
    
       std::cout << "normal wird nicht freigegeben...\n";
    
       try { g(); }
    
       catch ( std::exception &e )
    
       {
    
          std::cout << e.what () << '\n';
    
       }
    
    
       h ();
    
       i ();
    
       std::cout << "Karl wird nicht freigegeben...\n";
    
       k ();
    
    
       return 0;
    
    }
    
    

    HTH

    Jan

  11. Ich habe jetzt nicht ganz vor Augen, wie Dein Quelltext aussieht und was Du wann machen willst. Aber Du hast ein TEdit (edtLadeU) Dort sollen Zahlen eingegeben werden, die Du dann mit StrToFloat in eine Fließkommazahl umwandelst. Das schließe ich jetzt einfach mal aus Deiner Exception. Diese Exception wird, wie Du schon richtig bemerkt hast, geworfen wenn ein leerer String in float (StrToFloat gibt long double zurück) umgewandelt werden soll. Aber auch bei "abc" wird natürlich eine Exception geworfen, weil auch "abc" nicht in float umgewandelt werden kann. Wenn Du jetzt eine OnClick-Methode für einen Button hast, die mit der Zahl von edtLadeU Berechnungen durchführen soll, dann kannst Du folgendes tun:

    
    if ( Edit1 -> Text == "" )
    
    {
    
       Application -> MessageBox ( "Kein Wert in LadeU!", "Fehler", MB_OK );
    
       edtLadeU -> SetFocus ();
    
       return;
    
    }
    
    float LadeU = StrToFloat ( edtLadeU -> Text );
    
    //...
    
    
    Dies prüft wie gesagt nur, ob Du überhaupt etwas eingegeben hast. Oder Du arbeitest komplett mit Exceptions, was ja auch ganz schön ist:
    
    float LadeU;
    
    try
    
    {
    
       LadeU = StrToFloat ( Edit1 -> Text );
    
    }
    
    catch ( EConvertError &e )
    
    {
    
       Application -> MessageBox ( e.Message.c_str(), "Fehler", MB_OK );
    
       edtLadeU -> SetFocus ();
    
       return;
    
    }
    
    //keine Fehler... Berechnung kann durchgeführt werden...
    
    

    HTH

    Jan

  12. Ein Garabage Collector macht mehr. Wenn ich zwei auto_ptr x und y habe und x=y schreibe, dann ist y danach ein Null-Pointer.

    Das ist eine sehr, sehr kurze Antwort, ich werde später einen neuen Thread aufmachen und ein wenig dazu schreiben.

    Jan

  13. edtLadeU ist also vom Typ TEdit, das solltest Du dazuschreiben. Denn dann ist edtLadeU == "" tatsächlich Unfug. Aber was sicherlich funktioniert ist folgendes:

    if ( edtLadeU -> Text == "" )

    //...

    if ( edtLadeU == 0 ) ist auch keine tolle Idee (zumindestens in diesem Zusammenhang). Hier wird nur geschaut, ob edtLadeU kein Null-Zeiger ist. Davon darf man ruhig ausgehen, es sei denn, Du hast das TEdit zur Laufzeit erzeugt.

    HTH

    Jan

  14. Es gibt folgende Bit-Operatoren:

    & (und), | (oder), ^ (exclusives oder), ~ (komplementär), << (bitshift nach links), >> (bitshift nach rechts)

    char byte = ~0; ergibt -1, da alle bits umgedreht werden, aus einer 1 wird eine 0 und aus einer 0 wird eine 1. Da wir uns im 2er Komplementsystem befinden, wird die -1 mit lauter einsen dargestellt.

    byte = 1;

    byte <<= 1; alle bits werden um eins nach links verschoben. In diesem Fall nur sichtbar die 1. Aber es werden auch die Nullen verschoben. Die letzte Null fällt hinten raus. Vorne wird eine Null nachgeschoben. Es wird aber immer eine Null nachgeschoben, selbst wenn hinten eine 1 wegfällt. (Das Ergebnis ist byte ==2.)

    byte1 = 1;

    byte2 = 2;

    byte7 = byte1 & byte2;

    byte == 0, da nur an den Stellen eine 1 gesetzt wird, wo in beiden Variablen eine 1 steht. Also an Stelle x muß in byte1 UND in byte2 eine 1 stehen. Diesen Fall haben wir aber nicht.

    byte1 = 1;

    byte2 = 2;

    byte7 = byte1 | byte2;

    byte == 3, da eine 1 gesetzt wird wenn an Stelle x in byte1 ODER in byte2 eine 1 steht.

    byte1 = 1;

    byte2 = 3;

    byte = byte1 ^ byte2;

    byte == 2, da beim XOR eine 1 gesetzt wird, wenn entweder in byte1 oder in byte2 eine 1 steht. Wenn aber an beiden Stellen eine 1 steht, wird eine Null geschrieben. In diesem Fall steht an erster Stelle beides Mal eine 0.

    HTH

    Jan

  15. Wenn man sich nicht einig wird, wer den Speicher wieder freigibt, dann kann man ja einen Autopointer (auto_pr) aus <memory> benutzen. Diesen gibt es nur in C++, aber wenn ich das richtig sehe, darf es ja C++-Code sein. Dieser auto_ptr sorgt dafür, daß der Destruktor aufgerufen wird, wenn man keine Referenz mehr darauf hat. Es ist aber bei weitem noch kein Smartpointer (was so etwas wie ein Pointer mit Garbage Collector wäre.) Es fehlt noch eine ganze Menge dazu. Wenn es von Interesse ist, also nicht zu weit vom Thema wegführt, kann ich ein paar Zeilen dazu schreiben.

    HTH

    Jan

  16. "Kann mir dazu jemand etwas schreiben ?? Ist wirklich wichtig !!" Was möchtest Du denn wissen? Ich glaube keiner wird Dir eine komplette Arbeit zuschicken.

    Man kann sich aber mal ein paar Gedanken machen:

    * Verschlüsselung soll Informationen verschlüsseln.

    * Was sind Informationen?

    * Informationen sind nicht nur die Botschaft selbst, sondern auch bestimmte Häufigkeiten von Buchstaben, die in der Nachricht vorkommen

    * Die verschlüsselte Botschaft sollte möglichst wenig Struktur haben.

    *Wie zerstöre ich Struktur?

    Diese Fragen decken nur einen kleinen Teil ab. (Kryptographie ist auch kein Thema, das man im Vorbeigehen abhandelt.) Sie zielen hauptsächlich auf "One Time Pad" ab. Und erklären warum man Zufall braucht.

    Zufallszahlen braucht man für Schlüssel. Warum diese Zahlen zufällig sein sollten, kannst Du Dir jetzt ja mal überlegen.

    Gut verschlüsselte Dateien lassen sich übrigens sehr schlecht komprimieren. Warum? Die Struktur wurde aufgrund von Zufall "platt" gemacht.

    HTH

    Jan

  17. Natürlich wird LaTeX noch eingesetzt. Es ist nur die Frage wo man schaut. Mir würde es auch nicht im Traum einfallen, einen Brief mit LaTex zuschreiben. Obwohl es sogar vorgefertigte "Klassen" dafür gibt. Aber für wissenschaftliche Arbeiten ist es schon sehr cool. Vor allen Dingen setzt es die Fußnoten dahin, wo sie hingehören.

    Ich denke aber auch, daß sich für ein LaTex-Forum zu wenig Benutzer finden würden. Hier ein Link zum LaTeX-Kochbuch: http://www.uni-giessen.de/hrz/tex/cookbook/cookbook.html

    Ansonsten kommt es darauf an, wie abgefahren Deine Frage ist. Ich kann versuchen, Dir zu helfen. Wobei ich ich keine Garantie geben kann, daß ich tatsächlich hilfreich bin. Wenn uns jetzt ein Admin verrät, welches Forum das beste wäre, könnten wir es versuchen.

    Jan

  18. Die Länge des Arrays bekommst Du über folgenden Ausdruck:

    int lenArray = sizeof ( myArray ) / sizeof ( char* );

    Natürlich kannst Du in myArray[0] nur Strings speichern die maximal so lang sind wie "text2". Ähnlich verhält es sich mit den anderen beiden Einträgen im Array. "Echte" Strings bekommst Du in C++ mit der Klasse string. Allerdings kennt C keine Strings, da mußt Du Dir mit new helfen, um dynamisch Texte speichern zu können.

    HTH

    Jan

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...