Laden...
E
Efftee myCSharp.de - Member
Programmierer, Entwickler, Entwicklungsleiter Oldenburg Dabei seit 02.02.2005 100 Beiträge
Benutzerbeschreibung

Forenbeiträge von Efftee Ingesamt 100 Beiträge

30.05.2005 - 21:57 Uhr

Warum willst du es machen, wenn es exakt das selbe wird?

Ich denke, entweder meinst du es besser zu können, du möchtest das ganze billiger anbieten (etwa umsonst?), oder du möchtest es wirklich verbessern.

Im ersten Fall: Viel Spass. Die Tücke steckt meist im Detail, und eine Software komplett in allen Funktionen nachzubauen ist so ziemlich die unproduktivste und langweiligste Möglichkeit überhaupt Software zu machen.
Falls du es im zweiten Falle billiger machen willst, warum? So wie es ist wird es ja auch gekauft, also warum nicht was besseres machen, und zum gleichen Preis?
(Im Falle das du es der Welt schenken willst, geh die selbe Zeit jobben, und Spende das Geld irgendjemanden der es nötig hat. Das finde ich wesentlich sinnvoller. )
Falls du es verbessern willst, brauchst du auch nicht die Oberfläche 1:1 kopieren, womit sich die Frage dann erledigt hätte.

Ich verstehe immer noch nicht den Grund....

29.05.2005 - 10:27 Uhr

Ja, das .NET Framework. 🙂
(Obwohl das auch nicht stimmt, da nichtmal das passiert... )

Mit welcher Version des Frameworks erstellst du deine Programme? Diese Version muss auf dem Rechner installiert sein, ansonsten kann er damit rein garnichts anfangen.
Das ist dann nur eine Sammlung von Pseudocode, mit der kein Rechner was anfangen kann, auf dem das Framwork nicht installiert ist.

27.05.2005 - 19:02 Uhr

google html2pdf

26.05.2005 - 09:02 Uhr

Du kannst es nur rausbekommen, indem du versuchst zu lesen. Anders geht es nicht.
Wenn die andere Seite verschwunden ist (Netzwerkkabel abgezogen, oder einfach nur weg), und due versuchst ein Read, bekommst du eine Exception die du abfangen musst. Anders geht es nicht.

Das ist ein Erbe der MFC-Socket-Klassen, in denen das auch nicht anders war.

24.05.2005 - 12:55 Uhr

Warum nicht WLAN, wenn es schon wireless sein soll?

Mit Bluetooth bekommt du in dem Moment die Krätze, wenn du den MS-Stack impelmentiert hast, und dann feststellst, daß das neue Gerät den Widcomm-Stack verwendet. Und um den zu benutzen, braucht man (wie ich meine) das SDK.

Vor dem Problem stehe ich nun nämlich auch. Ich hoffe das sich da mit CE 5 was tut, so ist das absolut kein Zustand....

Ansonsten soweit OK, eventuell kannst du da mit Remoting ansetzen.

22.05.2005 - 21:08 Uhr

Indem du "Materialverwaltung.dll" erstmal in ein bestimmtes Verzeichnid plazierst. (Plugins, zb). Das Objekt der DLL sollte ein Interface "KundenPlugins" beinhalten, welches jedes Plugin hat. Auch Kundenverwaltung!

Bei Instaziierung (mit Reflektion) übergibst du den Plugins eine Referenz auf die Verbindungschicht, über die dieses Plugin mit dem Rest der Anwendung, und die Anwendung mit dem Plugin kommunizieren kann. Es geht auch, das du dem Plugin gleich eine Refenrenz der Datenschicht gibst, aber von dem Vorgehen bin ich kein grosser Freund, da dieses die Datenschicht wiederum zu starr gestaltet. Eine zentrale, dumme Drehscheibe ist sicherlich mehr Aufwand und komplizierter, begünstigt allerdings auch die allgemeine Austauschbarkeit der Module.

22.05.2005 - 16:32 Uhr

schön 🙂

22.05.2005 - 13:55 Uhr

mach doch....?

laden, ändern, speichern.

22.05.2005 - 11:29 Uhr

Du musst auf das Graphics-Object malen, welches du im Paint-Event übergeben bekommst! (e.Graphics)

Die PictureBox kannst du refreshen mit Refresh();

So wie du das machst, ist das falschrum. Erst wird das Paint-Event aufgerufen, und im PaintEvent holst du dir dann die Informationen was gezeichnet werden soll.

22.05.2005 - 11:26 Uhr

