Laden...

Forenbeiträge von Corpsegrinder Ingesamt 401 Beiträge

04.08.2010 - 19:50 Uhr

Wo würdest du denn eine Liste in einer normalen Klasse instanziieren? Genau das gibt es auch für statische Klassen 😉. Den Rest solltest du selber herausfinden können.

04.08.2010 - 14:36 Uhr

Hi,

zweite Möglichkeit wäre eine Factory.

03.08.2010 - 18:31 Uhr

Hi,

x86 wird definitiv unterstützt, sonst würde es ja auch nicht auf normalen Rechnern laufen 😉. Was genau läuft denn schief? Kannst du es denn für die Plattform kompilieren?

edit: Auf der Homepage steht auch: "Cross-platform: Unix (Linux and Mac OS X), OS/2, and Windows (Win32 and WinCE) are supported out of the box. Easy to port to other systems."

01.08.2010 - 04:04 Uhr

@Siassei:

Ich glaube Du hast Tail-Recursion nicht ganz verstanden. Du machst da einen Fehler, der häufig gemacht wird. Der Ausdruck "return Rek(i-1) + i;" is äquivalent zu "return i + Rek(i-1)". Der letzte Aufruf ist in beiden Fällen die Addition. Daher muss auch in beiden Fällen ein Stack aufgebaut werden, damit diese Addition erfolgreich durchgeführt werden kann. Eine Tail-Recursion darf aber als letzte Anweisung nur den Rekursionsaufruf haben. Also nur "return Rek(i-1)" und da wir trotzdem das Ergebnis berechnet haben wollen, mussen wir es als Parameter mitschleifen. Also die neue Methode mit der Signatur Rek(int, int). Im Normalfall würde man natürlich um eine Manipulation zu verhindern eine Helpermethode schreiben, auf die der Anwender keinen Zugriff hat, also in Falle von C# eine private Methode, im Falle von Scala würde man diesen Helper natürlich innerhalb der eigentlichen Funktion deklarieren.

edit:

Probier einfach mal folgenden Code aus, dann siehst du anhand des Stack Trace, dass die erste Variante keineswegs Tail-Recursive ist:


object Main {

  def main(args: Array[String]) {
    try {
      rec(4)
    } catch {
      case e: Exception => println(e.getStackTraceString)
    }

    try {
      tailrec(4)
    } catch {
      case e: Exception => println(e.getStackTraceString)
    }
  }
  
  def rec(i: Int): Int = if(i <= 0) throw new Exception("Bumm") else rec(i-1) + i;

  def tailrec(i: Int) = {
    def helper(i: Int,j: Int): Int = if(i<=0) throw new Exception("Bumm") else helper(i-1, j+i)
    helper(i,0)
  }
}

edit 2:

Btw. kann man auf mit der @tailrec Annotation testen, ob eine Methode Tail-Recursive ist. 😉

01.08.2010 - 01:49 Uhr

Leider unterstützt die CLR soweit ich weiss nur auf x64 Tail Call Optimization, ansonsten hätte man damit einen Overflow vollkommen ausschließen können

Was meinst du damit ???

Hi,

damit Du dir nicht den ganzen Kram aus dem Link durchlesen musst erkläre ich es hier noch einmal kurz.

Jede Rekursion kann in eine äquivalente Tail-Recursive Variante umgeschrieben werden. Das heisst, dass der letzte Ausdruck in der Funktion der Rekursionsaufruf ist.

Bsp:


int Rek(int i) {
  if(i <= 0) {
    return 0;
  }
  return Rek(i-1) + i; //der letzte Auruf in diesem Ausdruck ist die Addition
}

int Rek(int i, int j = 0) {
  if(i <= 0) {
    return i;
  }
  return Rek(i-1, j+i); //der letzte Aufruf ist die Rekursion
}

