Laden...

Forenbeiträge von Andavos Ingesamt 138 Beiträge

05.03.2009 - 19:34 Uhr

Hallo,
naja der erste Schritt wäre eigentlich, die Buchstabenhäufigkeit des entschlüsselten Textes mit dem geratenem Key zu analysieren und zu schauen, ob es mit Buchstabenhäufigkeit von deutschen Texten übereinstimmt.
Dazu kann man einfach gucken, ob z.B. e, s und n am häufigsten Auftauchen und ob die Quote für q, x, y sehr klein ist.

Ansonsten:
Den Text in Wörter zerlegen (trennen am Space), und dann für jedes Wort im Text gucken ob es im deutschen Wörterbuch steht.
Ist nur die Frage, wo du ein so umfassendes Wörterbuch herbekommst. Da ist die Analyse der Verteilung der Buchstaben effizienter.

07.02.2009 - 12:01 Uhr

Hallo,
du musst typ auf Typen einschränken, die das Interface IComparable implementieren, denn beliebige Objekte lassen sich nicht vergleichen bzw. sortieren ([1]).
Dies geht dann mit where:
BubbleSort<typ> where typ : IComparable
(ich weiß nicht ob es auch mit static Methoden so geht)

Dann statt > oder o.ä. muss du ((IComparable)object).CompareTo() verwenden.

[1] Hat man z.B. eine Klasse für die komplexen Zahlen, dann lassen sich diese nicht (sinnvoll/eindeutig) sortieren, da die komplexen Zahlen nicht geordnet sind.
Ebenso kann man sehr sehr komplexe Objekte nur schwer sortieren.

03.02.2009 - 12:44 Uhr

Hallo,
evt. hilft auch dieses Buch: Praxisbuch Objektorientierung

Ist nicht speziell an C#/.Net gerichtet sondern behandelt das Objektorientierte Programmieren an sich, welche Vorteile man sich davon verspricht etc.
Eigentlich ganz gut für den Einstieg.

Ansonsten: Ich gebe dir recht, Klassen sinnvoll zu finden ist gar nicht so einfach, aber irgendwann macht es klack und man bekommt ein Gefühl dafür, wie man nun welche Klassen erstellt, zumindestens grob.

Ansonsten ist ein Klassendesign (UML) am Anfang unglaublich hilfreich, auch bei kleineren Sachen sofern man noch kein Gefühl dafür hat.
Also schnell das nächste UML Buch schnappen und dann zuvor ein Klassendiagramm erstellen.

11.01.2009 - 15:01 Uhr

Hallo,
also ich konnte dein Problem nicht feststellen:


while (true) {
      int[] anzahl = new int[6];
      Random rnd = new Random();
      for (int i = 0; i < 100000; i++)
      {
          anzahl[rnd.Next(1, 7)-1]++;
      }

      for (int i = 0; i < anzahl.Length; i++)
          Console.WriteLine((i + 1) + ": " + anzahl[i]);

      Console.ReadLine();
}

Liefert mir:

1: 16609
2: 16762
3: 16524
4: 16601
5: 16752
6: 16752

Welches Framework verwendest du? Also ich hab es mit Windows XP und .Net 2.0 probiert.
Denn dass du bei rnd.Next(1,6) eine 6 erhälst ist merkwürdig. Sowohl bei .Net 1.1 als auch bei .Net 2.0 steht in der MSDN, dass die obere Grenze nicht vorkommt.

Achja: Random rnd = new Random();
sollte man wenn möglich nur einmal pro Objekt initialisieren. Denn initialisiert man diese zu schnell nacheinander, dann wird immer der gleiche Startwert verwendet und man erhält die gleichen Zufallszahlen.

Dies kann man an folgendem Code erkennen:


   int[] anzahl = new int[6];   
   for (int i = 0; i < 10000; i++)
   {
       Random rnd = new Random();
       anzahl[rnd.Next(1, 7)-1]++;
   }

   for (int i = 0; i < anzahl.Length; i++)
       Console.WriteLine((i + 1) + ": " + anzahl[i]);

   Console.ReadLine();

Ausgabe:

1: 2010
2: 1539
3: 1633
4: 269
5: 1574
6: 2975

04.01.2009 - 20:50 Uhr

Hallo,
sonst nimm doch ein StreamReader, dort gibt es die Methoden 'ReadLine' und 'ReadToEnd'.
Mit ReadLine() kannst du den Header gleich Zeilenweise einlesen und musst nicht mehr auf Split zurück greifen.

04.01.2009 - 14:47 Uhr

Hallo,
der HTTP Header ist ja zeilenweise aufgebaut, also zerlegt man den Text erstmal in Zeilen.

Dann musst du schauen, welche Informationen dich interessieren. Da du ja HTML Dateien zurückgeben möchtest, wäre nur 'GET /datei.html' bzw. 'POST /datei.html' für dich von Interesse. Diese muss, sofern ich richtig informiert bin, in der ersten Zeile stehen. Also einfach den Dateinamen auslesen, die richtige Datei raussuchen und zurückgeben.