Trenne strikt (!!) den funktionellen Teil, und den GUI-Teil. Das geht prächtig über Interfaces + events, und eine klare Zuordnung wer was machen soll. Im Zweifelsfalls macht die GUI nichts, sondern fragt die Core das zu machen.

Wichtig ist, das beide verschiedenen GUIs nur das machen können was sie machen müssen, und die Core über die Implementation des Interfaces abfragt ( if(form is Interface) ) ob die Form das verarbeiten kann bevor mit (Interface)Funktion() diese aufgerufen wird.

Wenn du Funktion und GUI getrennt hast, kannst du beliebig tauschen und verschiedene Usercontrols basteln, die du dann von der eigentlichen Funktion aus beliebig befruchten kannst.

Das mag alles absoluter overkill zu sein, und erfordert sehr viel Disziplin, erleichtert aber grundsätzlich die Wiederverwertbarkeit.

22.05.2005 - 11:18 Uhr

Wie zeichnest du was neu?

nimmst du das e.graphics oder welches Object benutzt du?

22.05.2005 - 11:12 Uhr

Nein, das geht so einfach nicht. Mehrdimensionale Arrays sind manchmal ein wenig komisch zu handhaben.

Nimm einfach ein MultiArray:
Auch das ist bei den Initialisierung komisch zu handhaben, aber irgendwas ist ja immer 😉


float[][] 2DArray = new float[10][];
for(int i=0; i<=2DArray.GetUpperBound(0); i++){
     2DArray[i] = new float[10];
}


.......


for(int i = 0; i<=2DArray.GetUpperBound(0); i++)
    MyObject.set1DArray(2DArray[i]);


21.05.2005 - 12:18 Uhr

Das es zäh läuft, liegt wahrscheinlich am Remoting. Ich weiss nicht warum man Dir das empfohlen hat, aber es gibt dutzende andere (einfacherer) Wege das auf die Reihe zu bekommen.

Was übergibst du denn? Den Dateinamen, oder die komplette Datei?

*Muss* es unbedingt Rechtsklick sein? Dann wirst du um eine ClientAnwendung wahrscheinlich wirklich nicht rumkommen, allerdings reicht es hier wohl aus die Dateipfade per Messaging zu übergeben. Beim Remoting hast du immer einen Port nach aussen offen, was mir persönlich ganz arg wiederstrebt. Je nach gewählter Personal Firewall bremst die dann auch nochmal mit. (Wenn verwendet....) Und damit hast du wieder eine Fehleequelle mehr, die du nicht debuggen kannst.

Windows Messaging reicht dazu dreimal aus.

Schau Dir mal (alternativ) den Namespace System.Messaging an. Ich habe grade kein passendes Tut gefunden, ist auch ne Menge, kann man aber auch viel mit anfangen 😉

21.05.2005 - 11:33 Uhr

Du kannst natürlich statt mit RegEx auch mit IndefOf, Substring, etc arbeiten. Die String-Klasse hat da nun wirklich eine Unmenge von Manipulationsmöglichkeiten.

Eigentlich so ziemlich alles was hier public ist:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemstringmemberstopic.asp

Es kommt drauf an nach was du noch suchst, was immer vorkommt, was sich in der Länge und/oder Reihenfolge nicht verändert...... grundsätzlich kann man mit RegEx alles zu packen bekommen, teilweise ist es allerdings ein wenig knifflig die RegEx zusammenzubauen, da jede Sprache die in bestimmten Punkten ein wenig anders hält....

--edit--

Wegen RegEx, schau mal hier:
http://www.codeproject.com/dotnet/RegexTutorial.asp

20.05.2005 - 16:54 Uhr

Ups, Bitconverter war da Blödsinn...


Encoding.Default.GetString(target, 0, target.Length);

.... oder wie Pulpaplex sagte, StringBuilder. Der ist allerdings wesentlich langsamer.

20.05.2005 - 16:24 Uhr

1.) ref auf ne ArrayList ist doppelt gemoppelt, da es eh ein Referenztyp ist.
2.) Der Fehler liegt nicht an der ArrayList, sondern an deinen permanenten Zugriffen auf die RichTextBox!

Ersatzcode hier: (mit ArrayList)


private void brightnessToASCII(ArrayList raw, bool inverted) {
  int i=0;
  this.rtbASCII.Clear();
  byte[] target = new byte[raw.Count];

  if(!inverted) { // normal
    foreach(byte b in raw){
      i++;
      if(b == 101) {
        target[i] = 13;
        continue;
      }
      if(b > 80) {
        target[i] = (byte)'X';
        continue;
      }
      if(b > 70) {
        target[i] = 219;
        continue;
      }
      if(b > 40) {
        target[i] = 216;
        continue;
      }
      if(b > 20) {
        target[i] = (byte)':';
        continue;
      }
      
      target[i] = (byte)' ';
    }
    
    rtbASCII = BitConverter.ToString(target);
  }
}

