Willkommen auf myCSharp.de! Anmelden | kostenlos registrieren
 | Suche | FAQ

Hauptmenü
myCSharp.de
» Startseite
» Forum
» Suche
» Regeln
» Wie poste ich richtig?

Mitglieder
» Liste / Suche
» Wer ist online?

Ressourcen
» FAQ
» Artikel
» C#-Snippets
» Jobbörse
» Microsoft Docs

Team
» Kontakt
» Cookies
» Spenden
» Datenschutz
» Impressum

  • »
  • Portal
  • |
  • Mitglieder
Beiträge von Traumzauberbaum
Thema: Externes Programm mit Anführungszeichen starten
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Schonmal probiert was auf die Art zu starten?

Probier mal über Ausführen "cmd /k echo test" mit Anführungszeichen...
Oder probiers in nem Command Prompt einzugeben...

Da kommt nur Mist raus.

Thema: Gauss-Seidel Algorithmus
Am im Forum: Rund um die Programmierung

Also der Algorithmus scheint mir eine Annäherung zu sein.
In deinem Code iterierst du über eine feste Anzahl an Schritten. Der Algorithmus auf Wikipedia bricht erst dann ab, wenn die Änderung im aktuellen Schritt unter eine bestimmte Grenze fällt.

Außerdem stört mich auch diese Zeile:
tmpArr = resArr;

In der Schleife über i berechnest du doch sowieso nur die i-te Komponente des Vektors. Das Array zu kopieren ist also völlig unnötig, es kann sich nur an der Stelle i verändert haben.

Ich würde also folgendes daran ändern:
1. iSteps musst du uminterpretieren als eine maximale Anzahl an Schritten. Sprich im schlechtesten Falle macht er iSteps Iterationen, aber er kann auch schon vorher aufhören wenn eine Konvergenz erreicht ist. Dementsprechend hoch müsstest du iSteps anlegen um ein gutes Ergebniss zu bekommen.

2. tmpArr = resArr; kopiert nicht den Inhalt, sondern nur die Referenzen. Änderungen an tmpArray ändern also auch resArray. Deswegen musst du das kopieren. Ich würde dazu resArr.CopyTo( tmpArr, 0 ); benutzen.

3. Kopiere das Array erst hinter der Zählschleife über i, nicht darin. Und bevor du kopierst musst du die Differenz zum vorhergehenden Vektor tmpArray ausrechnen. Wikipedia schweigt sich darüber aus. Ich würde da aber spontan das Betragsquadrat des Differenzvektors nehmen. Also die Summe über (tmpArr-resArr)*(tmpArr-resArr)

Thema: unsigned?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Also für Bitfelder gibt es das BitArray. Dort kann man komfortabel einzelne Bits setzen und abfragen, und das ganze auf beliebiger Größe.

Das mit den 5 Bit wundert mich in C aber doch sehr. Man könnte sich ja einreden, dass man damit den Wertebereich festlegen kann, aber C ist ja nicht sonderlich typsicher.
Denn C rundet garantiert auch auf Byte. Das geht einfach nicht anders. Eventuell gewinnt man etwas, wenn man viele solcher Variablen in eine Struktur packt. Aber das bezweifle ich auch. Standardeinstellung ist ja sogar Runden auf 32 Bit, und unter 8 Bit kann man das auch nicht stellen.
Auf der Assembler Ebene kann man mit den meisten, um nicht zu sagen allen gängigen, CPUs nicht unter Byteebene arbeiten. Ich hab mal mit ner Architektur gespielt, da konnte man einzelne Bits mit einem Befehl setzen oder Laden. Aber auch dort war die kleinste Verarbeitungseinheit ein Byte.

Thema: Erster Mycsharp.de Progammierwettbewerb!
Am im Forum: Ankündigungen

Also seit deinem Tipp im Mathethread bin ich echt am Arbeiten.
Hoffentlich schaff ichs noch rechtzeitig.

Benutzeroberfläche ist im Moment mein größter Feind. Das alles was ich einbaue, muss ja auch irgendwie bedienbar sein. Im Moment kompilier ich immer neu wenn ich ne Option teste