Im zweiten Fall kann der (JIT-)Compiler optimieren, da nichts auf dem Stack gehalten werden muss. Es werden hier nur die Werte der Parameter geändert und an den Anfang der Methode gesprungen. Somit wird kein Stack aufgebaut und es kann nicht zu einem Overflow kommen.

30.07.2010 - 19:13 Uhr

Versuch doch einfach die Punkte genau dann zusammenzufassen, wenn viele Aufeinanderfolgende einen ähnlichen Wert haben, dann verhinderst du die grobe Verfälschung, sondern hast nur noch eine minimale Abweichung des urspünglichen Graphen.

29.07.2010 - 11:40 Uhr

Hi,

meine Erfahrung ist, dass rekursive Methoden in den meisten Fällen einfacher zu lesen und zu schreiben sind. Klar kann es etwas Einarbeitungszeit benötigen, wenn man lange Zeit nur iterativ gearbeitet hat. Wichtig ist, dass du darauf achtest, dass der Stack nicht zu sehr anwächst, wie bereits von MarsStein erwähnt. Leider unterstützt die CLR soweit ich weiss nur auf x64 Tail Call Optimization, ansonsten hätte man damit einen Overflow vollkommen ausschließen können. Aber es ist trotzdem wissenswert, da es in anderen Sprachen/Systemen unterstützt wird und hoffentlich mit Hilfe von F# auch bald in die x86 CLR kommt.

27.07.2010 - 20:11 Uhr

Spiele auch bereits seit der Beta und konnte gestern abend/nacht endlich installieren! Bin asolut begeistert von dem Spiel. Spiele momentan hauptsächlich Terraner.

24.07.2010 - 12:15 Uhr

So, habe mir gerade eine hübsche Aufgabe überlegt.


Erstelle ein Banktransktionssystem, welches die Möglichkeit bietet Beträge von KontoA zu KontoB zu transferieren und die jeweiligen Kontostände abzufragen. Das ganze soll Threadsafe, aber OHNE Locking oder Synchronisation in dem Transaktionssystem erstellt werden. Es dürfen aber andere Strukturen benutzt werden, die schon Threadsafe sind (Listen, Queues...). Die Aufgabe ist nicht auf C# beschränkt, allerdings sollten keine Sprachen/Systeme benutzt werden, die STM bieten, wie z.B. Clojure oder Frameworks wie z.B. Akka für Scala.

Viel Spaß 😉

24.07.2010 - 10:20 Uhr

Ah, okay... da ich momentan fast nur noch funktional programmiere und da natürlich keine Iteratoren, geschweigedenn Schleifen verwende, bin ich garnicht auf die Idee gekommen es so zu lösen 😉

Eine neue Aufgabe muss ich mir noch überlegen, werde aber so schnell wie möglich eine stellen.

24.07.2010 - 00:42 Uhr

Hi,

so, hier die angepasste Lösung (etwas schöner, aber die Methode für die Matrix gefällt mir immernoch nicht, geht sicher schöner, aber das ist ja hier nicht gefragt, sondern die Lösung für das allgemeine Problem 😉 ):


public static void Main (string[] args)
		{
			
			var matrix = new List<List<double>> {
                new List<double> { 1.0, 1.1, 1.2, 1.3 },
                new List<double> { 2.0, 2.1, 2.2, 2.3 },
                new List<double> { 3.0, 3.1, 3.2, 3.3 },
                new List<double> { 4.0, 4.1, 4.2, 4.3 }
            };

            var sentence = "Dies ist ein Beispielsatz";

            var iter = matrix.MachWas((List<List<double>> l ) => {
				IList<double> tmp = new List<double>();
				for(int i = 0; i < l[0].Count; i++) {
					for(int j = 0; j < l.Count; j++) {
						tmp.Add(l[j][i]);
					}
				}
				return tmp;	});
			
			
			
            var iter2 = sentence.MachWas((string s) => { return s.Split(' '); });

            foreach( var item in iter ) {
                Console.WriteLine( item );
            }

            Console.WriteLine("\n");

            foreach( var item in iter2 ) {
                Console.WriteLine( item );
            }
		}
		
		public static TReturn MachWas<TReturn, T>(this T obj, Func<T, TReturn> f) {
			return f(obj);
		}