Ansonsten gibt es auf Codeproject.com ein paar Artikel dazu, wie man einen kleinen Webserver schreibt:[

Building a Tiny WebServer in less than 500 lines](http://www.codeproject.com/KB/cs/meyntinyserver.aspx)

04.01.2009 - 14:25 Uhr

Hallo,
du meinst also du möchtest mit C# eine Web Anwendung erstellen?

Das ganze verbirgt sich hinter dem Begriff ASP.Net (Goolge sollte genug Tutorials liefern 😉).

01.01.2009 - 16:41 Uhr

Hallo,
persönlich finde ich Zedgraph super, kostenlos und unter LGPL. Sehr viele verschiedene Diagrammarten, extrem flexibel und auch leicht zu bedienen. Was möchte man mehr?

Und das Gute ist, es nutzt nur .Net 2.0 (und eine nahezu identische .Net 1.1 Version gibt es auch noch). Wenn man also nicht die Möglichkeit hat mit .Net 3.5 zu entwickeln ist dies wirklich zu empfehlen.

Persönlich hab ich mit dem Microsoft Chart Control noch nichts gemacht, kann Zedgraph aber sehr empfehlen.

31.12.2008 - 13:46 Uhr

Hallo,

Hallo Andavos,
Außerdem war es sinnvoller sofort eine Meldung zu bekommen, dass der eine oder andere Kunde nicht upgedatet werden konnte, weil XYZ.

da sprichst du einen guten Punkt an, dies ist mit dem Push Prinzip in der Tat leichter zu kontrollieren.
Dieser Aspekt ist mir bis zu deinem Beitrag nicht in den Sinn gekommen, dass der Software Anbieter bei nicht möglichen Update evt. reagieren muss.

30.12.2008 - 14:00 Uhr

Hallo,
bei Software die sicher auf dem neusten Stand sein muss, wäre es dort nicht ratsamer es so zu implementieren, dass diese beim Start-Up überprüft ob die eigene Version die aktuellste ist und wenn nicht sich aktualisiert. Und sollte die Überprüfung nicht möglich sein, die Software eben den Dienst verweigert?

Denn bei dem von TimothyJonathan genannten Push-Prinzip (ein zentraler Server schiebt allen Instanzen die neuste Version unter) könnte man es eben nicht sicher stellen, dass auch alle die neuste Software verwenden. Was passiert, wenn die Apotheke auf einmal eine Firewall installiert hat (z.B. Windows Firewall durch Update o.ä.), die alle Verbindungsanfragen von außen verwirft?
Die Apotheker-Software würde dann nie mitbekommen, dass ein Server versucht dort die neuste Version zu installieren und der Apotheker würde fröhlich weiterhin seine veraltete Software verwenden.

Okay, Software on Demand wäre noch eine bessere Lösung, aber mal angenommen dieses Konzept stände nicht zur Debatte.

29.12.2008 - 16:52 Uhr

Hallo,
oh den letzen Satz deines 1. Beitrag hab ich wohl überlesen ^^

Also in Visual Studio wird einem doch angezeigt, welche Exceptions geworden wird. Bei einem generischen Dictonary steht als Beschreibung zur Methode Add:


void Dictionary<string, int>.Add(string key, int value)
Fügt dem Wörterbuch den angegeben Schlüssel und Wert hinzu.

Ausnahmen:
  System.ArgumentNullException
  System.ArgumentException

Ruft man also Add() auf, sollte man die beiden Exceptions bedenken.

Und meistens reicht es aus nur Exceptions abzufangen (alle anderen erben von dieser Klasse). Die Differenzierung zwischen Exception-Arten macht man auch nur, wenn man explizitie Fehlerroutinen für die Art des Fehlers hat (z.B. für FileNotFoundException).

29.12.2008 - 16:33 Uhr

Hallo,
naja gerade da es für eine Bachelor Arbeit ist wollte ich möglichst viele negativ Punkte aufführen, denn solche sollten nicht unberücksichtigt bleiben (und helfen hoffentlich beim Schreiben der Arbeit).

Sicher gibt es sehr spezielle Szenarien wo die Verteilung iniziiert vom Server Sinn macht, in den meisten Fällen aber eben nicht. Bei Massensoftwareprodukten (Office, Photoshop, Firefox etc.) wäre solch die serverseitige Steuerung aber schlicht nicht umsetzbar.

Aus dem Anfangsbeitrag ging ich von einen Massensoftwareprodukt aus (Kontakt zum Kunden einfacher, einfacheres Lizenzmanagement, weniger Raubkopien) und da fällt mir eben kaum ein Szenario ein, wo der Server dies iniziieren sollte. Für Massenprodukte macht es viel zu viel Aufwand und Probleme.
Und wieso sollte der Kontakt zum Kunden schwerer sein, wenn der Client das Update anstößt? Die Daten vom Kunden sollte ich beim Verkauf der Software erhalten und nicht wenn ich den mit Updates versorgen möchte.

Selbst bei Unternehmenssoftware (z.B. Application-Server) wird das Update vom Client angestoßen.

Sobald die Software aus der Hand des Herstellers gegeben wird, fallen mir persönlich immoment keine Argumente ein, die für eine servergesteuerte Update-Verteilung spricht. Persönlich würde ich selbst wenn die Software nur in einem LAN laufen sollte die clientgesteuerte Update-Verteilung bevorzugen (da in meinen Augen erheblich einfacher und mit weniger Problemen verbunden).

Aber ich hör mir natürlich auch gerne Argumente an, die für das Szenario der servergesteuerten Update-Verteilung spricht (bin ja hier um etwas zu lernen). Würde mich persönlich auch interessieren, was ein Software Anbieter für Vorteile sieht bzw. in welchen Szenarien soetwas (erhebliche) Vorteile bringt.

29.12.2008 - 15:38 Uhr

Hallo,

  1. Und wie ist das mit Sicherheitsrichtlinien in Firmen? Die sind bestimmt nicht daran interessiert, dass einfach eine Software eine neue Server-Anwendung in deren Netzwerk startet.

  2. Der Unterschied ist aber, bei einer Client-Lösung ist dieser Prozess nicht von außerhalb erreichbar!
    Bei der Server Lösung kann sich jeder mit eurer Software beim Client verbinden und versuchen dort irgendwie Code unterzujubeln.
    Bei der Client Lösung baut der Client die Verbindung mit eurem Server auf, womit beim Client kein Sicherheitsloch entsteht.
    Bei der Client Lösung gibts einen Punkt zu verteidigen, euren Server. Bei der Server Lösung (ihr schiebt den Clients updates unter) ist jeder Client ein potenzieller Angriffspunkt.

Die Client Lösung ist erheblich leichter zu realisieren. Der Client muss nur, sofern der Prozess gestartet wurde, sich mit einer feste IP (oder per DNS) sich mit dem Server verbinden und nach Updates fragen.

Bei der Server Lösung muss der Client höchstgradig gegen Angriffe von außen abgesichert sein (jeder Client wird somit zum Server im Internet!), man muss Update-Server in Netzwerk aufsetzen und jede Menge Konfiguration beim Kunden betreiben (und dann auch jede Menge Support leisten). Was passiert wenn der PC des Kunden DHCP einen neue lokale IP bekommt? Oder die Software nun auf dem Laptop betreiben will? Dies muss das Update Center alles bedenken.

29.12.2008 - 14:48 Uhr

Hallo,

Zu den anderen Punkten kann ich sagen, dass unsere Server schon relativ sicher sind, da wir auch ein recht großes Unternehmen sind, die viele Fachkräfte beschäftigen.

nur weil ein Unternehmen groß ist, heißt dies noch lange nicht, dass es im stande ist, sichere Anwendungen zu liefern.

Also wenn ich dich richtig verstanden habe mit dem 'Server-Konzept':
In eurer Datenbank steht neben den Kundendaten (die beim Kauf anfallen) auch unter welcher IP die Software des Kunden zu erreichen ist.
Wenn dann ein Update eingespielt werden sollte, würde euer Server die (Socket) Verbindung zum Kunden aufbauen und diesem das Update 'unterschieben'.

Sofern ich das also richtig verstanden habe, würde ich dieses Verhalten extrem bedenklich und extremst unpraktisch finden (d.h. zum scheitern verurteilt), vielleicht sogar rechtlich verboten.

  1. Fast kein Kunde erlaubt es mehr, ohne zusätzliche Konfiguration, dass eine Internetverbindung mit dem entsprechenden Programm aufgebaut wird.
    Grund dafür ist die ab Windows XP SP2 vorhande Firewall bzw. bei mittlerweile den meisten Haushalten ein vorhandener Router, der alle (nicht eingestellten) Verbindungsanfragen verwirft. In halbwegs gesicherten Firmennetzwerken wirst du die Software sowieso nicht erreichen.
    D.h., jeder Kunde müsst seinen Rounter und evt. seine Firewall konfigurieren und explizit freigeben, dass euer Server eine Verbindung mit der Software aufbauen kann. Die meisten normalen Nutzer werden dadran scheitern.
    Noch schlimmer sieht es in Firmen aus, dort würde solche Software aufgrund von Sicherheitsrichtlinien oft nicht eingesetzt werden.

  2. Da euer Server die Verbindung mit dem Kunden aufbaut, muss auf dem Kundenrechner ein Serverprozess laufen, der auch für jeden anderen im Netz erreichbar ist. Somit verwandelt ihr die Rechner eurer Kunden in Server die per Internet zu erreichen sind.
    Es ist nicht nur notwendig das eure Server absolut sicher sind, sondern besonders die Software für den Kunden muss absolut sicher sein. Stell dir vor, eine Schwachstelle wird in der Kundensoftware gefunden und hunderte wenn nicht sogar tausende von Kundenrechner werden durch Viren verseucht, da eure Software nicht sicher war.

  3. Die meisten Privatkunden haben alle 24 Stunden einen neue IP. Somit dürfte der (Privat) Kunde sich jeden Tag bei euch neu einloggen und seine IP anpassen. Persönlich hätte ich da keine Lust zu.

  4. Mehrere Kunden können sich eine IP Adresse teilen. Wenn ich lokal über einen NAT-Router ins Internet gehe, was der Standard bei Privathaushalten ist, dann ist nach draußen nur eine IP sichtbar. Wenn ich aber nur zwei mal die Software im lokalen Netz am laufen hab, dann könntet ihr höchstens eine dieser beiden erreichen. Noch schlimmer sieht es in Firmennetzwerken aus, dort teilen sich oft 100 oder mehr Arbeitsplätze eine IP (Zurgiffs aufs Netz erfolgt oft per Proxy).
    Also müsstet ihr noch lokal einen Update Server installieren, der die Updates von euch untergeschoben bekommt und dann im LAN verteilt.
    Aber erwarte nicht, dass soetwas der normale Windows Benutzer einrichten kann.

  5. Ich als Kunde möchte selber entscheiden, ob ich Updates aufspiele und wenn ja wann. Manchmal möchte ich gar nicht die neuste Version haben, da ich mich an die alte Version gewöhnt habe. Persönlich verwende ich bei einigen Programmen auch noch ältere Versionen, da ich diese angenehmer zum arbeiten finde (z.B. nutz ich XP statt Vista, ein altes Word etc.). Ich möchte neue Versionen auch vorher testen bevor mein ganzes System umgestellt wird.
    Was passiert, wenn durch solch ein Update ein Schaden beim Kunden entsteht? Ihr habt dieses Update dem Kunden untergeschoben, für evt. Schadenersatzansprüche müsstet ihr dann auch Haften. Mal ganz vom Image Verlust abgesehen.

  6. Rechtlich: Über die IP-Adresse + die Kundendaten in euer DB könntet ihr das Surfverhalten einzelner Personen nachverfolgen und genau zuordnen, welcher Kunde was (bei auf der Website z.B.) anklickt. Dies halte ich aus datenrechtlichen Gründen mehr als heikel.

Wenn ihr ein Auto-Update anbietet wollt, dann sollte dies unbedingt vom Kunden aus iniziiert werden. Nicht nur weil dies technisch erheblich leichter ist (oft keine Konfiguration an der Firewall/Router des Kunden, keine Probleme mit wechselnden IP Adressen seitens des Kunden etc.) sondern weil ihr euch auch viel Ärger mit Kunden erspart, bei denen das Update nicht klappt bzw. die das Update gar nicht haben wollten.

Aus datenrechlichen Gründen sollte man bedenken, was beim Update alles an euren Server mit übertragen wird. Persönlich würde ich es nicht wollen, dass ihr seht, wann ich als Kunde (mit der Anschrift ...) auf Updates überprüfe etc.

Wenn man also solch einen Abgleich der Kundendaten durchführt, muss man unbedingt berücksichtigen, ob soetwas überhaupt erlaubt ist.

29.12.2008 - 14:15 Uhr

Hallo,
in Visual Studio den Objektbrowser öffnen (Strg + W,J) und dort ins Suchfeld mal Exception eintippen.
Dann bekommst du alles was 'Exception' im Namen enthält.

Ansonsten hilft evt. dieser Link:
MSDN SystemException
ganz unten unter Inheritance Hierarchy sind viele (alle?) Exceptions aufgelistet.

Mir stellt sich nur die Frage: Wofür?
Meistens braucht man nur eine Handvoll von Exceptions zu kennen (NullReferenceEx., ArgumentEx., FileNotFoundEx., ...) und welche Exceptions eine Methode wirft und warum steht in der Dokumentation (wird in Visual Studio auch angezeigt).
Da ist doch so eine Auflistung eher unnötig.

Evt. helfen dir auch diese beiden Links weiter:
MSDN - Exceptions
MSDN - Exception Hierarchy

28.12.2008 - 20:55 Uhr

Hallo,
also bei VS 2005 Express gibt es in der Toolbox 'Text-Editor' solch einen Button. Ist das 5. Symbol (bei mir), sind so ein paar schwarze Zeilen mit einem blauen Pfeil nach links bzw. rechts, ja nachdem ob man weiter Einrücken möchte oder nicht.

28.12.2008 - 19:48 Uhr

Hallo,
danke für deine Antwort.

Hmm also für den Benutzer (Programmierer) sollte es möglichst leicht sein, das ganze um Handles zu erweitern (dies ist ein Kernpunkt der Library).
Ebenso könnte es sein, dass Objekte einer Art (z.B. integer oder string) verschiedene Handles und somit verschiedene Handelsweisen bekommt. Dies sollte dann der Programmierer selbst festlegen können, welches Verhalten er sich für dieses Objekt wünscht.

Das Problem was ich mit der zweiten Variante, bei der man den Typen übergibt immoment noch sehe: Über ein Interface bzw. eine abstrakte Klasse kann ich ja nicht (soweit ich weiß), festlegen, dass es z.B. einen Konstruktor für (string, object) gibt oder einen Konstruktor ohne Argumente.
Diese Festlegung wäre aber notwendig und lösen könnte ich es nur wenn, falls solch ein Konstruktor nicht vorhanden ist, indem dann eine Exception geworfen wird.

Find ich persönlich etwas unschön. Besser wäre es wenn schon schon während der Kompilierung sicher gestellt ist, dass die Klasse alle notwendigen Methoden hat.

Ein anderer Punkt der für 1) spricht, also dass der Programmierer neben den Daten (ein object) auch ein Objekt von IHandle mit übergibt, und ich dann intern immer CreateInstance() aufrufe wenn ich ein neues Handle benötige, wäre dass man eine Konfiguration mit angeben kann.