Eigentlich müsste ichs schaffen... Ungefähr die Hälfte der Türchen hab ich in den letzten 5 Tagen gefüllt. Die nächsten 2 Tage hab ich noch Userinterface auf dem Plan. Und dann wird der Rest aufgefüllt. Wenn die Zeit knapp wird bau ich einfach ein paar Nacktfotos ein

Thema: Allgemeines zu Regex(Vorteile, Nachteile, eure Erfahrungen usw)
Am im Forum: Rund um die Programmierung

Mit der Performance kann man bei Regex auch bisschen tricksen, indem man je nach Situation den Regex kompiliert. (Wenn man den Regex mehrmals braucht)

Ich benutze Regex immer, wenn die normalen string-Funktionen nicht mehr ausreichen. Das sind dann beispielsweise:
- einen String auf korrektes Format testen
- in einem String nach speziell formatierte Sequenzen suchen/ersetzen
- einen formatierten String in seine Bestandteile zerlegen um diese weiterzuverarbeiten (Stichwort Gruppen)

Es gibt bessere Methoden um seine Zeit totzuschlagen als Regex-Funktionalität nachzuprogrammieren. Gerade mit der Begründung Performance... einen Regex für die meisten Probleme hat man innerhalb von Minuten aufgesetzt und getestet. Für eine spezielle Funktion braucht man für nichttriviale Probleme (die, die nicht mit Stringbefehlen lösbar sind) schon leicht mehrere Tage.
Es kostet einen also quasi nichts erstmal mit nem Regex anzufangen, und sich um Performanceprobleme zu kümmern, wenn sie auftreten. Meist werden sie nicht auftreten.

Thema: Finde alle 3stelligen Summen von zwei 3stelligen Zahlen, in denen jede Ziffer nur einmal vorkommt
Am im Forum: Rund um die Programmierung

Ich würde ja teilnehmen aber ich hab nicht die geringste Idee

Thema: Richtige Exception finden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Schau mal in die MSDN bei der Exception Klasse. Dort findest du auch eine Liste aller abgeleiteten Klassen im Framework. Ansonsten eigene anlegen.

EDIT: Achso im catch...
Naja bei ner halbwegs brauchbaren Doku sollten die Exceptions aufgelistet sein. Dann könnte nur noch schlampige Programmierung der Bibliothek dafür sorgen, dass undokumentierte Exceptions geworfen werden, wie z.B. NullReferenceException eigentlich nie geworfen werden sollte.

Thema: Singleton in seperaten AppDomains
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich hab mit Managed C++ noch nicht sonderlich viel gemacht und bin etwas darüber verwundert wie das wohl läuft.

Hast du die andere AppDomain selbst erstellt, oder baut es die automatisch als Trennwand zwischen managed und unmanaged?
Letzteres ist dann doch recht kompliziert zu handhaben, da wirst du wohl Remoting benutzen müssen. Performancemäßig müsste da der IPC Channel mit BinaryFormatter noch am Besten sein.

Wenn du die AppDomain aber selbst erstellst, was ja bei Plugins auch üblich ist, gibt es leichtere Wege.


Ganz prinzipiell brauchst du ja nur ein MarshalByRefObject auf der "anderen" Seite, was dir die Instanz von dem "Singleton" (was ebenfalls MarshalByRefObject erben muss) liefert. Bei selbsterstellter AppDomain ist es ja ganz leicht soetwas einzuschleusen.

Thema: Singleton in seperaten AppDomains
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Das war lediglich ein Hinweis, wie du die Chance erhöhst, das jemand überhaupt deinen Beitrag ließt, und dir dann entsprechend helfen kann. Ich persönlich hab auch keine Lust mich da durchzuarbeiten. Wenn das Lesen der Frage einfach etwas weniger quälend ist, bekommst du auch mehr, schneller und bessere Antworten.

Aber wenn dich das nicht interessiert, zwingt dich auch keiner die Hinweise zu befolgen.

Thema: Warum keine TCPClient Fehlermeldung?
Am im Forum: Netzwerktechnologien

Bisschen Code wäre nicht schlecht. Also wo du die Verbindung herstellst.

Thema: Die etwas andere Suche
Am im Forum: Smalltalk

Sehr nett.