23.07.2010 - 22:57 Uhr

Hi,

hier mal meine Lösung... es geht sicher schöner, vor allem die matrixFunc, aber ich hab so lange kein C# mehr gemacht, dass ich gerade nur eine funktionierende Lösung haben wollte 😉


public static void Main (string[] args)
		{
			
			var matrix = new List<List<double>> {
                new List<double> { 1.0, 1.1, 1.2, 1.3 },
                new List<double> { 2.0, 2.1, 2.2, 2.3 },
                new List<double> { 3.0, 3.1, 3.2, 3.3 },
                new List<double> { 4.0, 4.1, 4.2, 4.3 }
            };

            var sentence = "Dies ist ein Beispielsatz";

            var iter = matrix.MachWas(matrixFunc);

            var iter2 = sentence.MachWas(stringFunc);

            foreach( var item in iter ) {
                Console.WriteLine( item );
            }

            Console.WriteLine("\n");

            foreach( var item in iter2 ) {
                Console.WriteLine( item );
            }
		}
		
		public static IList<String> matrixFunc(IEnumerable list) {
			if(!(list is List<List<double>>)) {
				throw new ArgumentException("Expected List<List<double>>.");
			}
			List<List<double>> l = (List<List<double>>)list;
			IList<String> tmp = new List<String>();
			for(int i = 0; i < l[0].Count; i++) {
				for(int j = 0; j < l.Count; j++) {
					tmp.Add(l[j][i].ToString(CultureInfo.CreateSpecificCulture("de-DE")));
				}
			}
			
			return tmp;
		}
		
		public static IList<String> stringFunc(IEnumerable str) {
			if(!(str is String)) {
				throw new ArgumentException("Expected string");
			}	
			return ((String)str).Split(' ');
		}
		
		public static IList<String> MachWas(this IEnumerable obj, Func<IEnumerable, IList<String>> f) {
			return f(obj);
		}

19.07.2010 - 15:01 Uhr

ich wollte auch nicht sagen, dass es die beste ist, sindern eine einfache, in der man keine parent verbindung braucht. außerdem hieß es ähnlich einer treenode weshalb ich mich noch einmal erkundigen wollte.

18.07.2010 - 18:03 Uhr

Hi,

wenn es sich um einen ungerichteten Graphen handelt, dann sollte doch eh jeder Knoten alle seine Kanten kennen, oder? Dann kannst du das doch ganz einfach mit Backtracking lösen. Ich kenne zwar die Struktur deines Graphen nicht, aber in einem ungerichteten Graphen gibt es ja keine Parents und Children, sondern eben nur Knoten und Kanten.

10.07.2010 - 23:37 Uhr

Okay, es war doch nicht die Lib, wenn ich ein Sleep in die While mache, ist die CPU immer auf 0. Kann mir jemand erklären wieso?

Ja, wenn du nicht wartest, dann wird durchgehend neu gezeichnet. Es reicht bei weitem, wenn du 60 mal pro Sekunde zeichnest. Benutze dafür am besten einen Timer.

Gruß

Dario

10.07.2010 - 11:28 Uhr

Leite den Port doch mal strikt auf die IP deines Rechners im Netzwerk weiter. Hast du dir das ganze schonmal mit Wireshark angeschaut?

08.07.2010 - 16:41 Uhr

Starte einen Thread, der in einer Schleife nur auf Nachrichten wartet.

edit: Oder nutze die Asynchrone Methode BeginReceive

03.07.2010 - 19:38 Uhr

Gerne 😉

03.07.2010 - 19:03 Uhr