20.05.2005 - 16:12 Uhr

Also so knifflig ist das nicht, und solange es viele Lesevorgänge sind, bringt das schon was....


public void Append(ref byte[] source, byte nbyte) {
   byte[] target = new byte[source.Length +1];
   source.CopyTo(target, 0);
   target[target.Length -1] = nbyte;
   source = target;
}

(Mecker: Ist es eventuell möglich hier im Editor TAB als 3 Leerzeichen zu interpretieren?? Das ist echt nervig beim Sourcecode tippen....)

20.05.2005 - 16:04 Uhr

Falls du mit GetPixel arbeitest, liegt da das Problem......

20.05.2005 - 15:52 Uhr

Ich antworte hier mal 🙂

Die ArrayList ist arschlangsam. Wie so ziemlich alle Objekt Listen. Mache daraus ein byte[], das ist wesentlich schneller. Frag mich nicht nach dem Faktor, aber es ist erheblich! Dynamisch hast du ja schon 😉 .... Anders gibts das nicht, es sei denn du baust das selbst, was aber auch nicht so tragisch ist.

Was vergleichst du da denn? Und welchem Umfang haben die Werte? Poste mal deine if-schleife, dann kann dir bestimmt jemand helfen.

20.05.2005 - 15:48 Uhr

In diesem Thread findest du etwas zu Optimierung. Aber das ist ne Streitfrage an sich..

20.05.2005 - 14:34 Uhr

Geht, ist aber nicht grade leicht. Teilweise gibts zwei Lösungen, was dann? Und für einfache Formeln reicht wohl sowas:


private double Missing(object paraa, object parab, object parac) {
   double a=0,b=0,c=0;
   int x = 1;
   double trash;

   trash = (paraa != null) ? (a = Convert.ToDouble(paraa)) : (x *= 2);
   trash = (parab != null) ? (b = Convert.ToDouble(parab)) : (x *= 3);
   trash = (parac != null) ? (c = Convert.ToDouble(parac)) : (x *= 4);

   if(x < 2 || x > 4){
      MessageBox.Show("Fehler in Parametern!");
      return 0;
   }
  
   try {
      switch(x){
         case 2:
            return b*c;
         case 3:
            return a/c;
         case 4:
            return a/b;
      }
   }catch(Exception) {
      MessageBox.Show("Division / 0");
      return 0;
   }
   return 0;  // <- kann eigentlich nie kommen....
}

20.05.2005 - 13:50 Uhr

Der Hash eines jeden Objektes bezieht sich nicht auf den Inhalt, sondern nur auf das refenrenzierte Objekt! Das taugt garnicht im identifizieren.

Das mit den gdi-Befehlen ist schon nicht schlecht. Allerdings weiss ich nicht wie sich das mit Buttons und anderen Userobjekten verhält....

Wie captured man diese Befehle?

20.05.2005 - 13:24 Uhr

@CyberSAP
Ne, ist nicht schnell genug 🙂
Ich habs selbst ausprobiert, und der Zugriff über GetPixel/SetPixel ist schnarchlahmarschig.
Aber sooooo wild ist das auch nicht. Dann schreibt man halt "unsafe" vor der Deklaration der Berechnungsroutine, und kann wunderbar mit Pointern durchiterieren 🙂

Hier ist das ansonsten mal Image-Processing mit C# sehr ausführlich beschrieben. Absolut lesenswert!!
http://www.codeproject.com/cs/media/csharpgraphicfilters11.asp

20.05.2005 - 13:08 Uhr

@svenson:
Darfst du bloss nicht, weil GPL.

20.05.2005 - 13:04 Uhr

OK, mal nen technischen Vorschlag, nur bezüglich der Bildschirmübertragungen. Nihct fundiert, nur ein paar Ideen wie es ressourcenschonend gehen könnte.

Wie das Bild zu bekommen ist, habe ich keine Ahnung. Grafikbuffer auslesen, etc. irgendwie so.

1.) Bild nur in 256 Farben, und angepasste Map der benutzten Farben um einen brauchbaren Kompromiss zwischen Aussehen und Performance zu haben.

2.) Bild in einzelne Kacheln unterteilen. Kacheln nebst Hashwert zwichenspeichern.