Nur will sie für meinen Geschmack etwas zu viel Aufmerksamkeit (wie wohl viele Frauen...)

Immerhin hat sie auch nen Mute Knopf

Thema: komplizierten SQL-String
Am im Forum: Datentechnologien

Müsste nicht der Trick klappen?

SELECT Vorname,Nachname, Sum(Floor(1/Position)) AS AnzahlSiege
FROM t_Positionierung GROUP BY Vorname, Nachname

Wenn du schon ein UNION machst, warum nicht einfach 0 statt Sum(0)

Thema: Math. Verteilung
Am im Forum: Rund um die Programmierung

Verstehe das Problem nicht. Du hast x Elemente und y Schubladen. Also kommen in jede Schublade einfach x/y Elemente.
Brauchst doch nur mitzählen wieviele schon drin sind.

Und was meinst du mit dem "Wert der Schublade"? Ich meine eine Differenz zu bestimmen ist ja wirklich leicht. Einen Durchschnitt auszurechnen auch...

Eigentlich alles leicht. Deine Beschreibung ist schon so ausführlich, dass du sie 1:1 in nen Algorithmus übersetzen kannst. Ich weiß nicht was du noch brauchst.

Thema: Beruf Softwareentwickler
Am im Forum: Smalltalk

Zitat
Original von Schakal
Hmm, außer mir waren in unserem Ausbildungsbetrieb noch neun.
Und ich würde, die endlosen Projekte deutschlandweit, die vielen selbständigen Arbeiten und so weiter, mit einem Studium definitiv nicht besser hinbekommen...

Ok glück muß man haben, und gott sei Dank habe jetzt meinen Festvertrag bei einer Inovativen kleinen Firma im Aufstieg.
Vor den Entlassungen zur Zeit (SBS, etc. )bist du auch mit dipl. und wie Ich mit nem Zeugnis von 1.0 nicht sicher.
Wo wir dann schon wieder bei der Selbstständigkeit wären.
Da zählt glaub ich auch Erfahrung

Ich hab das Gefühl du bist so sehr damit beschäftigt dir selbst auf die Schulter zu klopfen, dass dir das wesentliche entgeht.
Den Festvertrag mit der Inovativen kleinen Firma im Aufstieg hast du wegen der Erfahrung in dem Ausbildungsbetrieb und den Projekten dort bekommen.
Diese Stelle wiederum hast du durch Glück bekommen, das ist nichts worauf man planen kann.
Trotzdem stellst du deinen Werdegang als beispielhaft hin. Das ist er nicht, das ist nicht einfach so wiederholbar und deswegen ein schlechter Rat. Klar kann man es auch so schaffen, nur gibt es Wege auf denen die Chancen besser aussehen. Darum gehts doch. Nicht mit Diplom ist man der King im Ring und ohne ist man nur Kabeläffchen. Wer so pauschalisiert kann nur falschliegen. Du pauschalisierst in die andere Richtung, und liegst damit nicht weniger falsch.
Die Arbeitslosenrate bei Akademikern ist halb so hoch. Aber egal, du bist immerhin der mit den dicken Eiern, deswegen muss ne Statistik die millionen von Fällen betrachtet dem einfach nachstehen.
Zitat
Original von SchakalUnd schöön, endlich mal einer der mir erklärt das die Praxis auf Theorie aufsetzt.8)

Es scheint mir so als ob Du keine Ahnung hast, was eigentlich außer dem puren Tippen oder Netzwerk noch so alles zum Berufsbild des Fachinformatikers zählt.
Man nehme nur mal das Projektmanagement.
Und deine schöne Formulierung könnte auch durchaus jemanden beleidigen, zumindest wenn er sich angesprochen fühlt.
Nur da ich außer C# noch Perl, PhP, COBOL, REXX, C-Scr., Assembler, Javascr., VB (darf man die Unix-Shell-Dialekte hier eigentlich aufführen??)... spreche und mich ne menge Kumpels(übrigens Inf.Studies) um Raht fragen...