Die Close musst du natürlich aus einem anderen Thread aufrufen. Mal angenommen du hast einen Button "Disconnect" und der hat einen zugewiesenen ClickHandler. Dann rufst du in diesem Handler Socket.Close auf. Natürlich musst du dafür eine Referenz auf den Socket, bzw. auf das Objekt, welches den Socket beinhaltet, haben.

03.07.2010 - 18:06 Uhr

Ruf Socket.Close auf, dann beendet Receive mit einer ObjectDisposedException und danach kannst du den Thread einfach auslaufen lassen.

edit:

Sorry, hatte das WebClient überlesen. Laut MSDN hat WebClient keine Receive Methode und die Transportschicht von HTTP ist außerdem TCP, nicht UDP. Erkläre bitte nochmal genauer, was du da machst. Evtl. auch mit Code.

03.07.2010 - 14:48 Uhr

Thread.Sleep sollte man generell vermeiden, da der Thread dann komplett brach liegt, wo er doch in der Zeit andere Aufgaben übernehmen könnte (z.B. das Neuzeichnen der GUI 😉 ). Also wie herbivore schon sagte, benutz am besten einen Timer.

01.07.2010 - 18:11 Uhr

Ich weiss wovon er gesprochen hat.){gray}

Sorry für OT, aber was hat Knuth mit Minix zu tun?

23.06.2010 - 21:27 Uhr

Hi,

kannst du ihn denn mit dem Tool aus dem Standby holen, oder geht das auch nicht? Ansonsten überprüf doch nochmal, ob die eingetragene MAC-Adresse richtig ist. Und ansonsten frag einfach mal bei dem Hersteller des Boards nach.

23.06.2010 - 15:40 Uhr

Belkin iPhone/iPod Audio-/Video-Kabel (AV-Kabel)
Multimedia / Fun: Belkin iPhone/iPod Audio-/Video-Kabel (AV-Kabel)
kompatibel mit:

* iPhone  
* iPhone 3G  
* iPod touch 1G/2G  
* iPod nano 3G/4G  
* iPod Classic 80 GB/160 GB  
* iPod Classic 120 GB  

Achtung: Dieses Produkt ist NICHT kompatibel mit iPhone 3GS!
Ja schön, das funktoniert offensichtlich so gut wie die 10€ Dinger aus China...

Tja, wenn man einfach irgendwelche Texte von Händlerseiten kopiert, die nichts mit dem Hersteller zu tun haben... Offensichtlich handelt es sich bei dem angebotenen Kabel um eine alte oder andere Version. Lies hier mal den obersten Kommentar: http://www.amazon.de/dp/B001IL7P62/ref=asc_df_B001IL7P62692240?smid=A3JWKAKR8XB7XF&tag=billigerde-21&linkCode=asn&creative=7994&creativeASIN=B001IL7P62

😉

@ JAck30lena:

Die Bild App wurde wegen pornografischer Inhalte abgelehnt, welche von Apple offiziell verboten sind. Das wusste die Bild und hat es ignoriert. Klar werden auch manchmal Apps abgelehnt, die prinzipiell okay sind, aber die Leute, die die Apps kontrollieren sind auch nur Menschen und machen Fehler. Schon häufig genug wurden entsprechende Apps nachträglich zugelassen.

21.06.2010 - 20:51 Uhr

Nein das ist kein Quatsch. TV-Out mit dem IPhone/IPad/IPod etc. geht nur mit dem originalen Apple AV Kabel. Sämtliche Zubehörkabel funktionieren nicht. Apple hat da so ne Art DRM-Chip drin.

http://www.belkin.com/IWCatProductPage.process?Product_Id=489777

Da haste eins.

21.06.2010 - 20:44 Uhr

@herbivore

Naja... mal angenommen wir haben eine Queue und die Queue hat eine Maximale Größe und mal angenommen wir haben einen Wert, der auf true gesetzt wird, wenn die Queue voll ist. In diesem Fall würde es hier schief gehen, weil der Thread 1 die Queue voll macht, aber bevor er die Variable setzen kann fragt Thread 2, ob die Queue voll ist und bekommt ein false. Oder meinetwegen bekommen die Threads Indizes. Genau das Gleiche. Vielleicht sind Konsolenausgaben nicht der richtige Weg um das zu zeigen, aber diese Threadwechsel sind doch das Problem.