Möchte man als Beispiel ein Integer später in verschiedenen Zahlenbasen darstellen lassen (IHandle() hat eine Methode: getValue() welche einen String zurückgibt) so müsste man bei Variante 2) mit typeof() für jede Zahlenbasis eine neue Klasse haben.
Bei der 1. Variante, bei dem der Programmierer ein Objekt von IHandle mit übergibt, könnte er dies entsprechend mit übergeben.

Also so in etwa:
meineKlasse.add(1234, new ZahlenbasisHandle(16));
Würde dann bei getValue() eben 1234 im Hexformat zurückgeben.

Stellt sich nun die Frage ob man dieses nochmal trennt in zwei Klassen. Ich also nicht den IHandler übergebe sondern einen Erbauer der dann ein Objekt von IHandle zurück gibt.

Also in etwa so:


class ZahlenbasisBauer : IErbauer
{
        public ZahlenbasisBauer(int basis) { }
        
        //Methode von IErbauer
        public IHandle CreateInstance(string str, object data) { return new ZahlenbasisHandle(data, this.basis); }
}

class ZahlenbasisHandle : IHandle
{
    public ZahlenbasisHandle(object data, int basis) { }
    //...
}

Dann bei der Übergabe:
meineKlasse.add(1234, new ZahlenbasisBauer(10));
meineKlasse.add(5678, new ZahlenbasisBauer(16));