Erklär mir mal was du willst.
Du sagst Praxis > Theorie. Dann tust du so als hätte ich was völlig offensichtliches gesagt, als ich davon schrieb, dass das praktischste eine gute Theorie ist.
Und dann? Dann kommt nurnoch heiße Luft. Werf ruhig weiter Akronyme in den Raum. Nur beeindruckst du damit wirklich keinen mit nem Hauch von Ahnung. Was hat denn die tolle Aufzählung bitte damit zu tun, dass du deine praktischen Erfahrungen unter Garantie auch zu einer Theorie abstrahierst, die du dann auf neue Probleme anwendest?

Das was du hier ablieferst ist genau das Bild, was ich gerne Computerfuzi nenne. Du bildest dir was auf deine Kentnisse ein. Oh ja du must ja ein echter Mann sein bei den vielen Programmiersprachen die du kannst...

Wach auf, das ist nichts Besonderes. Nichts was du hier aufzählst kann mich sonderlich beeindrucken. Füg mal noch ne funktionale Programmiersprache hinzu, dann wird die Liste immerhin zweidimensional. Oder wenigstens eine die funktionale Konstrukte enthält wie Python. Aber so? Sorry, trivial. Behalts lieber für dich und produzier weniger heiße Luft.

Thema: Beruf Softwareentwickler
Am im Forum: Smalltalk

Zitat
Original von Schakal
@Traumzauberbaum:
folgendes, wenn Du versuchst mir die Wörter in der Hand umzudrehen:

Nenn mir einen Grund warum du das, was du ohne Studium gelernt hast, nicht mit Studium lernen kannst.
Dieses habe ich NIE behauptet!!!

Es wird dich auch nicht daran hindern es zu Lernen, nur Fakt ist:

alles was du dir selbst durch Praxis beibringen kannst, hättest du dir genauso selbst beibringen können, wenn du Informatik studiert hättest.

!!! Nein, ist nicht richtig. !!! Denn dann fehlt dir der tägliche Erfahrungsaustausch mit Kollegen. Was man nicht so alles in der Kantine gelehrnt hat

Nur weil du es unbedingt in deinen Kontext setzen willst. Das ist zum Beispiel auch etwas, was man im Studium schon in den frühen Semestern lernt: Daten (mein Satz) müssen in den richtigen Kontext gesetzt werden, erst dann wird eine Nachricht draus.
Es ist einfach mal nichts falsches an dem Satz, du willst es nur so verstehen, dass ich gesagt hätte, dass man alles was du durch Praxis gelernt hast im Studium lernen würde. Das steht aber nicht dort.
Natürlich musst du dich dann noch etwas über das Studium hinaus bemühen. In der Uni rennen übrigens auch haufenweise Leute rum die Ahnung von ihrem Fachgebiet haben. Mit denen kann man auch reden und Erfahrungen austauschen. Und das sind praktische Erfahrungen, denn jede Professur hat mehrere Forschungsthemen, bei denen es um echte Lösungen für echte Probleme geht.


Außerdem solltest du dir echt mal bewusst machen, dass du nur einen wirklich kleinen Ausschnitt der Informatik kennst.
Ich meine du konntest alle Algorithmen nachschlagen, die du bisher brauchtest. Es gibt aber ganze Klassen von Problemen, für die es keinen niedergeschriebenen Algorithmus gibt. Dafür gibt es eine Theorie, wie man einen Algorithmus dafür aufstellen kann. Dafür müsstest du aber erstens wissen, dass es sowas überhaupt gibt, und zweitens, was für eine Klasse von Problemen du damit erfasst.

Nur weil du etwas nicht brauchst, heißt das nicht, dass es nie oder auch nur selten gebraucht wird. Du ziehst von dir die Verallgemeinerung zu allem. Schonmal nachgedacht, dass du einfach nur Glück hattest an diese eine Stelle zu kommen? Dass du ohne diese Stelle dir die Praxis gefehlt hätte, um erstens überhaupt an deine weiteren Stellen zu kommen (bewerbungstechnisch) und zweitens sie bewältigen zu können? Ist es ein guter Rat auf soetwas zu bauen?