21.06.2010 - 09:51 Uhr

Hallo herbivore,

das stimmt natürlich. Das Ganze ändert sich aber, wenn man mit Properties arbeitet. Ich muss wohl beim ersten Durchlesen übersehen haben, dass der Threadersteller bereits erwähnte, dass es sich um Felder handelt. Jedoch finde ich es wichtig zu erwähnen, das auch bei primitiven Typen eben in manchen Fällen auch ein volatile nicht reicht. Hierzu noch ein Beispielcode:


namespace ConsoleApplication1 {
  using System;
  using System.Threading;

  internal class Program {
    private static void Main(string[] args) {
      var test = new TestFoo();
      var rnd = new Random(DateTime.Now.Millisecond);
      var t1 = new Thread(() => {
                            while (true) {
                              test.Foo = Convert.ToBoolean(rnd.Next(2));
                              Console.WriteLine("Thread 1: {0}", test.Foo);
                            }
                          });
      var t2 = new Thread(() => {
                            while (true) {
                              test.Foo = Convert.ToBoolean(rnd.Next(2));
                              Console.WriteLine("Thread 2: {0}", test.Foo);
                            }
                          });
      t1.Start();
      t2.Start();
      t1.Join();
      t2.Join();
    }

    #region Nested type: TestFoo

    private class TestFoo {
      private volatile bool foo;

      public bool Foo {
        get { return foo; }
        set {
          Console.WriteLine("Setting foo to {0}.", value);
          foo = value;
        }
      }
    }

    #endregion
  }
}

Früher oder später wird hier folgende Zeile erscheinen:

Setting foo to true.
Thread 1: true
Thread 2: false

20.06.2010 - 16:48 Uhr

Locks sollten aber beim Zugriff von mehreren Threads auf mutable Felder immer gesetzt werden, da es sonst zu Race-Conditions kommt.

18.06.2010 - 22:17 Uhr

Nein, ich mein die AV-Kabel, das hat weder mit den Kopfhörer noch mit den Ladekabeln zu tun.
😉

Also das ist ja echt Quatsch. Es gibt von 1000 Anbietern Billigkabel für Appleprodukte. Von Ladekabeln über Displayadapter bis hin zu Akkus... Btw. Mini Displayport ist ein offener Standard und somit für jeden Verfügbar 😉

18.06.2010 - 08:48 Uhr

Btw. werden 95% der Apps die abgelehnt werden auf Grund mangelnder oder ganz fehlender Lauffähigkeit abgelehnt.
Was du aus der transparenten und offenen App-Bewertung weist? 😉){gray}

Ja, falls du es nicht weisst wird inzwischen jedem Entwickler der Grund für die Nichtveröffentlichung genannt.

17.06.2010 - 09:47 Uhr

Hi,

iOS 4 kann auch Multitasking und das ganze sogar OHNE die Akkulaufzeit einzuschränken. Ich habe selber ein iPhone 3GS und werde mit demnächst auch ein iPhone 4 kaufen. Das Entwickeln für's iPhone ist einfach super. Das SDK in Verbindung mit Objective-C ist traumhaft und da die Apps nativ auf dem Gerät laufen zeigt es eine deutlich höhere Leistung als Android, wo die Apps auf einer angepassten JVM laufen, die auch noch dem Stand der Technik absolut hinterher ist.

Beispiel: Eine in Java geschriebene Android App wird zur Compilezeit einem Typechecking unterzogen. Soweit alles gut. Die VM führt aber zur Laufzeit nochmal ein Typechecking durch. Macht prinzipiell keinen Sinn, verhindert das Ausführen dynamisch typisierter Sprachen auf der VM und verlangsamt die Ausführung nochmals.

