Laden...

Forenbeiträge von Tarion Ingesamt 381 Beiträge

09.11.2013 - 00:07 Uhr

Hi,
ich bin dabei ein Repository Pattern für den Datenzugriff zu implementieren und suche nach einer guten Lösung für das Caching der Daten im Speicher. Ich will dabei ungern das Rad neu erfinden und meinen eigenen Cache implementieren ...

Wozu ratet ihr?

17.06.2012 - 13:08 Uhr

FZelle, nach deiner Erklärung kann ich das ganze dann so beschreiben:
Ich habe einen TimeService und einen PlayerStateProvider sowie einen PlayerStateService. Nun hängt der PlayerStateProvider vom TimeService ab.

Dann ist die Frage: Ist es sinnvoll, dass ein Provider von einem Service abhängt? Oder sollte diese Abhängigkeit von einem Service gekapselt werden?

Warum die Unterscheidung zwischen PlayerStateService und PlayerStateProvider?
Weil der PlayerStateService Konsumerorientiert und Stateless ist, im Gegensatz zum PlayerStateProvider

Ich sehe aktuell auch keine Probleme in meinem Design, ich interessiere mich nur für Konzepte und Good Practice.

17.06.2012 - 12:42 Uhr

Den Äußeren Server will ich halt vermeiden, da der Provider darauf angewiesen ist, dass er regelmäßig den Zustand prüft. Dieses Wissen sollte ein Service, der den Provider nutzt nicht haben.

Die Provider hängen alle über Interfaces zusammen. Aktuell ist alles überschaubar und ich verbinde es direkt im Code ohne extra DI Container. Aber das lässt sich bei bedarf nachrüsten.

17.06.2012 - 11:55 Uhr

Ich hab schon einiges über SOA gehört und gelernt, das meiste bezieht sich auf Services. Jetzt habe ich mehrere Provider die von anderen Providern abhängen.

Beispiel:
Ein TimeProvider gibt die aktuelle Zeit
Ein PlayerStateProvider nutzt intern jede Sekunde den TimeProvider, um festzuhalten, wann sich der Zustand des Spielers geändert hat.

Aktuell hängt der PlayerStateProvider (und andere Provider) direkt vom TimeProvider ab.

Ist das nun schlechtes Design? Und warum?

Wenn ich dass in einem Service implementieren würde, müsse der Service:
Von PlayerStateProvider und TimeProvider abhängen und den PlayerStateProvider regelmäßig aktiv nach dem Zustand des Spielers fragen. Denn wird der PlayerStateProvider mal nicht gefragt, bekommt er die Zeit, wann sich der Zustand geändert hat nicht mit.

Wie designe ich das ganze am besten Serviceorientiert?

12.04.2012 - 17:21 Uhr

Ich verwende den Updater immer gerne, ich weiß nicht wie es Zeitlich klappt - Grundsätzlich hätte ich aber schon Interesse Erweiterungen dafür zu schreiben.

12.04.2012 - 17:15 Uhr

Wir sind mit dem Projekt sehr weit voran gekommen. Der Bau hat die nötigen Landschaften und Gebäude für den Livebetrieb fertig gestellt, die Fangemeinde ist seit der ersten Anfrage hier stetig gewachsen.
Es gibt ein Liveserver auf dem Bereits Betatests mit Spielern durchgeführt wurden und bis Spielstart weitere Tests folgen.

Man kann sagen, wir befinden uns in den letzten Zügen vor Spielbeginn. Wir such dennoch weiterhin fähige Programmierer, die sich für unser Projekt begeistern lassen.

Wenn ihr also Interesse oder Fragen habt meldet euch gerne bei mir.

Gruß, Tarion

24.03.2012 - 18:42 Uhr

Ich habe selbst wenig Erfahrungen, vor Kurzem habe ich aber von einem Kollegen der sich tiefgehender mit dem Thema beschäftigt hat das für spezielle Anwendungen das Event nicht mehr ausreicht. Aber angeblich sind ihm durch die Events in bestimmten fällen daten verloren gegangen oder in der falschen Reihenfolge angekommen. Das hängt aber auch von der Peripherie ab, wie USB/Seriell Wandler, etc. und ist kein reines C# Problem gewesen.

23.03.2012 - 22:27 Uhr

Es gibt 2 Bedingungen damit das Event gefeuert wird.

  1. eine konfigurierte Anzahl Bytes wurde empfangen
  2. es sind Daten vorhanden und eine konfigurierte Zeit ist vergangen