Und wo dir vieleicht auch einfach das Verständniss fehlt: Auch du benutzt Theorie. Du hast die Theorie durch Praxis gelernt, aber ohne die Theorie würdest du jedesmal von vorne anfangen müssen ein Problem zu lösen. Aber du weißt wonach du suchen musst, wie du an das Problem rangehen musst, genau das ist Theorie. Was also bringt dir die Theorie? Eine Lösung zu Problemen, die du noch nicht hattest. Was bringt dir Praxis? Eine Lösung zu einem Problem, das du schonmal hattest.
Wenn du nicht aus deiner Praxis zu einer Theorie abstrahieren kannst, bist du einer von denen, die sich an ihrem Office '98 festklammern, weil sie Office 2000 schon nichtmehr verstehen.
Du siehst es vieleicht nicht als Theorie, aber genau das ist was, was einem eine Theorie vermittelt.

Thema: Beruf Softwareentwickler
Am im Forum: Smalltalk

Du willst es einfach nicht verstehen oder?


Nenn mir einen Grund warum du das, was du ohne Studium gelernt hast, nicht mit Studium lernen kannst.

Ich seh ein, dass man es nicht im Studium lernt. Das brauchst du nicht betonen, das ist ja nichtmal das Ziel des Studiums. Nur warum hindert mich ein Studium daran es zu lernen?

Thema: Beruf Softwareentwickler
Am im Forum: Smalltalk

@Schakal

Bei der Informatik gehts genauso um Computer wie in der Astronomie um Teleskope.


Aber geh mal davon aus: alles was du dir selbst durch Praxis beibringen kannst, hättest du dir genauso selbst beibringen können, wenn du Informatik studiert hättest.

Thema: Inkonsistenten Zugriff vermeiden
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Der Code der hier steht wird wunderbar funktionieren. Der Code der bei dir steht wird noch ein "public" vor dem "class ClassB" haben.

Ist auch logisch. Wenn du ClassB public definierst, können andere Assemblies sie verwenden. Andere Assemblies müssen dann auf alle Properties und Methoden zugreifen können. Um das zu können, müssen die Assemblies aber auch alle Typen der Parameter und Properties kennen. Wenn ClassA nicht public definiert ist, kennen die anderen Assemblies ClassA auch nicht.

Entweder du machst beide public, oder beide internal (= visibility Schlüsselwort weglassen)

Thema: Collection mit Referenztypen
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich würde vorschlagen wenn du beim Einfügen nichts findest, schau mal beim Ausgeben nach. Vieleicht liegt der Fehler dort. Beim Enumerator oder beim Indexer. Prüf bei der Ausgabe auch mal, ob dort die Frames nicht nur vom Inhalt gleich sind, oder vieleicht sogar die gleiche Referenz haben ( == Operator, oder object.ReferenceEquals )

Thema: Reflection-Problem mit Interfaces
Am im Forum: Rund um die Programmierung

Das Problem ist, dass dein Client die echte Klasse nicht kennt, und GetType() da logischerweise nichts sinnvolles liefern kann. Woher soll er denn die Typinformationen für Reflection nehmen?

Es wäre sowieso logischer wenn die Informationen die der Client braucht alle über das Interface geholt werden können. Also du fügst dem Interface z.B. eine Funktion GetProperties() hinzu. In der Implementation des Interfaces solltest du problemlos this.GetType().GetProperties() verwenden können.

Thema: Beruf Softwareentwickler
Am im Forum: Smalltalk

Das Ding mit dem Studium ist ja nicht, dass man da Dinge lernt die man sonst nie rausfinden würde. Es ist vorallem auch ein Qualifikationsnachweiß.
Ich meine in einer Bewerbung kann man ja allen möglichen Käse schreiben.

Kleines Beispiel von thedailywtf.com

Ein Diplom ist einfach ein Leistungsnachweis. Um das zu erreichen muss man ein bestimmtes Maß an Verständniss und Wissen besitzen. Zumindest ist da die Wahrscheinlichkeit ne absolute Gurke zu erwischen deutlich kleiner.

Das hat nix mit verknöcherten Strukturen, sondern vorallem purem Selbsterhaltungstrieb. Das Business besteht zur Hälfte aus Lügen und die andere Hälfte sind Übertreibungen. Es ist einfach verflucht schwer einen wirklich qualifizierten Mitarbeiter zu finden.