Eine in Objective-C geschriebene App kann zur Compilezeit einem strikten Typechecking unterzogen werden, wo es jedoch sinnvoll ist, kann auch dynamische Typisierung angewandt werden, da Objective-C duck-typing verwendet und Nachrichten verschickt, statt Methoden aufzurufen. So hat man die Vorteile von beidem in einer zu Maschinencode kompilierten Sprache.

Meine Erfahrung zeigt auch, dass der Akku länger hält, als der der meisten Android Phones. Ich komme immer 2 Tage mit meinem Akku hin, obwohl ich wirklich viel mit dem Telefon mache (vor allem mobil surfen). Wenn ich wenig mache sind es auch mal 4 Tage. Außerdem ist das Display wesentlich besser als die der Konkurrenten. Nicht zwingend von der Auflösung(das kommt mit dem iPhone 4 😉 ) sondern einfach von der Darstellung und vor allem vom Touch. Das iPhone ist sehr responsive und der Touchscreen ist wirklich genau. Die Einschränkungen stören mich nicht. Habe bisher keine App, die ich haben wollte, im Store vermisst. Und viele der wirklich guten Apps sind kostenlos oder sehr günstig. Btw. werden 95% der Apps die abgelehnt werden auf Grund mangelnder oder ganz fehlender Lauffähigkeit abgelehnt.

15.06.2010 - 15:21 Uhr

Hi,

ich kann Dir nur http://www.mactrade.de/ empfehlen. Da sind die MacBook Pros nochmal billiger mit EDU Rabatt, als bei Apple und du bekommst ziemlich günstig Apple Care dazu, was ich Dir auch empfehlen würde.

Gruß

Dario

13.06.2010 - 21:31 Uhr

Ich habe bisher nicht bewusst nach den CCD-Regeln entwickelt, aber schon immer auf die Qualität des Codes Wert gelegt. Ich würde mich aktuell auf dem Roten Grad sehen, werde aber jetzt mal anfangen, das genau zu verfolgen.

12.06.2010 - 12:50 Uhr

Also die Frage ist immer, was man unter "Programmieren lernen" versteht. Die Syntax liest man sich in ein paar Tagen an und fidnet vieles durch ausprobieren raus. Die Library lernt man im täglichen Gebrauch kennen. Aber die Techniken, Patterns etc. die muss man sich scho gezielt selber beibringen. Sei es nun durch Bücher, Internet oder Studium. Natürlich verwendet man einige Patterns instinktiv, ohen zu wissen, dass man es tut, aber man sollte sich imho schon mit dem Thema auseinandersetzen. Und ganz wichtig ist es, sich mit Softwareengineering und Algorithmen und Datenstrukturen vertraut zu machen. Es nützt einem nichts, wenn man eine Sprache/Library/Framework in und auswendig kennt, aber das Programm am Ende entweder grottenlangsam, oder nicht wartbar ist. Also wie man sieht ist "Programmieren lernen" nicht einfach zu definieren.

10.06.2010 - 00:20 Uhr

Hi,

wieso nicht einfach einen StringBuilder nehmen? Der kann ja immer gelöscht und neu gesetzt werden. Könnte z.B. folgendermaßen aussehen:


var sb = new StringBuilder();
sb.Append("Ein String");
var sb2 = sb;
Console.WriteLine(sb2); // => Ein String
sb.Remove(0, sb.Length);
sb.Append("Ein anderer String.");
Console.WriteLine(sb2); // => Ein anderer String

Ist denke ich einfacher, als sich irgendwas hinzufrickeln 😉

04.06.2010 - 19:27 Uhr

Hi, klar werden in der Praxis auch UML-Diagramme erstellt und Spezifikationen geschrieben. Große Projekte wären ohne so etwas kaum möglich und zum scheitern verurteilt. In diesem Zusammenhang seien auch noch ADTs erwähnt. http://de.wikipedia.org/wiki/Abstrakter_Datentyp