Und wenn ich auf das object von '1234' oder '5678' zugreifen muss:
IHandle handle = mein_dictonary["key"].Erbauer.CreateInstance("key", obj);
//mache etwas mit handle

Ich glaub dies ist der beste Weg. Der faule Programmierer könnte dann für eine Klasse IHandle und IErbauer implementieren, so dass wenn er die Funktionalität der Library erweitern möchte nur eine Klasse (die zwei Interfaces umsetzt) implementieren müsste.

Gibt es irgendwelche möglichen Probleme/Stolpersteine mit diesem Ansatz?

28.12.2008 - 16:02 Uhr

Hallo,
für eine kleine Klassenbibliothek die ich immoment schreibe müsste ich eine Klasse/Objekt übergeben, die das Verhalten für bestimmte Daten repräsentiert.

Hört sich etwas kompliziert an, aber ich möchte folgendes:
Einer Methode (add) meiner Klasse wird ein object übergeben, dieses speichere ich in einem Dictonary<string, object>.

Diese objects werden nun häufiger benötigt, dabei müssen sie je nach Typ eine andere Verhaltensweise an den Tag legen. Sprich, eine ICollection muss anders behandelt werden als eine DataTable. Diese verschiedenen Verhaltensweisen erben alle vom selbsterstellten Interface IHandle.

Bisher habe ich es so geregelt:


IHandle handle;
//obj kommt aus dem Dictonary
if(obj is ICollection) {
   handle = new CollectionHandle((ICollection)obj);
} else if(obj is DataTable) {
   handle = new DataTableHandle((DataTable)obj)
} else {
   handle = new StringHandle(obj.ToString()); //Default Handle
}
//mache etwas mit handle

Wichtig ist hier, dass das Handle neu erstellt wird.

Nun möchte ich aber, dass schon beim Hinzufügen eines object die zuständige Klasse mit angegeben wird, bzw. das man dann als Programmierer später selber Klassen schreiben kann, die die Verhaltensweise für bestimmte Typen regeln.

Also bisher war der Aufruf immer so:
meineKlasse.add(datatable);
meineKlasse.add("ein String");
meineKlasse.add(ein_int_array);

Nun soll es in etwa so aussehen:
meineKlasse.add(datatable, "DataTableHandle");
meineKlasse.add("ein String", "StringHandle");
meineKlasse.add(ein_int_array, "CollectionHandle");
meineKlasse.add(objekt_vom_programmierer, "HandleDesProgrammieres");

Später wenn ich dann auf z.B. "ein String" zugreifen, soll erkannt werden, dass hierfür die Klasse 'StringHandle' zuständig ist.

Nun ist die Frage, wie man dieses am Besten realisiert.

Mir fielen zwei Wege ein:
1)
Ich übergebe dem add() ein Objekt des jeweiligen Handle, also
meineKlasse.add("ein String", new StringHandle());

Da ich aber bei jedem Durchlauf ein neues Objekt vom Handle brauche, würde das Interface eine Methode 'CreateNewInstance' bereit halten, die mir ein neues Objekt der Klasse zurückgibt.

2)
Ich übergeb den Typ der Klasse, also:
meineKlasse.add("ein String", typeof(StringHandle));

Dann intern wenn ich ein neues Objekt von 'StringHandle' benötige greife ich auf Activator.CreateInstance() zurück und erzeuge ein neues Objekt.

Ist eine der beiden Methoden zu empfehlen oder gibt es eine andere, bessere Lösung?
Wenn ich ein Objekt des jeweiligen Handle angebe, dann kann ich ja schon bei der Methodendefinition angeben, dass diese Klasse das Interface IHandle implementieren muss. Geht dies auch, wenn ich den Typ übergeben würde?

Über Antworten würde ich mich freuen.

18.12.2008 - 18:11 Uhr

Hallo,
"Wie bekomme ich nun das Ergebnis der jeweiligen Berechnung in das Ergebnis-Array ? "

Statt ein Ergebnis Array würde ich eine generische ArrayList verwenden. Dann in 'Berechnung' am Ende einfach ein arraylist.add() ausführen.

Zum Problem mit dem Terminieren:
1.
Sobald dann deine ArrayList 'AnzahlBerechnungen' Elemente hast, hast du alle Ergebnisse (eher unschön)

  1. Die Threads in eine zusätzliche Datenstruktur packen und dann in regelmäßigen Abständen schauen ob es noch laufende Threads gibt.

Achja:
Nicht zuviele Threads, also maximal die Anzahl deiner Cores. (Kann man als Programmierer noch beeinflussen auf welchem Core der Thread ausgeführt wird?)

17.10.2008 - 19:22 Uhr

Hallo,

Mit einem Loop und dem Insert Befehl könnte ich das machen aber das dauert zu lange.

Dann machst du irgendetwas falsch. Eine Datenbank sollte zig hundert bis tausende von Inserts pro Sekunde bearbeiten.

Ansonsten hängt es von dem Datenbanksystem ab, ob die soetwas erlaubt, oft geht es in etwa so:

INSERT INTO table VALUES (1...), (2...), (3...)...

Oder evt. kannst du auch:
INSERT INTO table VALUES (1...);
INSERT INTO table VALUES (2...);

direkt an die DB senden, wäre dann etwas schneller als per Schleife.

14.10.2008 - 21:26 Uhr

Hallo,
ohh da liegt einiges im argen...