Eigentlich ist fürs pure Programmieren auch kein Studium nötig. Das ist im Grunde eine relative leichte Aufgabe, wenn man den Geist dazu hat. Schwer wird es wenn die Projekte eine gewisse größe erreichen das alles zu koordinieren, aufzuteilen und das so zu machen, dass es am Ende zusammenpasst, überhaupt fertig wird, und am Ende noch wartbar ist. Das ist die eigentliche Ingenieurskunst, bei der erst ein Studium schon wirklich vorausgesetzt werden sollte.

Thema: Dijkstra-Algorithmus
Am im Forum: Rund um die Programmierung

Der Dijkstra Algorithmus berechnet eher einen Graphen der kürzesten Wege von einem Startknoten aus. Der A* Algorithmus zielt eher darauf ab nur den kürzesten Weg zwischen zwei Knoten zu ermitteln.

Der Unterschied ist eigentlich sehr klein. Wenn du den Dijkstra Algorithmus anschaust, wählt er ja immer als nächste Kante die mit dem geringsten Gewicht.
Der A* Algorithmus macht das etwas allgemeiner, dort wird die "günstigste" Kante ausgewählt.

Was günstig bedeutet, wird durch eine Heuristik definiert, die bestimmte Eigenschaften erfüllen muss, damit ein brauchbares Ergebnis garantiert ist.
Beispielsweise wenn die Knoten Koordinaten haben ist eine geläufige Heuristik die Luftlinie zum Zielknoten.
Und wenn du einfach festlegst, dass die günstigste Kante die mit dem geringsten Gewicht ist, kommst du offensichtlich wieder bei Dijkstra raus.

Thema: In einer Switch Anweisung eine Variable verarbeiten?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Sorry, das regt mich schon wieder etwas auf. Wie Dijkstra so schön sagte:

Zitat
It is practically impossible to teach good programming to students that have had a prior exposure to BASIC: as potential programmers they are mentally mutilated beyond hope of regeneration.

Thema: Tipp: Besser skalieren mit ReaderWriterGate
Am im Forum: Rund um die Programmierung

Danke für die Klarstellung, das war der Teil den ich übersehen habe. Das macht es natürlich umständlicher und eine eigene Queue notwendig.

Thema: Tipp: Besser skalieren mit ReaderWriterGate
Am im Forum: Rund um die Programmierung

Also wenn ich das richtig überschaue, erreicht man den selben Effekt auch deutlich einfacher.

Man braucht nur ein AutoResetEvent Objekt und die ThreadPool Funktion RegisterWaitForSingleObject.

Alle Operationen werden dann über das AutoResetEvent synchronisiert. Das erreicht man, indem man die Funktionen dann über RegisterWaitForSingleObject statt mit QueueUserWorkItem im Threadpool registriert.

Das würde schon ausreichen, um den Threadpool während einer Schreiboperation nicht mit wartenden Threads vollzumüllen. Die Queue würde dann vom ThreadPool übernommen. Das würde z.B. so aussehen:

AutoResetEvent waitObject = new AutoResetEvent(true);
// true damit erste Operation sofort ausgeführt wird

void RuftSchreibenAuf()
{
    ThreadPool.RegisterWaitForSingleObject( waitObject, WriteCallback, null, Timeout.Infinite, true );
}

void RuftLesenAuf()
{
    ThreadPool.RegisterWaitForSingleObject( waitObject, ReadCallback, null, Timeout.Infinite, true );
}

void WriteCallback( object state, bool timedOut )
{
    try {
        // hier findet das echte Schreiben statt
    }
    finally {
        waitObject.Set(); // gibt für die nächste Operation frei
    }
}

void ReadCallback( object state, bool timedOut )
{
    waitObject.Set(); // gibt die nächste Operation sofort frei

    // Lesen findet dann hier statt
    // weil vor dem eigentlichen Lesen schon freigegeben wird,
    // könnten auch mehrere Leseoperation parallel stattfinden
}

Damit gibt es noch ein Problem mit der anderen Richtung. Wenn gerade ein paar Threads fleißig am Lesen sind, und einer will was Schreiben, dann wird das nicht verhindert. Er kann einfach anfangen obwohl die Leser noch nicht fertig sind.