Diese beiden Werte können in der SerialPort Klasse eingestellt werden. Paramternamen habe ich nicht im Kopf.

In Zeitkritischen Anwendungen und in Multithreadanwendungen kann dieses Verhalten durchaus Probleme verursachen. In den meisten Anwendungen wird es aber ausreichen.

Der sicherste Weg wäre ein eigener Thread der auf neue Daten pollt. Dann hat man alles was ankommt und in welchen Threads es verarbeitet wird selbst in der Hand.

16.02.2012 - 15:56 Uhr

Das stimmt so nicht: Wenn der Member, der den Delegate "erwartet" public ist, muss auch der Delegat öffentlich zugänglich sein.
Und wenn der Member z.B. internal ist, macht die Sichtbarkeit des Delegaten keinerlei Unterschied.

Hm ja, ich dachte an so etwas wie unten gezeigt. Aber da macht es dann tatsächlich keinen Unterschied ob das Delegate internal ist oder nicht.


    internal delegate void FilterFunc();
    public class ImplementingFilter
    {
        private FilterFunc m_MyFilter;
        internal FilterFunc MyFilter
        {
            get { return m_MyFilter; }
            set { m_MyFilter = value; }
        }


        public ImplementingFilter()
        {
        }

        public void FilterSomething()
        {
            m_MyFilter.Invoke();
        }
    }

16.02.2012 - 11:49 Uhr

Du hast für deine Definitionen zwei Möglichkeiten:
(1) Zur Laufzeit Interpretieren oder (2) in C# Code umwandeln. Mir fallen grad nicht mehr ein.

(1) Du kannst dir die Struktur der erwarteten Daten anlegen und dem Message Reader zur Verfügung stellen. Die Definition dient dann quasi als Konfiguration für den Parser der die Daten strukturiert ablegt. Die geparsten Daten können z.B. in Dynamics abgelegt werden. Dies kostet allerdings etwas Typsicherheit.

(2) Ist im Prinzip dein Vorschlag. Du kannst per CodeDOM Code erzeugen, Compilieren, Einbinden und per Reflection drauf zugreifen. Hier bist du Typsicher.

Was nun mehr Arbeit macht ist die Frage. Ich denke ich würde einen unabhängigen Codegenerator für (2) bauen und die Klassen dann statisch einbinden und im Programm nutzen.

(3) Du kannst natürlich die gegebenen Definitionen auch per Hand in Code übersetzten.

Schau dir mal WCF an, die definieren auch Protokolle und erzeugen auf Basis der Metainformationen die Datenstrukturen - in dem Fall Interfaces.

Gruß.

16.02.2012 - 11:40 Uhr

Der Punkt ist, dass

this.Invoke(new MethodInvoker(downloadWorker));

die downloadWorker() mehtode im GUI Thread ausführt. Das ist genau der Sinn von Invoke von WinForms.
Schau dir auch mal den "BackgroundWorker" an der für solche Fälle gut geeignet ist.

16.02.2012 - 11:33 Uhr

In deinem Fall spricht nichts gegen Func<T>.

Gründe für ein Eigenes Deletagte könnten die Typsicherheit oder der Zugriffslevel sein. Wenn du z.B. irgendwo ein "Filterdelegate" erwartest kann dir das jeder Liefern der Zugriff auf das Delegate hat. Im Fall von Func<T> also jeder. Hast du ein eigenes delegate was möglichweise sogar internal ist, kannst du sicher sein, dass nur autorisierte Klassen dir das Delegate übergeben.

29.01.2012 - 19:51 Uhr

R232 ist kein Protokoll sondern eine Schnittstelle. Wenn du willst, kannst du sogar das TCP/IP Protokoll für RS232 implementieren (wohl nicht sehr sinnvoll).

Wir haben ein eigens entwickeltes Protokoll welches bereits implementiert ist und nun im rahmen einer neuen Softwareversion erneut implementiert wird. Ich beschäftige mich anhand dieses Beispiels mit dem Thema der Verifikation von Modell & Software.

@herbivore: Danke, das sind schöne Realitätsnahe antworten.
Man wird wohl immer davon ausgehen müssen, dass das eigene Modell korrekt ist. Wenn das Modell nicht zu groß ist, ist es zumindest überschaubarer als Quellcode. Das Framework wird man wohl auch als korrekt annehmen müssen.

