Beiträge von Vevusio

    also so wie ich das verstehe

    du hast eine klasse mit einer variabel und du hast 2 weitere klassen die diese variable verändern

    du möchtest wenn sich die variable in einer der 2 klassen verändert sie sich auch in der anderen ändert

    hier mal ein kleines beispiel wie man es machen kann, die erklärung dazu schreibe ich darunter


    erstmals, wegen der übersicht hab ich nicht jede klasse in eine h und cpp datei unterteilt und nichtmal die implementierung von der deklarierung getrennt sondern alle funktionen sind gleich in den methodendeklarationen der klassen auch definiert, aber das spielt jetzt keine rolle

    anstatt die klassen ABC.. zu nennen hab ich es halt logisch gemacht dass deine A klasse Manager heißt, da sie die variable detector enthält

    dann gibt es B und C welche durch ProcessorA und ProcessorB repräsentiert werden und deine klasse D habe ich als eine abstrakte klasse Visualizer implementiert, bevor ich mit der erklärung anfange, ich schätze das wird schon so verwirrend genug für dich sein, also habe ich auf die verwendung von referenzen verzichtet und nur pointer benutzt, was referenzen sind hat man eh sofort kapiert wenn man das pointer konzept mal richtig begriffen hat also würden sie jetzt nur alles komplizierter machen

    das ganze sieht jetzt so aus, die Manager klasse hat einfach eine int variable

    ich weiß nicht ob du überhaupt schon mit pointern vertraut bist also versuche ich es von 0 weg zu erklären

    wenn ich

    Code
    int x;


    schreibe erstelle ich eine variable x vom typ integer, verändere ich x zb mit x = 4 dann nimmt x den wert 4 an, klar

    ein pointer ist wie der name schon sagt nichts anderes als ein zeiger auf eine variable, ein pointer wird mit * gekennzeichnet

    es kommen zwei neue operatoren hinzu wenn man mit pointern arbeitet und zwar * und &

    wobei * der dereferenzierungsoperator ist und & (ich hab ehrlich gesagt ka wie der operator heißt) operator holt dir die adresse/referenz/pointer von einer variable

    also


    diese pointer sind deswegen da weil wenn ich einen pointerToX1 habe und einen pointerToX2 und beide zeigen auf x und ich x ändere (entweder über x = 4; oder über *pointerToX1 = 4; oder *pointerToX2 = 4) dann naja.. ändere ich halt x und weil die beiden pointer auf x zeigen ändert sie sich demnach für beide pointer

    und so machen wir das

    die manager klasse hat ne detector variable, processora und processorb haben jeweils einen pointer auf die detector variable der manager klasse

    alles was jetzt noch zu tun ist, ist den beiden pointern die adresse der detector variable zuzuteilen, weil data encapsulation ein grundprinzip der oop ist das nicht verletzt werden sollte machen wir die variablen also nicht public sondern erstellen get und set methoden und das ganze läuft jetzt so ab

    die manager klasse hat eine associate funktion die einen pointer auf einen pointer bekommt... also ein zeiger auf einen zeiger auf einen integer (ich schreibe pointer im code immer mit einem p davor, ein pointer auf einen pointer mit p2, pointer auf pointer auf pointer mit p3 usw...)
    dieser pointer auf den pointer auf den integer wird dereferenziert

    also wenn wir int** dereferenzieren bekommen wir ein int* und diesem int* weisen wir jetzt die adresse von detector zu über &detector

    aber wieso zur hölle wird ein int** übergeben? die antwort darauf ist: damit ich den pointer verändern kann.... wenn ich blos einen int* übergeben würde als parameter, wir erinnern uns ein parameter wird als value type übergeben und somit das objekt kopiert, und dann weise ich int* etwas zu dann hätte ich blos die kopie des parameters geändert

    so ähnlich als wenn ich habe

    int x;

    fkt(int x)
    x = 4;

    und ich rufe fkt auf und gebe nach dem aufruf x aus dann ist es nicht 4, weil in der funktion eine kopie von x angefertigt wurde lediglich

    wenn ich also x verändern will müsste ich einen pointer auf x übergeben und den dereferenzierten wert von x ändern dann wäre x auch nach dem funktionsaufruf 4

    int x;

    fkt(int* x)
    *x = 4;

    genauso ist es mit pointern, wenn ich den pointer selbst ändern will muss ich einen pointer auf den intpointer übergeben und diesen dereferenzieren und den intpointer ändern... naja das muss man mal verdauen um es zu verstehen

    jedenfalls erstellen wir in der main einen int** detector, assoziieren den intpointer über die associate methode der manager klasse und dann weisen wir den pointer processora und processorb zu

    das war auch die ganze zauberei dahinter (als wenn das nicht genug wäre *g*).. jedenfalls wenn jetzt detector entweder in manager oder processorA oder processorB geändert wird wird er halt überall geändert

    und ja.. diese visualisierungsklasse hat einfach eine statische methode um ihn auszugeben und nur die manager klasse hat eine get funktion für detector, aber natürlich kannst du detector jetzt einfach in processora oder processorb verwenden, du musst ihn nur einmal dereferenzieren so wie in der changevalue methode

    *m_pDetector = newValue * newValue;

    das ist genauso wie mit dem *x = 4;.. am ja und.. lass dich jetzt nicht von dem * zwischen den newValues verwirren :) das ist einfach nur ein mal zeichen, processorA tut bei change value das quadrat von der überegeben zahl detector zuweisen und processorb 2 * die übergeben zahl

    hm... hör ich zum ersten mal, ich habs grad getestet und unter c# geht das garnicht mehr, man bekommt eine invalid term exception wenn man das komma so verwendet, würde mich auch überraschen wenn es das in java gibt

    da mir die verwendung von dem auch nie untergekommen ist in irgend einem beispielprogramm oder so nehm ich mal an dass das ding sich irgendwo in der goto grauzone bewegt und sowieso nicht verwendet werden soll

    achja genau, 2 sachen noch

    1)

    int a, b, erg; <- man sollte keine globalen variablen verwenden, wenn man mehr als eine cpp file hat sind die dann unbekannt in den anderen files, man muss sich mit extern herumplagen, und es verursacht alles in allem nur probleme, wenn schon würde ich wenn ich unbedingt globale variablen in einem größeren projekt brauche eine abstrakte klasse erstellen und die variablen + helferfunktionen static machen aber so ist es jedenfalls schlecht

    2)

    Code
    int ggt(int a, int b);
    
    
    int ggt (int a, int b){
    ...
    }

    wenn du die funktion schon vor der main definierst dann brauchst du nicht zuerst eine deklaration und dann die definition zu schreiben sondern du kannst es gleich in einem machen also blos

    Code
    int ggt (int a, int b){
     ...
     }

    diese unterteilung in definition - deklaration macht man wenn man die funktionen in .h files deklariert und sie in cpp files definiert bzw vor der main in der cpp deklariert und nach der main definiert (wenn man kleine programme hat die nur aus ein paar funktionen bestehen)

    hm.. wieso spuckt der compiler bei
    Label1->Caption=IntToStr(TrackBar1->Max),(TrackBar1->Position=TrackBar1->Min);


    denn keinen fehler aus?
    das ist syntaktisch doch falsch oder?!


    bzw lässt sich so nicht einfach sagen wieso der regler sich nicht verschieben lässt, das kommt auf die GUI an in der du das programmierst, schau dir doch einfach ein paar tutorials an die du bei google raussuchst, zu MFC beispielsweise gibts da hunderte davon wo alles gut erklärt ist

    wenn du eigentlich nicht weißt was du da für code schreibst ist es überhaupt keine so tolle idee zu versuchen fenster, regler und all das zeug einzubinden weil du nichts dabei lernst wenn du nicht die gedankengänge dahinter verstehst, dass ein regler attribute hat und funktionen die die pos ändern etc etc

    das b wird einfach als parameter übergeben... mehr ist das nicht und mehr macht es auch nicht

    die funktion selbst ist rekursiv, ruft sich also selbst immer wieder auf, wieso man auf die art den größten gemeinsamen teiler ermitteln kann musst du dir halt überlegen oder auf dem geposteten link durchlesen, aber wenn dich deine neugier nicht gerade umbringt.... würd ich das einfach so hinnehmen da rekursion wenn man mit programmieren anfängt erstmal nicht so wichtig ist, man kann es einfach mal hinnehmen "aha ja die funktion ruft sich selbst auf, das ist rekursion"

    ja und was ist dabei die frage bzw die aufgabenstellung?

    bzw verstehe ich nicht was bei sum() das % Use the built-in relation plus(X,Y,Z), e.g. plus(1,2,3).

    bedeuten soll, soll zu dem ersten element der liste L x, zu dem zweiten y, zu dem dritten Z addiert werden oder sollen die elemente x, y, z hinten angehängt werden an die liste oder wie


    ein hash-wert ist nicht eindeutig, sondern mehrdeutig. es gibt mehrere inputs, die sich auf ein und denselben hash-wert abbilden lassen. daher kann man einen string, ein file oder einen anderen input nicht an seinem hash-wert identifizieren.

    hash-werte können dazu genutzt werden die suche nach werten zu beschleunigen, oder datenübertragungsfehler aufzuspüren oder passwörter mehr oder weniger sicher abzuspeichern.

    äh.. ist nicht genau das der punkt bei hashes, dass es keine 2 inputs gibt die denselben hash ergeben, das ist ja der sinn davon

    "daher kann man einen string etc nicht an seinem hash wert identifizieren" und nen absatz darauf steht da dass passwörter so sicher abgespeichert werden können

    wozu sollte ich ein passwort als hash abspeichern wenn ich
    a) ein zweites passwort oder mehrere passwörter hätte die denselben hash ergeben
    b) ich das referenzpasswort nicht identifizieren könnte am hash

    drum geht es doch überhaupt zb beim CHAP protokoll, der server hat die passworter abgespeichert, er schickt mir ne challenge die ich zum hashen meines pws verwende, verschicke das gehashte pw und der server hasht das pw was er in der datenbank hat ebenfalls mit der challenge und vergleich die hashes
    wenn jemand die challenge und den hash mitgesnifft haben sollte nützt ihm das nix weil er den hash nicht rückgängig machen kann

    also inwiefern kann man eine datenmenge nicht am hash identifizieren? man hasht sie einfach nochmal und vergleicht die 2 hashes und hat sie identifiziert, man muss nur wissen mit welchem hash algorithmus

    ---

    ich verstehe nicht wieso man an der normalen uni c++ macht und an der tu java.. was ist da der hintergrundgedanke dabei wenn es sowieso derselbe stoff ist ca?

    hallo, ich hab mal das erste beispiel gemacht in c++.. oder eigentlich c... naja c ist es aber nicht weil die std verwendet wird und das ist c++ aber egal..

    jedenfalls hab ich keine klassen gemacht oder so sondern nur funktionen und alles in eine .cpp datei reingetan auch ohne .h dateien weil ich nicht wiess wie weit ihr seit

    das ganze ist überfüllt mit kommtentaren die wirklich fast jeden mist erklären sollten

    ka allerdings wie das zweite beispiel gehen soll weil ich ka hab was dieses siebdings sein soll und auch keine lust, aber

    wenn ihr rausfinden wollt ob eine zahl eine primzahl ist geht das eigentlich ganz einfach so, vielleicht ist das ja eh gemeint

    also irgendwas in die richtig


    irgendwie so müsste das gehen, falls ihr es nicht versteht dann lest euch beispiel #1 durch danach sollte das klar sein


    achja, und ich wollte euch noch fragen in welchem semester ihr seid und was ihr studiert
    wir machen nämlich in eprog 1 semester wo es ja für alle informatik studien gleich ist java und ich würde eigentlich
    auch viel lieber c++ machen und das ist ja das informatik studien forum für eprog etc oder bin ich hier falsch?!

    genau, du machst es entweder so wie kub geschrieben hat und verwendest die std, dabei musst du übrigens einige std includes machen, dann geht das ganze recht einfach


    oder wenn du lieber bei c bleiben möchtest dann geht das auch ganz einfach mit


    der vorteil bei der zweiten methode ist dass du deinen string wenn du dich mit diesen ganzen formatierungszeichen auskennst so formatieren kannst wie du willst, zb immer auf 5 nachkomma stellen ausgeben

    wenn du übrigens den std::string nimmst und irgendwie an ein char[] rankommen willst wieder dann machst du das mit der .c_str() methode

    ein hash ist ein code der bestimmte daten eindeutig identifizieren soll

    es gibt etwas das heißt hashalgorithmen von denen MD5 zb ein ganz bekannter ist, diese generieren über eine meist große datenfolge (zb ein bild, eine zeichenkette usw) einen viel kleineren hash der trotzdem die eigenschaft hat dass er einzigartig ist

    wenn ich zb den string "das ist ein test!" hashe kommt dabei raus -1100477139
    wenn ich nur einen buchstaben änder, zb "das ist kein test!" wird der hash so: -2018157948

    das ist noch eine eigenschaft von hashes, kleine änderungen im der datenmenge über die er gebildet wird bewirken dass sich der hash überhaupt ganz ändert

    wofür werden hashes jetzt vernwendet?
    wenn du beispielsweise auf manchen seiten exe files zum runterladen hast sieht du manchmal daneben so nen komischen langen string mit zahlen und buchstaben, das ist ein hash der über die exe gebildet wurde, wenn du die exe file von einem mirror runterladest kannst du selbst einen hash drüberlaufen lassen und wenn der nicht mit dem referenzhash auf der anbieterseite übereinstimmt dann ist es nicht dieselbe exe file (andere version, jemand hat nen virus reingetan etc)

    eine weitere verwendungsmöglichkeit von hashes währe beispielsweise wenn du ein programm hast das bilder in den speicher ladet, jedesmal wenn du ein bild reinladest hashst du den inhalt und vergleichst den hash mit allen hashes der schon geladenen bilder, wenn es bereits einen hash gibt der gleich ist wie der mit dem du vergleichst weisst du dass das bild schon im speicher ist und ladest es nicht mehr neu rein

    es gibt auch etwas das sich hash table nennt, das ist mehr oder weniger ein array dessen elemente immer wertepaare sind, ein paar enthält einen hash (id) und den wert mit dem der hash assoziiert wird dabei müssen nich zwangsläufig wirklich die hashes über den wert gebildet werden sondern als hash/id kann auch einfach eine zahl genommen werden die immer erhöht wird

    also ganz kurz gefasst, hash = relativ kleine zahl (bei md5 128 bit) die eine beliebig große datenmenge (beispielsweise eine 10mb große bitmap) eindeutig identifiziert

    hashalgorithmus -> wird verwendet um über die datenmenge einen hash zu erzeugen

    wenn du das in c# machst gibts beispielsweise für jedes objekt einfach ne methode .GetHashCode() die dir den hash holt, in c/cpp würde ich mal in der std schauen obs da nicht sowas gibt ansonsten gibt es sicher genügend libs die du einfach inkludieren kannst und über ne funktion nen md5 hash über einen char* buffer an daten bilden kannst

    alleine würd ich sowas nicht implementieren.. wozu auch wenns das schon tausendfach besser ausgeführt gibt