Das könnte man zum Beispiel mit dem ReaderWriterLock in den Griff bekommen. Im Ganzen hätte man dann maximal einen Schreibethread im Wartezustand, solange noch Leseoperationen laufen, die vorher aufgerufen wurden. Leseoperationen die nach einer Schreibeoperation aufgerufen werden, würden vom ThreadPool gequeued werden und würden keinen Thread belegen, bis der Schreiber fertig ist.

Im Ganzen würde der Code dann zum Beispiel so aussehen:

AutoResetEvent waitObject = new AutoResetEvent(true);
// true damit erste Operation sofort ausgeführt wird
ReadWriterLock readWriterLock = new ReadWriterLock();

void RuftSchreibenAuf()
{
    ThreadPool.RegisterWaitForSingleObject( waitObject, WriteCallback, null, Timeout.Infinite, true );
}

void RuftLesenAuf()
{
    ThreadPool.RegisterWaitForSingleObject( waitObject, ReadCallback, null, Timeout.Infinite, true );
}

void WriteCallback( object state, bool timedOut )
{
    readWriterLock.AcquireWriterLock( Timeout.Infinite );
    try {
        // hier findet das echte Schreiben statt
    }
    finally {
        readWriterLock.ReleaseWriterLock();
        waitObject.Set(); // gibt für die nächste Operation frei
    }
}

void ReadCallback( object state, bool timedOut )
{
    readWriterLock.AcquireReaderLock( Timeout.Infinite );
    try {
        waitObject.Set(); // gibt die nächste Operation sofort frei

        // Lesen findet dann hier statt
    }
    finally {
        readWriterLock.ReleaseReaderLock();
    }
}

Nicht wirklich sonderlich umständlich finde ich. Und den Aufwand kann man sich sparen, wenn man paralleles Lesen nicht braucht, da würde Variante 1 auch reichen, wenn man das Lesen genauso strickt wie das Schreiben (also Set() erst am Ende aufrufen). Dann würde immer nur eine Operation gleichzeitig laufen, der Rest würde über den ThreadPool gequeued werden. Ich glaube sowieso nicht so richtig, dass paralleles Lesen etwas bringen würde. Selbst mit 4 Prozessoren teilen die sich doch immernoch die gleiche Schnittstelle um auf die Festplatte zuzugreifen.

Das ist zumindest was mir in den ersten 10 Minuten dazu einfällt. Mich würde da mal eure Kritik interessieren. Scheint mir vom Ergebniss her aber ziemlich analog zu funktionieren. Man könnte bestimmt noch was verbessern, und vieleicht ists auch völliger Blödsinn.

Thema: Reflektion bei Vererbung
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Ich denke du solltest bei GetProperties die Überladung benutzen, bei der BindingFlags als Parameter genommen werden. Über die kannst du dann ganz exakt einstellen was die Funktion zurückgeben soll.

Thema: Klasse für Primzahl- und Integer-Berechnungen
Am im Forum: .NET-Komponenten und C#-Snippets

Es gibt tatsächlich einen Polynomialzeit Algorithmus zur Faktorisierung auf Quantencomputern. Mehr als das weiß ich aber auch nicht, hab die Vorlesung nicht weiter besucht

Thema: Klasse für Primzahl- und Integer-Berechnungen
Am im Forum: .NET-Komponenten und C#-Snippets

Zitat
Original von BerndFfm
Borg : Genau das was ich gesagt hatte, ausser
Zitat
Stimmt auch nicht. Man kann zwar mit einigen Formeln Kandidaten für Primzahlen ermitteln (z. Bsp. Mersenne-Zahlen), muss diese aber wieder mit anderen Verfahren überprüfen. (erst die schnellen, die eine Wahrscheinlichkeit liefern, dann um sicher zu gehen das langsame Brute-Force)

Es gibt verschiedene Formeln um hohe Primzahlen zu ermitteln OHNE die gefundene Zahl durch Brute Force zu verifizieren, z.B. Mersenne-Zahlen).
Sonst wäre ja die Public Key Verschlüsselung auch ewig langsam.