3.) Wenn Hash einer neueren Kachel anders ist, Diff der alten und neuen Kachel erstellen und diesen (gepackt?) übertragen.

4.) Der Mauszeiger muss immer rausgerechnet werden, und seperat an Hand der Position die er hat übertragen werden.

5.) Ich würde die Verbindungsherstellung über TCP/IP machen, und die Daten über UDP rausblasen. Remoting würde ich nicht machen. Wer weiss auf welchem System dsa funktioniert oder nicht.

Grösse der Kacheln kann man in Experimenten herausbekommen, eventuell muss man die dynamisch ändern.

Das Berechnen sollte man besser in C++ oder unmanaged machen, da es mit Pointern direkt auf die Pixel erheblich schneller geht. Zur Bildmanipulation selbst gibts was bei Codeproject.

Für alles andere muss der Threadstarter erstmal Infos und Bedingungen nachliefern, da man da sonst nichts weiter sagen kann.

20.05.2005 - 12:16 Uhr

Wird das File gross (also richtig, so > 2MB) dann Convertiere in byte[] (mit BitConverter) und schreiben mit FileStream.

Ansonsten kannst du den TextWriter nehmen.

In beiden Fällen achte auf Encoding.Default !

20.05.2005 - 11:59 Uhr

*leicht* OffTopic:

Ich denke das es sinnvoll wäre, gleich csv davon zu machen, was ungefähr das ist was dir vorschwebt.
http://www.hi-tier.de/Entwicklung/Konzept/HITP/csvformat.html

Leider kann ich Dir sonst nicht helfen. Ich arbeite nicht mit den Datenkomponenten.

20.05.2005 - 10:21 Uhr

Original von Azrael Masters
Der Projektleiter meinte es seie ja angeblich nicht schwer zu realisieren da bereits seiner Aussage nach "minderintelligente" Jugendliche in der Lage wären einen Trojaner zu schreiben, was ja im eigentlichen Sinne ja auf einer erweiterten/spezialiserten RemoteControll basiert.

Zitat aus Dilbert
Chef:
"Ich gehe davon aus, das alles was ich nicht verstehe leicht zu implementieren ist.
Bauen Sie eine Client-Server Applikation die alle Datenbanken unseres Unternehmens vernetzt. Zeit: 6 Minuten."

Mein erster Gedanke:
Dein Projektleiter ist ne Pappnase, Betriebswirt oder beides. In allen Fällen hat er dem Kunden schon erzählt das es in 4 Wochen fertig ist.
Hätte ich ihn in einer Planungssitzung sowas sagen hören, dann wäre er schon mal derjenige erste, dessen Meinung mir total am Arsch vorbeigeht. Sprich selbst ohne deinen Leiter mit dem Kunden. Ich denke, der will es etwas anderes als dein Projektleiter verstanden hat.......

Also das Ding soll:

  • plattformübergreifend
  • eventuell für den User unsichtbar
  • einen Desktop simulieren
  • als Service
  • Wahrscheinlich übers Internet funktionieren (Firewalls?)
  • Volle Kontrolle geben
  • in ein bestehendes Projekt eingebunden werden.

Fragen dazu:

  • definiere Plattformübergriefend.
    Wie Plattformübergreifend ist denn die Applikation in die das eingepflegt werden soll?
    Das ist dann der Level, an den es passen muss. Alles andere ist Blödsinn. Windows-OS ist ziemlich wage in der Aussage. Dazu gehört 95, 98, ME, MT4, 2000, XP, 2003, und alle nebst alles Service-Packs. Irgendwo sollte man da Grenzen ziehen....

  • für den User unsichtbar: Heisst das, ich kann mit dem Rechner zur gleichen Zeit arbeiten, während der User das auch tut?
    Dazu müsstest du dann den Desktop nachbauen, da es ansonsten nicht geht.
    Das ist aber zusätzlich zu dem Capturing, wo du was mit dem User zusammen machen kannst (was er sieht).

  • Service:
    Mit welchen Rechten muss das laufen? Zugriff als Admin übers Netz ist immer ein Sicherheitsrisiko!

  • Internet:
    Weiss nicht genau wie das bei Remoting ist, aber ich gehe von einem ziemlichen Overhead aus. Also TCP/IP bzw. UDP. WElche Problem sind mit Netzwerkadmis zu erwarten? Wenn das Ding hinter einem Router hängt und mehr als ein Rechner ist, muss sich der Client an den Server verbinden, weil es ansonsnten nicht durch die NAT geht. Wie soll das geschehen? In diesem Fall muss der Client dch eingreifen, oder ihr müsst einen Client als Zwischenserver konfigurieren der das Management im LAN des Clients übernimmt.
    Welche Verschlüsselung (Sicherheit!), was für ein Datenprotokoll? Gibts da schon eines, oder musst du selbst entwicklen? Wie gross sind die Dateien die übertragen werden sollen?

  • Volle Kontrolle:
    Und unsichtbar. Übers Netz. SEHR übel. Da musst du schon eine hohe Sicherheit einbauen, was natürlich auch heisst das ihr das richtig gegen Eindringlinge testen müsst!! Das wird ne Fleissaufgabe, und ziemlich knifflig.....

  • In ein Projekt einbinden:
    Was für ein Projekt? Eure Entwicklung? Wenn nein, gibt es Sourcen, Doku, Unterstützung?