27.01.2012 - 14:08 Uhr

Ich bin nach einiger Zeit mal wieder hier im Forum gelandet. Ich beschäftige mich aktuell mit der Verifizierung und Verifizierten Implementierung eines Protokolls.

Ich habe mich die letzte Woche intensiv damit beschäftigt wie man Software und Protokolle Spezifiziert, Verifiziert, Testet und Simuliert. Ziel des Threads soll es sein weitere Ideen und Anregungen zu dem Thema zu sammeln und meine Gedanken ein wenig zu ordnen. Da das Thema sehr weit gestreut ist, möchte ich meine bisherigen Ergebnisse ein wenig zusammenfassen:

Modelierung
Es gibt viele Tools die basierend auf verschiedenen Logiken wie LTL, CTL, CTL* mit denen sich Automaten und Systeme mit Modellen auf bestimmte Eigenschaften testen lassen können.
Ich habe das Protokoll bis zu einem bestimmten Abstraktionslevel bereits mit dem Tool Uppaal modelliert. Ich bin sicher, dieses Modell lässt sich noch erweitern und auch mit anderen Modelcheckern auf weitere Eigenschaften prüfen. Uppaal ist nicht optimal weil es eher auf Zeitkritische Anwendungen ausgelegt ist, was mein Protokoll nur bedingt ist (Nur Timeouts). Das größte Problem ist dabei eher ein korrektes Modell zu erstellen und zu wissen auf welche Eigenschaften es ankommt.
An Tools habe ich mir bisher näher angesehen: Alloy (Analyze Structures), Uppaal (timed automata), Spin (LTL), Enterprise Architect (Simulation), und es gibt noch viele mehr die ich nur kurz angesehen habe.

Verifizierung
Zwei Dinge müssen Verifiziert werden: Das Protokoll und die Implementierung.
Mit Code Contracts, Pex und automatischer Testgenerierung kommt man ja schon sehr weit. Dennoch handelt es sich um Testen und nicht um verifizieren. Hier ist die Frage, wie weit kann man überhaupt gehen? Wo sind die Grenze?
Man kann Runtime verfication über die Contracts machen und mit generierten Testcases eine Hohe Codecoverrage erreichen. Wie weit ist solch ein Vorgehen von formalen Verifikationen noch entfernt?

Welche Erfahrungen habt ihr in der Praxis gemacht?

Ausblick
Interessant wären Techniken um Modelle aus dem C# Code zu bekommen. Vielleicht kann man auch ein Modell der Spezifikation bauen und mit der Ausführung der Implementierung synchronisieren. Dann könnte man auf dem Modell Verifikationen durchführen und über die Laufzeitsynchronisation feststellen wie nahe das Modell an der Implementierung ist oder ob Zustände/Übergänge fehlen.

Über das Protokoll an sich kann ich hier aus verschiedenen Gründen nichts sagen. Es gibt natürlich auch einige Konkrete Probleme im Protokoll die ich angehen werden. Ich suche aktuell aber noch auf einer allgemeineren Ebene nach Lösungen und Problemen zum Thema "Verifikation".

01.08.2011 - 01:01 Uhr

Ich hab mir jetzt ne eigene serialisierbare Klasse gemacht die ich nutze:


using System;
using System.Collections.Generic;
using System.Text;
using System.Xml.Serialization;

namespace Server.ArxObscura.Engine.Scriptengine.Types
{
	public class TypeInformation
	{
        private string m_TypeName;
        private Type m_Type;

        public string TypeName
        {
            get
            {
                return m_TypeName;
            }
            set
            {
                m_TypeName = value;
                m_Type = null; // Will search for the type on next TypeInformation.Type._get()
            }
        }

        [XmlIgnore]
        public Type Type
        {
            get {
                if (m_Type == null && !String.IsNullOrEmpty(TypeName))
                {
                    m_Type = Server.ScriptCompiler.FindTypeByName(TypeName, false);
                }
                return m_Type; 
             }
            set
            {
                m_Type = value;
                if (value != null)
                {
                    m_TypeName = value.FullName;
                }
            }
        }

		public Boolean Compiled
		{
			get
			{
				if (Type != null) return true;
				return false;
			}
		}

        /// <summary>
        /// For XmlSerialization
        /// </summary>
        public TypeInformation()
        {
        }