Sowas sollte man auf jedenfall können. Die Vorgehensweise, die du hier beschrieben hast kenne ich zwar nicht, aber ich denke herbivore hat da schon einen guten Begriff genannt.

02.06.2010 - 23:27 Uhr

Die Frage ist natürlich immer, was man machen will. Mit funktionaler Programmierung lassen sich Multicore-Systeme wesentlich effizienter nutzen, da das ewige Locken von Variablen und die damit verbundene Synchronisation vollkommen wegfallen, da es nur immutable Datenstrukturen gibt. Wenn man aber nicht ganz auf Objektorientierung verzichten möchte gibt es auch Hybriden wie z.B. Scala (die .Net Implementation soll leider nicht sehr gut sein), welche sowohl funktionale, als auch objektorienterte Konzepte bieten. Aktuell finde ich auch Clojure (ein LISP Dialekt) sehr interessant. Aber wie auch immer. Wer in Zukunft Applikationen schreiben will, die alles aus dem Rechner holen, der muss sich früher oder später mit funktionaler Programmierung auseinandersetzen.

30.05.2010 - 15:49 Uhr

Host Europe hat aber extrem gute Bandbreiten. Up weiss ich gerade nicht aus dem Kopf, aber down liegt bei ca. 300 MBits/s. Wenn man allerdings Windows Server 2008 braucht muss man sich wohl woanders umsehen.

10.05.2010 - 11:47 Uhr

Alles klar herbivore, funktioniert super. Dann stell mal die nächste Aufgabe 😉

10.05.2010 - 10:18 Uhr

Okay, da wir hier gerade so schön bei funktionaler Programmierung sind ist meine Aufgabe auch in diesem Bereich angesiedelt.

Es soll eine Erweiterung für die Klasse List<T> geschrieben werden, welche eine Methode FoldLeft bereitstellt. FoldLeft bekommt einen Anfangswert vom Typen T und eine Funktion übergeben. Die übergebene Funktion wird für jedes Element der Liste mit dem Ergebnis des vorherigen Aufrufs und dem aktuellen Element aufgerufen. Der erste Aufruf geschieht mit dem Anfangswert und dem Element, da dort ja noch kein Ergebnis vorhanden ist 😉

09.05.2010 - 23:10 Uhr

Okay, ich wäre nie auf die Idee gekommen, dass C# currying kann 😉

Hier mal die Lösung:


 private static void Main(string[] args)
        {
            Func<int, int, int, int, int> Add = (a, b, c, d) => a + b + c + d;
            Console.WriteLine(Add(1,2,3,4));
            var tmp = Add.SomethingNice()(1)(2);
            Console.WriteLine(tmp(3)(4));
        }

        public static Func<T1, Func<T2, Func<T3, Func<T4, T5>>>>
            SomethingNice<T1,T2,T3,T4,T5> (this Func<T1,T2,T3,T4,T5> f)
        {
            return a => b => c => d => f(a, b, c, d);
        }

09.05.2010 - 22:07 Uhr

Ich gehe zwar davon aus, dass du eigentlich eine Lösung in F# haben wolltest, da es aber ja auch Scala für die .Net Plattform gibt hab ich es mal in Scala gemacht:


object Main {

  /**
   * @param args the command line arguments
   */
  def main(args: Array[String]): Unit = {
    println(Add(1,2,3,4))
    val add5 = Add.somethingNice(2)(3) _
    println(add5(2)(3))
  }

}

object Add {
  def apply(a: Int, b: Int, c: Int, d: Int) = somethingNice(a)(b)(c)(d)
  def somethingNice(a: Int)(b: Int)(c: Int)(d: Int) = a + b + c + d
}

06.05.2010 - 21:09 Uhr