Zusammengefasst würde ich sagen: VNC ist für den Kunden die billigere Wahl. Weil ich den Entwicklungs und Testaufwand ziemlich hoch ansetze.
Ich gehe mal von einem 2-Mann-Team aus:
Für grobe Planung und Konzeption denke ich 1 Woche.
Verbindung mit Verschlüsselung, Backend, Client und Serverseite zusammen schätze ich bei ca. 3 Wochen.
Den Rest dann noch mal ca. 2 Wochen, mit Oberfläche, Userverwaltung, Schlüsselverwaltung (wie macht ihr das?).
Restarbeiten an der Oberfläche: 2 Wochen.
Optimierung: 4 Wochen.
Ausgiebiges Testen und debuggen auf verschiedenen Rechnern: 2 Wochen.

Macht 12 Wochen, mal den üblichen Faktor 2:
24 Wochen. Das ist einigermassen realistisch. Wobei mir das doch sehr gering vorkommt..... ich denke, eher noch mehr, aber das kann man erst sagen wenn man alle Rahmenbedingungen kennt.

Und dann will der Kunde bestimmt noch Änderungen haben......

20.05.2005 - 09:47 Uhr

Mit der COM Componente "Microsoft Webbrowser" oder so ähnlich.

Findest du in der Hilfe (msdn) unter "Web browsers"

19.05.2005 - 16:26 Uhr

Falls jemand unter windows ce direkt die gdi programmiert (was bei reinem Output wesentlich schneller ist!) sollte man nur \n benutzen. Mit ein \r wird als Zeichen mitberechnet, wenn man sich den TextSize ausgeben will!

http://msdn.microsoft.com/msdnmag/issues/04/12/NETCompactFramework/default.aspx

P.S.: Kann man hier nicht eine Download-Sektion einführen für freie libs bzw. snippets? Jeder hat ja so seine Lieblinge, und eine zentrale Stelle bei der man die lassen kann, wäre schon ziemlich klasse .....

19.05.2005 - 13:25 Uhr

@Quallo:
Oh, dann bin ich fehlinformiert, stimmt, geht tatsächlich.

@svenson:
Seh ich ebenso. Allgemein ist es unsinning Paradigmen "sklavisch" zu verfolgen. Letztendlich hat man immer ein Problem, welches nach einer Lösung verlangt.

Ansonsten kann man "warbar", "elegant", "lesbar" und "performance" niemals unter einen Hut bringen, bzw. den Vorgaben entsprechend hin optimieren. 🙂

@herbivore:
Oh ja, das Beispiel ist wirklich übel! Vor allem diese - ich nenne es mal - "Scherenverschachtelung" ist ein Grund, warum man goto solchen Leuten die z.B. dieses Beispiel geschrieben haben lieber vorenthalten sollte......

19.05.2005 - 12:07 Uhr

Wenn du da Image so lädst wie du es machst, das heisst in einer lokale Variable, und dann direkt der Picturebox zuweisst, ist es beim nächsten Aufruf eines anderen Images sowieso freifliegend.

Ein expliziter Aufruf mit

GC.Collect();

am Ender der Routine reicht da aus.

19.05.2005 - 10:28 Uhr

Da muss ich Dir wiedersprechen.

goto wird sehr oft und gern in zeitkritischen Funktionen benutzt.
Exceptions sind da deutlich(!) zu langsam, und werden an der Stelle nie ein Ersatz dafür sein.

19.05.2005 - 10:25 Uhr
Application.DoEvents();

...in der Schleife...

19.05.2005 - 10:22 Uhr

Die Lösung ist katastrophal!

Warum killst du nicht einfach die Objekte die die Daten halten, und erstellst diese neu, wenn es schon nicht anders geht?

19.05.2005 - 10:20 Uhr