		public TypeInformation(string typeName)
		{
			TypeName = typeName;
		}

		public TypeInformation(Type type)
		{
			Type = type;
		}
	}

}

31.07.2011 - 23:29 Uhr

Ich verwende den XmlSerializer. Ich habe ein Objekt mit einer Property vom type Type. Hier bekomme ich eine Exception ich soll XmlInclude oder SoapInclude verwenden.

Die beiden Attribute wollen aber den Type haben und das kommt für mich nicht in Frage. Muss ich jetzt nen Workarround gehen und meine Type Poperties als Strings abspeichern und beim Laden wieder in Types konvertieren oder gibt es da doch eine elegante Möglichkeit?

31.03.2011 - 16:16 Uhr

Hi,
P.S. Was ist wenn ich jedes Update als ServicePack markiere? Lädt er die Daten dann wieder inkrementell?
mfg Chris

Dann wird nur das jeweils neuste Update geladen. Wenn dort Dateien fehlen, die in alten Updates vorhanden waren, werden diese auch nicht installiert.

P.s. ist Laufwerk X ein Netzwerk Laufwerk?

28.03.2011 - 23:17 Uhr

Stimmt, wäre ne 3. Alternative 😃 War auch nur aus Interesse.

28.03.2011 - 22:13 Uhr

Hallo Tarion,

aufpassen, ich selbst bin bei diesem Environment.TickCount schon einmal in die Falle getappt. Läuft deine Anwendung nämlich länger als 24,9 Tage durch, so fängt der Wert von TickCount wieder auf Int32.MinValue gesetzt.

Hier geht es um die System Up Time und nicht die Laufzeit des Programms. Aber den Überlauf bekommt man nicht so einfach mit oder?

Könnte natürlich bei jeder Abfrage des Datums eine If-abfrage machen und den abgefragten Wert speichern.

28.03.2011 - 12:40 Uhr

Zur Genauigkeit kann man nicht viel sagen oder? Denke mal die Systemzeit basiert am Ende auch auf dem TickCount.

Mir geht es vor allem darum, dass ich meine Software aktuell als Admin starten muss um die Systemzeit mit einem Zeitserver synchronisieren kann. Da würde schon die Offsetlösung reichen. Es wird ohnehin in regelmäßigen Intervallen neu Synchronisiert.

Dann läuft die auch bei Benutzern die z.B. in der Firma keine Adminrechte haben.

27.03.2011 - 21:54 Uhr

TickCount klingt super. Danke.

27.03.2011 - 19:32 Uhr

Hi,
DateTime.Now ist immer die aktuelle Systemzeit. Gibt es eine Möglichkeit eine Uhr zu nutzen die von der Systemzeit unabhängig ist?
Grund wäre, dass die Systemzeit nur mit Adminrechten verändert werden kann.

Natürlich kann man nur den Offset speichern und dann immer die gewünschte Zeit berechnen. Dann ist man aber weiterhin abhängig von der Systemzeit.

Gruß, Tarion

27.03.2011 - 19:29 Uhr

Es gibt 2 Versionsnummern:

[assembly: AssemblyVersion("1.4.4.0")] // Änderung führt zu neuem Verzeichnis für die COnfig
[assembly: AssemblyFileVersion("1.6.0.0")] // Dateiversion der Assembly. Änderung hat keinen Einfluss auf die Config

Mich interessiert wie man an den Pfad der Config ran kommt.

27.03.2011 - 19:17 Uhr

greife nie aus dem MainForm auf die Internas eines UserControls zu. Definiere ein eigenes Event im UserControl und abonniere das im MainForm.

Ein anderer Ansatz wäre, das Usercontrol Werte in einer anderen Klasse verändern zu lassen die INotifyPropertyChanged implementiert. Dann kann sich die MainForm direkt als Databinding an diese Klasse hängen.

27.03.2011 - 19:12 Uhr

Ich habe mein Problem jetzt gelöst. Beim Formatieren der Zellen wurde eine Liste mit mehreren Tausend Einträgen durchsucht. Das Ergebnis kann problemlos gecached werden.

Aber gut zu wissen, dass es theoretisch funktioniert. Ich glaube nicht, das die Limitierung der Threadwechsel zu Verzögerungen von >50ms Sekunden führen würde.

Mir fallen auch nicht viele Gründe ein, aber eine Uhr die möglichst genau laufen soll wäre schon nen guter Grund.