Naja... schonmal versucht in dein Notebook mehrere Festplatten einzubauen? Das mit dem Display ist auch nicht wirklich überzeugend. Gibt ja inzwischen schon viele All-in-one Rechner. Natürlich ist Mobilität ein Thema, aber ich kaufe mir ehrlich lieber 2-3 verschiedene Geräte, als auf einen Desktop-Rechner zu verzichten.

05.05.2010 - 22:11 Uhr

Du musst doch nicht unbedingt nach der GUID suchen. Du kannst ja auch einfach nach dem Projektnamen suchen, oder verstehe ich dich jetzt falsch? Mach den Projektnamen einfach auch Unique und dann gibt es keine Probleme.

03.05.2010 - 22:36 Uhr

Also ein aktuelles Thema ist sicherlich Parallelisierung. Vielleicht auch in Verbindung mit einer Cloud. Nur mal so als Gedanke.

01.05.2010 - 22:11 Uhr

Die Sprache soll einfach und verstaendlich sein, weil Leute, die nur wenig Programmierkenntnisse besitzen, sie moeglichst schnell verstehen sollen. Ich weiss, ich weiss, Aus unserer Sicht ist C# natuerlich auch einfach und verstaendlich...:D 😄

Vorsicht, je einfacher die Sprache sein soll, die du entwickelst, desto schwieriger wird es sie zu entwickeln.

Achja... zu ANTLR... laut meinem Prof. kommt das sehr schnell an seine Grenzen, von daher vielleicht nicht so zu empfehlen. Ich weiss nicht, ob es gute Parser-/Compiler-Generatoren für .Net gibt, aber für Java gibt es JFlex. Den benutzen wir in der FH und ich kann den empfehlen, wenn man mit Java zurechtkommt.^^

01.05.2010 - 16:06 Uhr

Hi,

es wollen natürlich nicht alle ihre Programme/Sprachen auf der .Net Plattform laufen lassen. Alleine das ist schon ein Grund eigene Compiler zu entwerfen. Graphische Oberflächen wird wohl keiner in ASM bauen und auch dein Compiler braucht sich darum nicht zu kümmern. Du bietest ja nur ein Grundkontingent an Befehlen an, die wirklich in Maschinencode übersetzt werden. Der Rest wird auf Basis dieser Befehle direkt in der Sprache geschrieben (als Library). Schau dir am besten mal Flex und Yacc/Bison an (hast du wahrscheinlich schon, wenn du das Drachenbuch liest 😉 ).

30.04.2010 - 23:36 Uhr

Okay, hab es nun anders gelöst. Ich benutze jetzt XACT Soundbänke. Das funktioniert super und ist performant.

29.04.2010 - 21:54 Uhr

Hi,

ich habe ein Problem. Wir programmieren gerade für ein Projekt im Studium ein XNA Spiel für's Surface und es tritt folgender Fehler auf: Am Anfang wird ein Intro abgespielt. Soweit läuft alles. Wenn jedoch VOR dem abspielen des Videos noch die Sound Dateien für das Menü geladen werden sieht man die ersten 5 Sekunden des Videos nicht, sondern hört nur den Ton. Werden die Dateien jedoch erst danach geladen klappt es. Jetzt ist es natürlich ärgerlich Content außerhalb der LoadContent Methode laden zu müssen. Kennt jemand eine Lösung dafür? Kann man eventuell solange warten, bis der Content wirklich geladen ist? Ich habe es auch schon mit auslagern in eine Thread probiert, was leider auch nichts verändert hat. Wäre nett, wenn mir da jemand helfen könnte.

Gruß

Dario

24.04.2010 - 10:44 Uhr

Hi floste,

es sind zwar noch ein paar kleine Schönheitsfehler drin (2.0F * matrix möglich matrix * 2.0F nicht) und wenn eine Matrix keine Inverse besitzt liefert sie eine Matrix mit NaN gefüllt zurück, aber die Inverse war eh nicht gefordert und im groben läuft es ja. Also sehe ich die Aufgabe als erfüllt an.

Dann hau ma die nächste raus.