Der Programmierhans hat absolut recht. Fang nicht an mit irgendwelchem globalen oder (in diesem Fall noch schlimmer) statischen publics.

Benutze events und delegates, und halte die Daten in der Klasse die die Controls aufbaut. (oder besser noch, wiederum in einer extra-Klasse.)

19.05.2005 - 10:12 Uhr

http://www.codeproject.com/csharp/csharpsvclesson1.asp

Da findest du auch ansonsten sehr viele gute Tutorials.

19.05.2005 - 09:14 Uhr

Die Implementierung in .NET ähnelt ziemlich der von der MFC.

Tu Dir selbst nen Gefallen, und mach es gleich asynchron, als synchron mit Threads rumzuhampeln. Auch wenns komplizierter aussieht.

19.05.2005 - 09:11 Uhr

Starte den Thread lieber mittels eines speziellen Timers:

ms-help://MS.VSCC.2003/MS.MSDNQTR.2003FEB.1033/cpref/html/frlrfsystemthreadingtimerclasstopic.htm

19.05.2005 - 09:06 Uhr

(Vorweg: Das goto bei C# bezieht sich nur auf switch-cases, um von einem case zum anderen springen zu können. Damit kann man auch eine Art durchfallen simulieren, was es ja nicht mehr gibt. )

Allgemein in C/C++ halte da - ich sag mal - eher begrenzt was von....

goto ist ein Befehl, der Programmierern erst ab einem bestimmten Erfahrungslevel zugänglich gemacht werden sollte. Jemand der noch rumexperimentiert, könnte damit den Sourcecode wirklich verwüsten und absolut unwartbar machen.

Wenn es geht, vermeide ich goto´s grundsätzlich. Nur wenn Performance das entscheidende Kriterium ist, halte ich sie (und andere Mittel) für legitim. Ansonsten sind die meiner Meinung besser zu vermeiden.

Man kann eigentlich alles was mit gotos gelöst wird auch vorher schon so planen, das man diese nicht braucht.
Wenn jemand meint, er kommt ohne gotos nicht mehr aus wenn er ein Programm schreibt, dann sollte er mal drüber nachdenken ob er nicht ein paar grundsätzliche Designfehler begangen hat.

18.05.2005 - 15:16 Uhr

@michbech:
Allgemein ein sehr guter Tipp! Danke 🙂

18.05.2005 - 14:45 Uhr

?( ?( ?(

Bei aller Begeisterung fü C# ....

Java loost nur bei den trigonometrischen Funktionen!

Ansonsten ist Java in 3 der 5 Tests teilweise bedeutend schneller, und einmal gleich schnell.
Und so oft braucht man Sinus eigentlich nicht, wobei da auch noch interessant ist wie genau der Sinus ist! Wird er bei .NET berechnet, angenähert, oder aus einer Tabelle gezogen?
(Nebenbei muss bei der Version 1.4.2 mit der Trigonometrie etwas ziemlich falsch gelaufen sein, was sich wohl bei späteren Versionen ausschliessen sollte.)

Java ist also immer noch schneller. Mal schauen was .NET 2.0 da auf die Reihe bekommt. Ich erwarte dort allerdings schon einen ziemlich Sprung nach vorne.

18.05.2005 - 13:32 Uhr

?(

Das Programm muss garnicht kommentiert sein. Es muss schlicht funktionieren 😉
Das eingeschickte war letztes Jahr (wie gesagt) ein Pseudocode. Also hatte rein garnichts mit irgendeiner Sprache zu tun, und die Aufgabe war möglichst effektiven Code zu erstellen.
(Es hatte natürlich auch keinerlei Oberfläche! -- Unsere Tools logischerweise schon, aber wie gesagt, die gehörten nicht zur bewerteten Lösung!)

Einige hatten dazu Wrapper erstellt, die aus realem Code den Pseudocode erstellten, andere hatten selbst einen Zwischencode "erfunden" der diesen Pseudocode liefert, wir hatten lediglich einen Editor geschrieben, mit dem wir den Code modular aufbauen konnten, und welcher dann den wirklichen Code zusammensetzte.
(Und eine Testbench nebst Simulator.)

Die genauso Aufgabenstellung des letzten Jahres sah so aus:
http://www.cis.upenn.edu/proj/plclub/contest/ants.pdf
(Mehr gabs auch nicht!!)

Das Ergebnis welches eingeschickt wurde sah ungefähr so aus:


turn left 1 ; antxy
turn left 2
turn left 3
sense ahead 4 13 friend
sense ahead 28 5 marker 0
sense ahead 43 6 marker 0
sense ahead 58 7 marker 0
sense ahead 73 8 marker 0
sense ahead 88 9 marker 0
sense ahead 103 10 marker 0
sense ahead 116 11 marker 0
sense ahead 127 12 marker 0
sense ahead 136 160 marker 0
mark 0 14 ; ant0y
unmark 0 15
turn right 16
turn right 17
sense ahead 18 140 friend
sense ahead 187 19 marker 0
sense ahead 185 20 marker 0
sense ahead 183 21 marker 0
sense ahead 181 22 marker 0
sense ahead 178 23 marker 0
turn left 24
sense ahead 176 25 marker 0
sense ahead 174 26 marker 0
sense ahead 172 27 marker 0
sense ahead 171 170 marker 0
mark 0 29 ; ant1y

18.05.2005 - 12:43 Uhr

Hallo,

Für diejenigen, die den Termin noch nicht mitbekommen haben:
http://icfpc.plt-scheme.org/

Falls das jemand nicht kennt, mal in Kürze wie das abläuft:
Die Aufgabe steht am Freitagabend um 18.00 zum download bereit. 72h später, am Montag abend um 18.00 muss das Ergebnis per EMail eingeschickt worden sein.
Vorher ist rein garnichts über die Aufgabe bekannt.

  • Welche Programmiersprache genutzt wird, ist vollkommen egal.
  • Wie viele in einer Gruppe sind, ist ebenfalls egal.
  • Ob du einen alten PC oder einen Uni-Cluster zur Verfügung hast, ist ebenfalls egal.
  • Welches OS sowieso.
  • Tools die du zum debuggen, Code generieren, etc. brauchst, musst du schon selbst schreiben. Während der Zeit, klar 😉
  • Zu gewinnen gibts (fast) nichts. Der Hauptpreis waren letztes Jahr 1000 Dollar, und "unlimited bragging rights" 🙂

Das bleibt alles Dir/Euch überlassen, das Ergebnis war zumindest letztesjahr ein Textfile, welches eine Statemashine in Pseudocode darstellte.

Ich habe letztes Jahr mit einem Freund und Kollegen das erstemal teilgenommen.
http://www.cis.upenn.edu/proj/plclub/contest/index.php

Vorbereitung waren Pizzen, Nudeln, Fluppen, Kaffee(!) und 3 Kästen Bier. In C# waren wir noch relativ unerfahren, habens aber trotzdem benutzt.
Die Aufgabe letztes Jahr war ein Ameisengehirn zu programmieren. Klingt abgefahren, war es auch. Vor allem weil es nachher wirklich gut funktionierte 😉
Wir haben mit unseren zwei Lösungen die Plätze 23 und 30 von 360 Einsendungen belegt, trotz eines groben Designschnitzers. Sonst wäre es wohl noch besser gelaufen.
Es hat einen Riesenspass gemacht, war perfekt organisiert und vorbereitet, und dieses Jahr werden wir wieder teilnehmen.

Ich kann das nur empfehlen! Es macht Spass, und fordert einen mal so richtig! 🙂

Vielleicht nehmen ja noch mehr aus dem Forum teil. 🙂

Gruss,
Kai

18.05.2005 - 12:10 Uhr

Lesbarkeit ist relativ 😉

Ich habe früher auch vehement die return-am-ende Methode vertreten, und das Ergebnis war in der Zeit als ich den Code geschrieben habe sehr leserlich.
Als ich dann allerdings 2 Jahre später nochmal reinschauen musste, und verschiedene Bedingungen, bools, etc untergekommen sind, die teilweise absurd lang wurden und absolut unleserlich waren, bin ich langsam zur Besinnung gekommen.

Ich stimme herbivore zu: Wird eine Bedingung mit einem return gleich am Anfang abgesetzt, dann brauche ich mich darum später nicht mehr zu kümmern. Der Drops ist gelutscht. Und es ist Performant!
Nebenbei ist der Code wesentlich kürzer, und damit auch einfacher zu verstehen.

Nebenbei ist das nicht mal das schlimmste, was man machen kann. 😉
Ich gebe mal folgendes, damit pulpaplex mich in der Luft zerreissen kann 😉)))


do {
   if(komplexeBedingung1) {
      blablabla;
      break;
   }
   if(komplexeBedingung1) {
      blablabla;
      break;
   }
   if(komplexeBedingung1) {
      blablabla;
      break;
   }
   if(komplexeBedingung1) {
      blablabla;
      break;
   }
   if(komplexeBedingung1) {
      blablabla;
      break;
   }
} while(false);

(switch-case statt der if´s war nicht möglich, manchmal waren die ifs noch 1-2 Stufen tiefer gestaffelt, so dass if-else nicht möglich war, oder extrem unleserlich wurde.

Macht man nicht? Ihgitt? Pfui?!

OK, mach mal mit den Worten dem Kunden klar warum du es nicht machst, wenn durch so ein Kontrukt eine bestimmte, entscheidende Routine 2-3mal schneller wird.... 😉

Es ist alles erlaubt, was funktioniert. Wenn es an der Stelle Sinn macht.
Schau Dir mal Linux-Kernel-Code an, und zähle die goto´s. Ich bekomme dabei zwar auch heftige Bauchschmerzen, aber es bringt halt Performance.... schulterzuck

17.05.2005 - 16:37 Uhr

Nur mal so ne Frage am Rande.... warum willst du das zwingend in einer RichTextBox darstellen?

Wenn du sowieso schon den Text der Accorde malst, dann kannst du den Rest-Text auch gleich malen. Und dann brauchst du auch keine RichTextBox mehr.

Dann kannst du genausogut auf nem Panel oder direkt auf der Form malen. Ist eigentlich genau das selbe, nur das die (in diesem Falle wohl mehr störende als helfende) RTF-Box nicht mehr dabei ist.

---edit---

Sehe grade, das du auch editieren willst.... das geht eigentlich auch genauso, nur das du (wenn das Panel den Focus hat) die Tastatur abfragst, und einfach an der Stelle einfügst, an der jetzt editiert wird.
Wo das ist kannst du leicht herausbekommen, da du ja selbst weisst du do hingemalt hast. 😉 Und nen blinkenden Cursor zu malen, sollte da auch nicht mehr das Problem sein.

Bevor du Dir die Finger brichst um ein RTF dazu zu bringen was zu machen was es vielleicht kann, aber nicht dafür gemacht ist, kannst du es besser komplett selbst machen.....

17.05.2005 - 07:41 Uhr

@norman:
Bei asyncron klappt das, bei synchronen eben nicht.

16.05.2005 - 14:49 Uhr

Das Polling des Sockets ist eh unsicher wie nur was. Es hilft hier auch nicht. Es hilft auch nicht der anderen Seite mitzuteilen, die Verbindung doch bitte zu beenden, und dann darauf zu warten das der Socket ungültig ist.

Asynchron über Sockets ist schon der richtige Weg, vor allem wenn man einen Server bereitstellt auf den mehrere Clients connecten.

Um die try-catch wegen der Exception kommst du nicht umzu. Vor allem wenn die andere Seite "zumacht" wirst du das über eine Socket-Exception mitgeteilt bekommen. Poll und der ganze restliche Rotz funktioniert hier definitiv nicht.

Die einzige Möglichkeit festzustellen ob die andere Seite zumacht ist die Exception abzufangen die bei einem Leseversucht auftritt, und dann den Socket zu killen.
Und an der selben Stelle machst du halt ebenso, wenn der Thread geschlossen wird. Gar kein Problem.
Eine abgefangene Exception ist (wenn sie richtig behandelt und entsprechend eingesetzt wird) nicht viel schlimmer als ein "false".

Mach Dir keinen Kopp drum, das ist so schon in Ordnung und absolut legitim. Das war schon bei der MFC nicht viel anders. 🙂

11.05.2005 - 15:39 Uhr

Im Prinzip: Ja.
Im Allgemeinen wirst du aber hier und da auf Standart C++ DLLs angewiesen sein, weil eben auch das p/Invoke beschnitten ist....

Aber es lässt sich damit leben. ZUmindest wesentlich besser als mit den Alternativen!

11.05.2005 - 08:19 Uhr

Ich habe beides gemacht, und bin jetzt immer noch gezwungen dazu, weil das CF-Framework eben nicht alles was es auf dem Desktop gibt, auch für Mobile implementiert hat. Ist irgendwo auch logisch, das es da einen Light-Version mit weniger Ballast gibt. Allerdings hat nun jeder andere Vorlieben und Bedürfnisse 😉
Wegen mir könnte alles was DB ist komplett raus, und dafür mehr Systemsachen rein. Jemand anderes braucht das vielleicht unbedingt.

Und ob das nun lohnt oder nicht, kann man nicht sagen. Es gibt einen Markt, und damit auch benötigte Software. 😉

Ich habe mich selbst private für PPC statt Palm entschieden, da ich mit .NET den Pocket doch relaitiv einfach programmieren kann. (TextReader) Probiere mal PalmOS .......