Also:
Wenn man die Performance von Betriebssystem (Linux und Windows) vergleichen möchte, ist es, tut mir das zu sagen, total dumm, einen Benchmark in C# zu schreiben.

Denn:

  1. Das .Net Framework ist nur für Windows erhältlich. Für Linux müsstest du auf Mono umsteigen.
  2. Dein Benchmark sagt nichts über das Betriebssystem aus, sondern würde nur etwas über Mono vs. .Net Framework aussagen.

Allerdings auch nich wirklich, denn du müsstest dann Mono auch entsprechend richtig für Linux kompilieren (oder gibts davon binaries die man vernünftig nutzen kann).

Wenn man also einen Benchmark schreibt, dann doch bitte in C/C++ oder Assembler und nicht in einer Hochsprache wie C# bei dem noch diverse Komponenten zwischen Benchmarkprogramm, Betriebssystem (OS klingt besser als BS) und Hardware stecken.

Aber:
Die Fakultät von einer großen Zahl zu berechnen sagt gar nichts über das Betriebssystem aus.
Wenn du das vernünftig programmierst, also nix rekursiv, dann spielt das Betriebssystem überhaupt keine Rolle bei der Ausführung des Programmes.
Das OS stößt den Prozess nur, danach spielt sich alles auf deiner Hardware (CPU, RAM) ab. Gut, ab und zu funkt das OS da zwischen, aber bei der Berechnung einer Fakultät ist es absolut irrelevant.

Dennoch würdest du wahrscheinlich andere Ergebnisse bekommen, dies ist bedingt welchen C-Compiler du nutzt.
Verwendest du unter Linux beispielsweise gcc unter Windows aber Visual C++, erhälst du zwei komplett verschiedene Programme und somit auch verschiedene Laufzeit (wobei bei der Fakultät wären die vermutlich ähnlich schnell).
Auch kommt es hinzu, wie du deinen Compiler nutzt. Verwendest du Optimierungen mit gcc, d.h. mit dem Parameter -O3 kompiliert, dann läuft dein Programm gerne mal bis zu 5 mal schneller ab, selbst wenn der C Code schon sehr sehr gut optimiert ist.

Dann:
Die CPU Auslastung wäre bei der Fakultätsberechnung absolut uninteressant, egal ob Linux, Windows oder BSD, sie sollte in beiden Fällen immer 100% sein.
Was relevant wäre, wäre die Ausführungszeit, aber da hat das OS praktisch keinen Einfluss.

Desweiteren ist die Fakultätsberechnung im allgemeinen total ungeeignet um die Performance einer CPU zu bestimmen. Dort sind nur simple ganzzahlige Multiplikationen notwendig, die praktisch gar nichts aussagen.

Für die CPU Power ist es daher eher empfehlenswert, die FLOPS zu messen. Dort kann man z.B. das Linpack (Open Source) nutzen.

Aber:
Auch hier wird wieder nur die Anzahl an Rechenoperationen (Gleitkommaoperationen) pro Sekunde gemessen. Für den normalen Heimuser bringt das nicht sonderlich viel, dort sind andere Aspekte wichtig, z.B. Latenz für den Zugriff auf den Cache, Hauptspeicher, Festplatte oder ähnliches interessanter und nicht nur Gleitkommaoperationen.

Aber du wolltest ja Betriebssysteme vergleichen:
Stell dir doch die Frage, was Linux von Windows unterscheidet und wie man dort etwas messen kann. Sicher haben beide die selbe CPU (sollten für einen Vergleich auf dem gleichen PC laufen) und den selben Hauptspeicher. Programme die nur Funktionen der CPU benötigen und etwas auf den Hauptspeicher zugreifen werden somit recht identisch unter Linux und Windows laufen.

Du musst also Zugriffe auf Funktionalitäten des OS messen, wie schnell diese vonstatten gehen. Wie schnell und wie oft kann ich auf Dateien zugreifen, schreiben, lesen?
Sprich, du musst verschiedene System Calls durchführen und könntest so theoretisch den Kernel von Windows mit dem Linux Kernel vergleichen.

Das Problem ist:
Der Kernel von Windows und der Linux Kernel sind grund verschieden. Dort kann man nicht einfach ein Programm von Windows nach Linux portieren oder anders herum. Für manche Linux Systemcalls gibts kein entsprechendes Windows Pendant.

Somit sind die Ergebnisse sehr schwer zu vergleichen und solch ein Programm zu schreiben ist ungleich schwieriger.

Zu deinem Programm:
Mal davon abgesehen, dass man, sofern man ein 64 Bit Integer eh nur Fakultäten von rund 20 (also 20!) berechnen kann, arbeitet es höchst ineffektiv.