Es gibt keine Formel mit der man garantiert eine Primzahl ermitteln kann. Das sieht man doch gerade an den Mersenne-Primzahlen. Für die 25 ersten Mersenne-Zahlen (also nach der Formel 2^n-1 mit n ist Primzahl) sind gerademal 10 auch Primzahlen. Der Trick ist, dass man mit ner höheren Wahrscheinlichkeit eine Primzahl findet, als durch pures Raten. Bzw. ist der Vorteil bei den Mersenne-Zahlen, dass man sie leichter auf prim testen kann.
Und das ist auch ein Erkenntniss der Primzahlforschung. Es gibt kein festes Muster, aber es gibt eine Verteilung der Primzahlen. Das heißt es gibt Formeln die öfters eine Primzahl finden als andere. Oder anders: man kann Zahlen eine Wahrscheinlichkeit zuordnen, dass sie eine Primzahl sind und diese Wahrscheinlichkeit ist nicht gleichverteilt. Bzw. glaubt man, dass sie nicht ganz zufällig verteilt sind. Ob es einen Beweis dafür gibt, oder ob man das inzwischen verworfen hat möchte ich jetz nicht beschwören... kann gut sein dass ich mich irre...

Aber es gibt keine Formel die jedesmal eine Primzahl findet. Man muss also sehr wohl die Zahl mit Brute Force (oder bei Mersenne-Zahlen mit einem eigenen Test) prüfen, egal welche Formel man hernimmt.

Thema: Klasse für Primzahl- und Integer-Berechnungen
Am im Forum: .NET-Komponenten und C#-Snippets

Naja kann schon verstehen warum sich kein Mathematiker großartig dafür interessiert

Es ist eben kein Muster für Primzahlen, sondern ein Muster für Nichtprimzahlen. Funktioniert eigentlich ziemlich analog zum Sieb des Eratosthenes, nur graphisch etwas schöner. Das passt eben alles zusammen. 2*3 = 6, wodurch sich die Spalten ergeben und zufällig liegen links und rechts von 6 wieder Primzahlen (5 und 7), wodurch die schönen Diagonalen zustande kommen. Aber dann hörts auch schon auf mit Schönheit

Thema: Verschachtelter Aufruf von Funktionen erlaubt?
Am im Forum: Basistechnologien und allgemeine .NET-Klassen

Du bestimmst die Potenzen immer neu. Du rechnest x^11 aus, ich rechne einfach das x^9 was ich schon kenne mal x^2 was ich schon kenne. Wozu da ne Potenzfunktion? Und genau das kannst du bei den anderen auch benutzen.

Fakultät ist ja so definiert: n! = (n-1)! * n
Genau das rechne ich.

Ich hab nur die Bedeutung von n geändert. Der Wert in n ist jetzt direkt der Exponent, statt dass 2*n + 1 der Exponent wäre wie bei deinem Code.

Gehs doch einfach mal durch.
Erster Durchlauf: facn = 1, n = 1 (ok n=1 hab ich vergessen hinzuschreiben, du initialisierst ja noch mit 0)
++n => n = 2
facn *= 2 => facn = 2
++n => n = 3
facn *= 3 => facn = 6 = 3! => richtiger Wert für den 2. Durchlauf.

++n => n = 4
facn *= 4 => facn = 24
++n => n = 5
facn *= 5 => facn = 120 = 5! => richtiger Wert für den 3. Durchlauf.


Wie gesagt ist das was du gemacht hast ja mathematisch ganz hübsch. Aber in der realen Welt braucht jeder Funktsionsaufruf Speicher. Irgendwann ist keiner mehr da und du bekommst diese Fehlermeldung. Lösung: Weniger Funktionsaufrufe. Ich seh auch echt keinen Sinn dahinter einen Funktionsaufruf, hinter dem ein umfangreicher Algorithmus steckt, einem simplen c = a*b vorzuziehen.

Wenn du nur x^n ausrechnen willst ist die Potenzfunktion gut. Wenn dich die Vorhergehenden Ergebnisse auch interessieren nicht. Stell dir einfach vor wie du das per Hand machen würdest. Du würdest mit Sicherheit nicht jede Potenz neu bestimmen. Du würdest das von der vorhergehenden Iteration hernehmen und damit das für die aktuelle Iteration berechnen.