25.03.2011 - 20:46 Uhr

Ich färbe in CellFormatting und hab da gerade noch Code gefunden der tatsächlich langsam sein könnte.

Die Daten aktualisieren das Form nicht, weil es sich um eine berechnete Property handelt die von der Zeit abhängt und daher kein OnPropertychange wirft.

25.03.2011 - 19:05 Uhr

Nabend,
ich habe eine Anwendung mit 2 Forms. In der einen läuft eine Uhr und im anderen ist ein DataGridView.

  • Der Grid beinhaltet Daten, die jede Sekunde aktualisiert werden.
  • Die Uhr bleibt einige Millisekunden stehen, wenn die Daten im anderen Form aktualisiert werden

Ich habe das Aktualisieren über gridView.InvalidateColumn() implementiert.

Es ändert sich jede Sekunde der Inhalt einer Spalte und abhängig vom Wert der Spalte wird die entsprechende Zeile gefärbt.

Das sieht mit InvalidateColumn alles super aus, bis auf die benötigte Zeit. Dadurch wird die Uhr in der anderen Form jede Sekunde kurz angehalten.

Eine Lösung wäre das Update schneller zu machen. Ich weiß nur nicht wie.

Oder ich lagere die Uhr Form in einen eigenen Thread aus. Hier die Frage: Ist das überhaupt möglich?

Edit:


void m_UpdateTimer_Tick(object sender, EventArgs e)
        {
			for (int i = 0; i < gridView.ColumnCount; i++)
			{
				gridView.InvalidateColumn(i);
			}
        }

Oder kann man die Kontrolle in jeder Iteration der Schleife einmal an die MainLoop der GUI zurück geben?

Gruß, Tarion

23.03.2011 - 23:04 Uhr

Wird der im Update mit geliefert oder ist der im UpdateController enthalten?

23.03.2011 - 11:52 Uhr

Ich habe den Updater jetzt in 3-4 Hobby Projekten eingesetzt. Ich hatte nie größere Probleme und der Support war immer super. Bin jetzt auf die Beta umgestiegen aber nutze bei, da die Beta Statistiken nicht mehr nach Updateversionen filtern kann. Sonst hat sie aber viele Vorzüge wie Drag&Drop Erstellung von Updates und ist dabei so fehlerfrei wie die Final.

Ich benutze den Update nativ im Quellcode und nicht in der GUI. Läuft auch super. Man hat volle Kontrolle über alle Aktionen und Daten.

18.03.2011 - 16:03 Uhr

Ja habe ich. Führt das zu Problemen? Ich kenne sonst keine Möglichkeit an Adminrecht zu kommen.

17.03.2011 - 23:40 Uhr

Zum Thema restart application habe ich auch neue Infos. Unter Win XP geht es, nur bei Win 7 nicht.

Die Anwendung verlangt Adminrechte. Aber denke daran sollte es nicht scheitern sie neu zu starten.

13.03.2011 - 14:17 Uhr

Der Key war:
{C93F8F79-128F-483E-93D9-A7744F8A66BD}_is1

Hab ich in der Registry gefunden.

13.03.2011 - 12:57 Uhr

Hm dann muss ich das nochmal testen. Eben hat er es nicht richtig gemacht.

Alpha updates scheinen mit der neuen DLL dann auch zu gehen. Wo ich aber noch dran hänge ist:

updater.restartApplication = true;

Nach dem Update wird das Programm nicht neu gestartet. Muss ich da noch mehr einstellen? Oder gibt es ne Möglichkeit heraus zu finden was da schief geht?