Du hast es rekursiv gelöst, d.h., bei der Fakultät von 1 Mrd. hätte das Programm bei der Ausführung eine Tiefe von 1 Mrd. Funktionen, da es ja rechnet:
f(f(f(f(f(.....(f(0).....), wobei f(x) für die Fakultät steht. Und dies hättest du entsprechend mit einer Tiefe von 1 Mrd.
Also muss auf den Stack, deswegen auch der Name der Exception, insgesamt 1 Mrd. der Funktionsheader kopiert werden.
Du musst auf den Stack mindestens die Rücksprungadresse (~4 Byte) und den Parameter (wieder 4 Byte) hinterlegen, macht einer Tiefe von 1 Mrd. Funktionen also gute 8 Mrd. Bytes = 8 GB die du auf den Stack (der im Hauptspeicher gehalten wird) hinterlegen.

Das du dort einen Overflow bekommst, ist klar.

Da du aber eh nicht die Fakultät von 1 Mrd. berechnen kannst, könnte man auch einfach ein bischen addieren und multiplizieren und dies 1 Mrd. mal wiederhohlen.

04.10.2008 - 12:39 Uhr

Hallo,
oder nochmal zum Verständnis hier nochmal die C# Variante (ist aber langsamer):


//Kopiert den Inhalt von recdata nach data
byte[] data= new byte[recdata.Length];
for(int i=0;i<data.Length; i++)
   data[i] = recdata[i];

03.10.2008 - 19:59 Uhr

Hallo,
naja wenn du eine 32 Bit Wortbreite hast, kannst du maximal um 32 Bit rotieren.
Wenn du 33 Angibst, dann steht dort (zahl >> -1). Ich glaub das mag der Compiler nicht ganz so 😉

Was herbivore meinte ist, dass wenn man um z.B. 40 Bit rotieren muss, man eben auch um 8 Bit rotieren kann.

Also die Funktion für left-Rotate (um b rotieren):
(zahl << (b%32) ) | (zahl >> (32- (b%32)) )

Wenn man gewährleisten kann, dass b < 32 ist, sollte man es nicht nutzen, da modulo sehr sehr langsam ist.
Statdessen sollte auch ein & mit 0x1F klappen (erheblich schneller):
(zahl << (b&0x1F) ) | (zahl >> (32- (b&0x1F)) )

(Alles ungestetet, sollte aber klappen).

03.10.2008 - 19:52 Uhr

Hallo,
bitte was möchtest du?

Irgendwie wiedersprichst du dir.

Du hast z.B. das Array recdata = {0x11, 0x22, 0x33}, was soll dann in data[0] stehen?
Soll dort dann 0x110x220x33, 112233, oder 0x11+0x22+0x33 oder soll data = {0x11, 0x22, 0x33} sein?

Achja, das + bewirkt bei byte eine echte Addition, nicht wie bei Strings das aneinander hängen. Also die Zahlen Werte (ein byte ist ein byte, egal ob ich das byte als Hex oder als Dezimalzahl ausdrücke) werden wirklich addiert.
Dabei passiert aber ab der Zahl 256 ein Überlauf und es fängt wieder bei 0 an.

03.10.2008 - 16:51 Uhr

Hallo,
und zum rotieren dann einfach einmal << und >> anwenden.

Also left Rotate um 4 Bits:
int zahl_neu = (zahl << 4) | (zahl >> (32-4)); (Dies muss man auf die Wortbreite entsprechend anpassen, bei 64 Bit die 32 durch 64 ersetzen)

Achja, ansonsten ist mir keine Hochsprache bekannt, in der es eine Funktion zum Rotieren gibt. Evt. fällt jmd. eine ein?

05.09.2008 - 20:53 Uhr

Hallo,
wenn auf dem Server (mit PHP) mcrypt installiert ist, dann sollte es gehen.

Dazu erstellst du ein Public Key für RSA, dieser ist dem Client (C#) bekannt. Der Client verschlüsselt dann per RSA eine (sichere!) Zufallszahl, sendet diese an den Server. Der Server entschlüsselt diese und speichert es z.B. in einer Session o.ä. ab.

Dann einfach alle Daten z.B. per AES verschlüsseln. Hast du, wenn mcrypt installiert, sowohl in PHP als auch in C# implementiert.

Nachteil:
RSA Entschlüsselung ist als PHP Script (z.B. über bcpowmod) extrem langsam. Allerdings ist RSA in mcrypt enthalten, ob man es aber über PHP ansprechen kann, und wenn ja wie, weiß ich nicht.

Sollte mcrypt nicht zur Verfügung stehen, kann man noch Algorithmen in PHP direkt implementieren, dort würde ich zu Blowfish raten, wobei man die fertig generierten P- und S-Boxen abspeichern sollte (dauern in PHP recht lange).
Blowfish ist in PHP der schnellste Algorithmus, dennoch sehr langsam mit nur rund 90 KB pro Sekunde. Große Daten damit auszutauschen ist nicht.

Achja, du musst dir evt. auch noch Gedanken über Authenfizierung machen.

PS:
Bist du dir sichern, dass du nur PHP zur Verfügung hast. MySQL Datenbanken bieten oft auch eine SSL Connection an (in PHP über mysqli::ssl_set).
Dort ein Zertifikat einzurichten und dieses im C# Client zu überprüfen ist erheblich weniger Aufwand und auch noch sicherer.

28.08.2008 - 20:20 Uhr

Hallo,
schau mal hier auf der linken Seite, unter Ressourcen (dort dann openbook).
Dort sind einige .Net/C# Bücher aufgeführt, und das Beste, du kannst zuvor darin schmöckern bevor du sie kaufst. So erfährst du direkt, ob es die richtigen Bücher für dich sind. 😉

24.08.2008 - 17:48 Uhr

Hallo,
du kannst \neq nur in Formeln verwenden, musst es also mit $ z.B. "umbinden":

falsche Aussage für $x \neq 5$

PS: Es ist schöner alle Variablen in einer mathematischen Umgebung zu haben, also auch alle x:
$x$ ist ein Wochentag; B: $2+x=7$ ist keine Aussageform (sondern Unsinn) \newline
$x$ ist eine Zahl; B wie oben: B ist jetzt eine Aussageform \newline
wahre Aussage für $x=5$ \newline
falsche Aussage für $x \neq 5$

14.08.2008 - 14:09 Uhr

Hallo,
nein.

Die Protokolle, für Ping ICMP, Echo reply, sind standardisiert und ich glaube nicht, dass in diesem Protokoll ein Feld vorgesehen ist, von welcher Applikation bzw. Betriebssystem das Packet kommt.

Siehe dazu:
Ping
ICMP
RFC von ICMP

Echo or Echo Reply Message

  
    0                   1                   2                   3  
    0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1  
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
   |     Type      |     Code      |          Checksum             |  
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
   |           Identifier          |        Sequence Number        |  
   +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+  
   |     Data ...  
   +-+-+-+-+-  
  

IP Fields:

Addresses

  The address of the source in an echo message will be the  
  destination of the echo reply message.  To form an echo reply  
  message, the source and destination addresses are simply reversed,  
  the type code changed to 0, and the checksum recomputed.  

IP Fields:

Type

  8 for echo message;  

  0 for echo reply message.  

Code

  0  

Checksum

  The checksum is the 16-bit ones&#39;s complement of the one&#39;s  
  complement sum of the ICMP message starting with the ICMP Type.  
  For computing the checksum , the checksum field should be zero.  
  If the total length is odd, the received data is padded with one  
  octet of zeros for computing the checksum.  This checksum may be  
  replaced in the future.  

Identifier

  If code = 0, an identifier to aid in matching echos and replies,  
  may be zero.  

Sequence Number

[Page 14]

September 1981
RFC 792

  If code = 0, a sequence number to aid in matching echos and  
  replies, may be zero.  

Description

  The data received in the echo message must be returned in the echo  
  reply message.  

  The identifier and sequence number may be used by the echo sender  
  to aid in matching the replies with the echo requests.  For  
  example, the identifier might be used like a port in TCP or UDP to  
  identify a session, and the sequence number might be incremented  
  on each echo request sent.  The echoer returns these same values  
  in the echo reply.  

  Code 0 may be received from a gateway or a host.  

Im Data könnte man evt. die Herkunft angeben, ist aber eher unwahrscheinlich.

07.08.2008 - 22:08 Uhr

Hallo,
zwar ist deine Aufgabenbeschreibung etwas ungenau, wozu du nun ulong brauchst, aber das könnte dir helfen:

  1. Wandle long bei der Ausgabe einfach entsprechend um. long bzw. ulong hat nur etwas mit der Representation des Bitwertes zu tun (zumindest bei den meisten Operationen), schau dir in diesem Zusammenhang einfach mal Zweierkomplement an.

Wenn du z.B. eine 6 Bit Variablentyp hast, dann wäre:
51+6 = 57 =111 001 (unsigned)
51+6 = -7 = -111 = 111 001 (signed)

Genauso ist es bei long unter Java. Du kannst eine negative Zahl problemlos in die positive Zahl umwandeln.
Wenn bei der Rechnung 51+6 =-7 erhälst (durch Überlauf), kannst du es problemlos in 57 konvertieren.
Wie man aber das Ergebnis von 57 in Java abspeichert, ist ne andere Geschichte.

  1. Unter Java gibts die Klasse BigInteger (java.math), dort tritt das Problem mit dem Überlauf nicht mehr auf.
    Das Rechnen mit BigInteger in Java ist einfach grausam, im gegensatz zu BigInteger Implementierungen in C#, da man in Java Operatoren wie + und * nicht überladen kann und deswegen immer x.add(anotherBigInteger).mult(anotherBigInteger); schreiben muss, wobei man sogar kleine Zahlen entsprechend in BigInteger umwandeln musst.

  2. Benutz Google:
    Java+unsigned

denn du bist nicht der Erste, der das Problem hat.

04.08.2008 - 20:38 Uhr

Hallo,
ja du sagst es, musst dort deinen eigenen Comparer schreiben, der zwei myPersonen Objekte vergleicht und dort dann entsprechend bei den Objekten die PLZ raussucht.

29.04.2008 - 23:28 Uhr

Hallo,
ein zwei dimensionales Array wird i.d.R. auch als Matrix dargestellt, sind aber nicht das selbe (z.B. ist Operation + für zwei dimensionale Arrays nicht implementiert).

Aber ja, zwei dimensionale Arrays eignen sich super, um Matrizen, nicht nur quadratische, anzulegen. Einfach die Zeilenanzahl/Spaltenanzahl entsprechend angeben.

wie berechne ich dann aus der matrix die jeweiligen zeilen und spaltensummen?

Mit einer Schleife. Einfach das Array entsprechend durchlaufen, z.B. entweder den Index fürs 1. oder die 2. Dim. hochzählen und alle Werte zusammenaddieren, bis zu das Zeilen/Spaltenende erreicht hast

24.04.2008 - 19:41 Uhr

Hallo,
@1: Nein:

Ein Webservice bzw. Webdienst ist eine Software-Anwendung, die mit einem Uniform Resource Identifier (URI) eindeutig identifizierbar ist und deren Schnittstellen als XML-Artefakte definiert, beschrieben und gefunden werden können. Ein Webservice unterstützt die direkte Interaktion mit anderen Software-Agenten unter Verwendung XML-basierter Nachrichten durch den Austausch über internetbasierte Protokolle.

>

@2: Das ist auch eines der Ziele von Webservices. Solange die Antworten stimmen (richtiges Format haben), kann man eigentlich alles verwenden, vom simplen PHP Script bis zur Java-Applikation

@3: Hängt davon ab, womit du den Webservice geschrieben hast (PHP, C#, Java...).

@4: Richtig, aber für größere Sachen nichts empfehlenswert. Aber solange der PHP Script richtig antwortet wäre das kein Problem.
Allerdings ist das bei größeren Sachen schon recht aufwendig, da es afaik keine besondere Unterstützung für Webservices mit PHP gibt (die dann mit C# kompatibel sind)

@6: Ja so in etwa.

Ansonsten zu deinem Vorhaben:
Entweder du liest dich in die verschiedenen Formate ein, oder du erstellst einen kleinen Webservice mit C# (Server und Client).
Dann kannst du ja gucken, was der Client so sendet und wie der Server dann antwortet.
Soetwas kann man dann auch recht einfach mit PHP nachbauen, sofern es nicht zu komplex wird (für 'Hallo Welt' sollte ne einfache Ausgabe schon reichen).

Hoffe ich konnte helfen

03.03.2008 - 18:04 Uhr

Hallo,

hallo,
Andavos: werden die .htaccess-dateien denn überhaupt von webservern wie dem IIS ausgewertet? ich dachte die wären spezifisch für den apache-webserver.

Ja stimmt, hab dran nicht gedacht.
Hab primär mit Apache zu tun (bin auch kein wirklicher Freund vom IIS) und habe nicht dran gedacht dass ASP.Net so gut wie immer mit dem IIS verbunden ist.

Naja, wenn du dann mal was mit dem Apache zu tun hast, weißt du wonach du suchen musst 😉

01.03.2008 - 20:55 Uhr

Hallo,
dies nennt man Mod rewrite, google liefert genügend Ergebnisse dazu.

Dein ASP.Net Script sieht ganz normal aus, als ob du z.B. artikel.aspx?artikelnr=2452 benutzen würdest.
Die .htaccess Datei lenkt dann eine Anfrage wie:
/nachrichten/2452/hier-ist-egal-was-steht

auf artikel.aspx?artikelnr=2452 um.

Bsp. dafür:
http://www.amazon.de/Amazon-verkauft-keine-Buecher-mehr/dp/1590595610/

30.01.2008 - 19:17 Uhr

Hallo,
ich denke mal es liegt nicht an der DB Abfrage sondern an der Darstellung.
Ich vermute mal due fügst ein Item der Box hinzu, diese Zeichnet sich dann neu, und dann fügst du wieder nur 1 Item hinzu.
=> 20 000 mal Neuzeichnen.

Musst dieses am besten Unterbinden (BeginUpdate() sofern vorhanden) bis du fertig bist

08.01.2008 - 21:54 Uhr

Hallo,
dass liegt an der Initialisierung des Random-Objektes.
Dort wird, sofern ich weiß, als Startwert die Zeit verwendet. Wenn du die Methoden aber 2 mal nacheinander aufrufst, hat sich die Systemzeit zwischen den beiden Aufrufen noch nicht verändert, sprich beide Random-Objekte haben die gleiche Zeit als Startwert => gleiche Zufallszahlen.

Entweder den (angeblich...) kryptographisch sicheren Radom-Generator verwenden (eigentlich unnötig) oder z.B. ein globales Random Objekt haben, welches nicht jedes mal neu initialisiert wird, womit du dann immer neue Zufallszahlen bekommst.

30.12.2007 - 19:53 Uhr

Hallo,
@MaikK:
Das dachte ich auch, aber so wie ich ihn nun verstanden habe, möchte er, dass wenn die Maus 3 Sekunden lang gedrückt lässt, sich eine MessageBox öffnet.

Wobei sein Pseudocode etwas anderes vermittelt.

Also:
Wie tscherno bzw. juetho schon sagten, es gibt ein Control das nennt sich Timer, bei dem kannst du auf das Tick-Event reagieren.
Bei MouseDown einen Timer aktivieren (enable = true), die Tick-Zeitspanne auf 3 Sek setzen und dann im Tick-Event die Msg-Box ausgeben.
Ansonsten kannst du in der Methode für das MouseDown-Event eine extra Methode in einem eigenem Thread starten, diese Methode legst du dann 3 Sekunden lang schlafen und dann wird die Msg-Box aufgerufen.

Aber achtung, egal ob mit Ticker oder mit extra Thread, du musst bei MouseUp den Ticker deaktivieren bzw. den Thread killen.

Jetzt sollte dir aber genug geholfen worden sein

30.12.2007 - 16:06 Uhr

Hallo,
beim MouseDown die Zeit abspeichern und dann beim MouseUp-Event die Differenz zu dieser Zeit berechnen und ausgeben, sonfern es das ist was du haben möchtest

09.12.2007 - 14:22 Uhr

Hallo,
wenn man mit dem Visual Studio arbeitet ist doch diese Member-Übersichtsseite eh so gut wie überflüssig.
Die IDE zeigt dir doch an, welche Methoden ein Objekt/Klasse dir anbietet und was diese Methode bewirkt und im Objektbrowser von Visual Studio sind alle Namespaces und der Klassen, sowie deren Beschreibungen aufgeführt.

Groß in der MSDN muss man eigentlich nicht rumwühlen, die meisten relevanten Infos liefert dir bereits Visual Studio.
Und ansonsten drückt man, wenn man eine Methode nicht kennt, einfach die F1-Taste und schon wird die entsprechende MSDN Seite geladen.

MFG

01.12.2007 - 21:14 Uhr

Hallo,
dein hbit wird nicht richtig gesetzt, da (crc32 & 0x80000000) nie den Wert 0x10000000
annehmen kann.
Ansonsten, (afaik), enhält C# bereits eine Funktion um den CRC32 Wert zu berechnen.

18.11.2007 - 14:16 Uhr

Hallo,
du verwendest ja einen Networkstream um übers Net Daten zu senden/empfangen.
Eigentlich sollte doch somit das weitere Vorgehen klar sein. Du musst diesen Networkstream einfach nur so umleiten, dass dieser als Eingabe für den Musik-Player dient.

Gut, Probleme könnten z.B. buffering sein, aber im Prinzip ist es doch so leicht (sofern die Musik-Player-Class gut geschrieben ist).

Zum Thema senden der Musik:
Die Musik liegt denk ich mal in einer Datei, das Format der Musik sollte natürlich eins sein, welches zum Streamen geeignet ist.
Dann musst du einfach die Datei stückchenweise auslesen und über den Networkstream versenden.

Hoffe ich konnte weiterhelfen

15.11.2007 - 22:13 Uhr

Hallo,

Original von aime2code

Wie entschlüssele ich den String dann wieder?

Gar nicht. Weitere Ausführen dazu findest du in Wikipedia o.ä.

Zum Verschlüsseln von Strings findest du viele fertige Klassen & Tutorials, die mit AES (bereits enthalten) zusammenarbeiten.
Einfach mal die Suchmaschine deines Vertrauens bemühen

13.11.2007 - 23:30 Uhr

Hallo,

Original von digi333
Schlecht... Arrays sind generell ziemlich langsam.

hmm, dass kann ich mir gar nicht so recht vorstellen.

In einer Anwendungen verwende ich Arrays mit über 100 Millionen Elementen, und diese läuft dennoch sehr schnell.

Ich schätze mal eher dass das Problem wo anders liegt und nicht der Zugriff auf das Array der bremsende Faktor hier ist.

22.10.2007 - 14:32 Uhr

Hallo,
also für beliebig große Zahlen würde ich es so machen:


public int CountBits(int n) {
  int cnt = 0;
  for(;n > 0;n>>=1) 
     if( (n&1) == 1) 
       cnt++; 
    
  return cnt;
}

Oder die ganz kurze Variante 😉


public int CountBits(int n) {
  int cnt = 0;
  for(;n > 0; cnt += (n&1), n>>=1) ;     
  return cnt;
}
09.10.2007 - 15:36 Uhr

Hallo,
da gibts viele Möglichkeiten, angefangen zufällig 2 Elemente zu vertauschen usw. oder auch so:


if(alleFragen.Count >= 7)
 while(fragen.Count < 7) {
      int i = Random.Next(0,alleFragen.Count);
      if(fragen.Contains(alleFragen[i]))
          fragen.Add(alleFragen[i]);
 }


fragen ist dann eine generische Liste (List<>)

06.10.2007 - 21:44 Uhr

Hallo,

Original von hobo
weil auf die besonderen Eigenschaften, die DatenFeld definiert nicht zugegriffen werden soll.

Eine casting nach Feld ist aber kein zuverlässiger Schutz, da ich diese wieder problemlos zurück nach DatenFeld casten kann und so die anderen Eigenschaften zu gesicht bekomme.

Ansonsten ist es egal, ob du explizites oder implizites casten verwendest. Explizites casten verwendet man i.d.R., wenn man mit implizites casten nicht weiter kommt.

Ein sicherer Schutz wäre, wenn du die die Zugriffsrechte der 'verbotenen' Eigenschaften von DatenFeld richtig setzt, z.B. auf internal so dass man die nur intern verwenden kann.

Solltest du auch den Zugriff von internen Klassen unterbinden wollen, müsstest du wohl ein neues Objekt des Typs 'Feld' erstellen und dies der List hinzufügen.

06.10.2007 - 20:29 Uhr

Hallo,

Original von TheHacker
Ich versuche derzeit über selbsttraining C# zu erlernen.

dann wäre doch so ein Programm genau das richtige Training für dich.

Ich habe das ganze in php versucht, da ich php schon einigermaßen kann

Also mit PHP5 + SimpleXML ist das eigentlich ganz einfach.

Per readdir() liest du alle XML Dateien aus (Codeschnipsel dazu im PHP Manual) und per SimpleXML parst du dann die XML Datei.
Mittels: $datei->pfad->zum->element kannst du dann auf das Element zugreifen, bzw. per foreach alle Elemente durchlaufen.

Aber auch mit C# ist das nicht allzuschwer, wie gesagt, die perfekte Übung für dich

06.10.2007 - 20:23 Uhr

Hallo,
was versprichst du dir denn von einem asynchronem Connect?
Verwende doch lieber den normalen synchronen Connect, wüsste nicht was jetzt gegen diesen Sprechen sollte.

Und wie sieht deine cbConnect Methode aus, du kannst schließlich erst Daten senden, wenn die Verbindung steht.

04.10.2007 - 22:24 Uhr

Hallo,
bist du dir sicher, dass aus deinem String das richtige resultiert? Was passiert mit dem und?

würde es so machen:
Wörter nacheinander abarbeiten (entweder direkt per split beim Leerzeichen trennen oder den Zeiger, den es so ja nicht mehr gibt, immer zum nächsten Leerzeichen weiterlaufen lassen).
Dann in einer Hashtable speichern, ob das Wort schon vorhanden ist, wenns schon vorhanden ist nichts weiter machen, wenn noch nicht, dieses Wort der Hashtable hinzufügen und an einen StringBuilder anhängen (zzgl. Leerzeichen).

Das ganze mit dem StringBuilder kann entfallen, sofern du nur die einzelnen Wörter brauchst und keinen neuen String