Edit:
noch eine Kleinigkeit. Ich hab mein Program mit inno setup erstellt und folgenden Wert:
AppId={{C93F8F79-128F-483E-93D9-A7744F8A66BD}

Diesen Wert nutze ich jetzt für die Option, die Version automatisch zu aktualisieren. Das scheint aber nicht zu gehen. Ich habe alle Kombinationen von Klammern probiert 😉 Mich verwirrt eh die doppelte Klammer auf. Hat inno setup damals automatisch so gebaut. Wie kann ich die ID meines Programms sonst heraus finden? Oder liegt es daran, dass ich mit Aplha updates teste?

13.03.2011 - 12:28 Uhr

Hi,
gibt es einen trick die updateSystemDotNet.Controller.dll beim Client zu aktualisieren? Einfach ins Updatepaket werfen hilft nicht.
Ich könnte sie umbenennen. Aber ne andere Lösung wäre schöner 😉

23.02.2011 - 23:17 Uhr

Wenn es nur um das identifizieren geht, ist ein Hash ungeeignet. Du kannst die GUID Klasse verwenden. Dort werden ausreichend große IDs produziert um Kollisionen zu vermeiden.

Oder du machst dir nen Counter der die eine eindeutige ID generiert und dann erhöht wird.

21.02.2011 - 23:24 Uhr

Hab was gefunden. Ist zwar nur am Datagridview zu tracken aber es erfüllt seinen Zweck. Für bessere Lösungen und Alternativen bin ich gerne offen.

private void dgvAlarms_UserDeletingRow(object sender, DataGridViewRowCancelEventArgs e)
		{
			AlarmTime alarm = (AlarmTime)e.Row.DataBoundItem;
			m_AlarmHandler.RemoveAlarm(alarm);
		}
21.02.2011 - 23:19 Uhr

Ich hab jetzt alles durchsucht aber irgendwie keine passende Lösung gefunden.

Ich habe eine BindingSource an nem DataGridView.
Jetzt lösche ich ein Item im GridView und möchte eine Referenz auf das gelöschte DatenItem. In der BindingSource ist es zu dem Zeitpunkte nicht mehr vorhanden und die BindingSource liefert offenbar auch kein Event um an gelöschte Objekte zu kommen.

Gibt es da ne einfache Lösung? Ansonsten baue ich gleich nen "Remove" Button aber das ist sehr unschön.

29.11.2010 - 18:11 Uhr

Formuliere dein Beispiel lieber direkt als Beispielcode, der wäre deutlich schneller zu verstehen als der Text.

Mit der Anleitung aus deinem Text löse ich das ganze einfach so:


class Worker {
  ParameterPath p1Path; // Wird nicht benötigt.
  ParameterPath p2Path; // Wird nicht benötigt.
  ParameterPath p3Path; // Wird nicht benötigt.

  DoWork(IParameter p1, IParameter p2, IParameter p3) {
    int myInt = p1.IntProperty;
    // Do smth. with myInt
  }
}


public interface IParameter {
  int IntProperty{ get; set; }
}


public class A : IParameter {
  Foo myFoo;
  int IntProperty{ get {return myFoo.MyBar.Value; } }
}

public class Foo {
  Bar myBar;
  public Bar MyBar{ return myBar; }
}

public class Bar {
  public int Value { get return 10; }
}


28.11.2010 - 15:43 Uhr

Das ist alles noch im Projekt verflochten und ist damit nicht direkt compilierbar. Der PHP Teil ist sehr klein und wurde bisher nur für tests benutzt.
Du musst dir natürlich selbst *.pem files generieren.

Ziel war es ein ganzes Lizenzsystem zu implementieren, wurde aber aus Zeitgründen noch nicht vollendet. Daher kann ich auch kaum Support zu dem Code anbieten, ich hoffe der hilft dennoch. Die ein oder andere Funktion könnte bestimmt hilfreich sein.

Gruß, Tarion

26.11.2010 - 09:37 Uhr

Dann kann man auch gleich die Daten mit Rijndael verschlüsseln wenn die nicht leserlich sein sollen. Ansonsten ist es eher eine Signatur aber genau so effektiv gegen Veränderung.

Xor hat ein großes Problem: Wenn man den Klartext kennt, kann man beliebige Stellen gezielt Manipulieren.

Was die Sicherheit im allgemeinen an geht: Bei synchroner Verschlüsselung wirst du immer den Schlüssel aus dem C# Programm ziehen können. Spätestens zur Laufzeit steht der im Speicher.
Ich habe mich daher mal für eine Asynchrone Verschlüsselung entschieden, da hilft es nicht den (Public) Key im Client nur zu kennen, man müsste ihn auch ändern um z.B. mit einem eigenen Proxy kommunizieren zu können. Dafür ist aber das Crpyto Modul notwendig. Wenn du das hast kann ich dir Quellcode dazu schicken.

26.11.2010 - 01:00 Uhr

Wenn du kein Crypt Modul in PHP hast kannst du als einfach zu implementierende Verschlüsselung ein xor über deine Daten legen und anschließend nach base64 convertieren (Zur Übertragung)

Gibt es auch fertig hier

26.11.2010 - 00:55 Uhr

Wird null auch als Wert angesehen...?

Musst du mal deinen Prof. fragen. Ansicht ist null ein Wert wie auch die Leere Menge eine Menge ist. Andererseits muss man nicht über "Wert" oder "nicht Wert" reden, wenn alles ein Wert ist.

[ ] Eine Variable, die im Unterprogrammaufruf verwendet wird

Ist ähnlich schwammig. Nach deinem Beispielcode wird i im Unterprogramm nicht verwendet, außer man würde wie ein Vorposter geschrieben hat ref oder out verwenden.
Wann wird eine Variable verwendet? Ich würde einfach sagen: Wenn keine Compiler Warning "Unused Variable" ausgegeben wird.

Im Wiki steht auch was zu Parametern

24.11.2010 - 16:35 Uhr

Ja, den Status über den ButtonText ab zu fragen, was ja in der GetWinner() Funktion passiert, ist natürlich suboptimal.

Ich werde die angesprochenen Punkte alle ausbessern. Es ist tatsächlich mehr aufgefallen als ich dachte.

24.11.2010 - 13:54 Uhr

Das ist keine Ausrede. Ich habe es released weil es ein gutes Beispiel für Anfänger ist und auch so sehr hilfreich sein kann. Der Zweck ist weniger damit korrekt TickTacToe zu spielen, sondern viel mehr ein kleines Beispielprogramm zu haben an dem man die Grundzüge des Programmierens versteht.
Das ich es noch korrigieren werde sobald ich Zeit finde habe ich bereits erwähnt.

Bitte verfasse deine Kritik zukünftig etwas konstruktiver.

Gruß, Tarion

24.11.2010 - 13:37 Uhr

Okay, so viel hab ich nicht getestet und wie gesagt: Die Funktion die prüft wer gewonnen hat stammt nicht von mir und habe ich nicht angefasst. Wenn ich Zeit finde werde ich die auch ordentlich implementieren.

Gruß, Tarion

24.11.2010 - 00:47 Uhr

Nichts besonderes. Ein ganz einfaches TickTacToe Spiel.

Aufgabe:
9 Buttons als Spielfeld.
1 Button um ein neues Spiel zu starten
1 Label zur Anzeige des Spielstatus: Aktueller Spieler oder Gewinner.

Nun soll einfach Tick Tac Toe gespielt werden können.

Anfänger können erst einmal probieren die Aufgabe selbst zu lösen und sich später die Lösung anschauen.

Es ist entstanden als ich jemandem mit Tick Tac Toe geholfen habe 😃

Die Funktion GetWinner() ist nicht von mir und ich hatte keine Lust/Zeit die schöner zu implementieren. Funktioniert aber. Edit: GetWinner() funktioniert nicht korrekt.

23.11.2010 - 12:51 Uhr

Wie sieht denn der Type LPUNKNOWN aus?

Im Endeffekt musst du ja ein Pointer auf LPUNKNOWN übergeben.

17.11.2010 - 15:06 Uhr

Man nehme C code:


SMCR = (SMCR & 0xf0) | 1 << SE | read_uint8_t(&atm128PowerBits[powerState]);

Jage ihn durch den nesC compiler, der daraus wieder C code generiert und bekommt:


  * (volatile uint8_t *)(0x33 + 0x20) = ((
  * (volatile uint8_t *)(0x33 + 0x20) & 0xf0) | (1 << 0)) | __extension__ ({
#line 133
    uint16_t __addr16 = (uint16_t )(uint16_t )&McuSleepC__atm128PowerBits[powerState];
#line 133
    uint8_t __result;

#line 133
     __asm ("lpm""\n\t""mov %0, r0""\n\t" : "=r"(__result) : "z"(__addr16) : "r0");__result;
  }
  );

Thats magic =)

P.s.
Wer mir erklären kann was der Teil hinter extension macht. Also generell so ein compound statement nicht der exakte code aus dem Beispie, der möge mir eine pn schrieben.

Ich vermute: Führt alles aus und gibt das letzte Statement zurück. Hängt das mit dem extension keyword zusammen?

11.11.2010 - 22:38 Uhr

Beachte dringen, dass 2 Byte zum Codieren der Zahlen 0 - 65536 ausreichen (signed wirst du noch weniger haben)
1 MB hat 1024 * 1024 = 1048576 bytes und lässt sich damit nicht mit 2 Bytes ankündigen. In die Falle bin ich selbst schon gelaufen.