Guten Tag,
gibt es die Möglichkeit, in Silverlight einfache Elemente(Linien o.ä.) zu zeichnen?
Ich suche soetwas wie eine Picturebox in C#, wo man dann auf das graphic element zugreifen und darauf zeichnen kann. Das ganze möchte ich in Silverlight dann allerdings auch wenn möglich ausschließlich mit C# Code realisieren, ohne dass ich eigenen xaml code schreiben muss.
Beste Grüße
Daniel
Ja so viel ich weiß verbraucht Rekursion ja mehr Arbeitsspeicher im Stack, deswegen dachte ich mir, dass es vielleicht auch langsamer sein könnte. Ja das Problem, das ich habe, handelt um eine AlphaBeta Suche im Skat..und das ganze ist doch sehr zeitintensiv, letztendlich wird mir wohl nichts übrig bleiben als auf C / C++ umzusteigen...
Ausschreiben würde ich es so, dass ich die Funktion quasi in sich selber hardgecodet reinschreiben würe, was natürlich extrem unschön wäre.
Guten Tag,
ich gehe eine Baumstruktur mit bis zu 32 Ebenen rekursiv durch. Jetzt frage ich mich, ob Rekursion denn grundsätzlich langsamer ist, als wenn ich alles "ausschreiben" würde?
Beste Grüße,
Daniel
danke, das mit dem Studio als Admin starten funktioniert optimal. Habe es vorher so ähnlcih getestet und versucht, die Projektdatei als Admin zu öffnen, was aber nicht funktioniert, da es keine Exe ist. Aber das Studio kann ich so öffnen, und dann einfach über "Projekt öffnen"..
Schönen tag noch,
Daniel
Guten Tag,
ich arbeite derzeit an einer Testautomatisierung und muss dazu mit dem RanorexStudio auf die Oberfläche in einem Programm zugreifen. Das Programm hat beim Start eine Sicherheitsabfrage, ob Änderungen am System vorgenommen werden dürfen. Das führt dazu, dass das Programm auf einem anderen Sicherheitslevel ist als meine Testautomatisierung. Wenn ich die Testautomatisierungsexe von Hand mit "Als Administrator ausführen" öffne funktioniert alles. Wenn ich das Programm aber von meinem Studio aus öffne funktioniert es aufgrund der Sicherheitsebenen nicht.
Auch wenn das Studio nicht gleich ist wie das VisualStudio, ist es doch sehr ähnlich und deshalb hoffe ich, dass ihr mir weiter helfen könnt. Gibt es eine Möglichkeit, dass das ganze automatisch mit Adminrechten geöffnet wird?
Viele Grüße,
Okay, ich habe endlich den Fehler gefunden. Ich ändere ja die Variable spielerDerDranIst in jedem Schleifendruchlauf, anstatt nur die geänderte Variable zu übergeben X(
Vielen dank für eure Hilfe!
Ja, das dachte ich auch, ich habe es aber nicht hinbekommen..ich habe auch lange alle möglichen Variablen mitgeloggt und versucht, das dann im nachhinein zu analysieren, bin aber zu keinem Ergebnis gekommen..an sich sollte das ganze ja tatsächlich kein Problem sein, den MinMax Algorithmus ( "Vorversion" von AlphaBeta) habe ich schon mal implementiert mit dem gleichen Rekursionsaufbau, nur dass es damals funktioniert hat. Wäre also sehr erfreut, wenn mir jemand auf die Sprünge helfen könnte. Was ich nicht verstehe ist, wieso er eine ArgumentOutOfRangeException bringt, wenn oben in der forschleife die Bedingung dafür, dass er überhaupt in die forschleife geht, ist, dass die Anzahl eben größer als 0 ist und das i dürfte ja auch nicht größergleich werden als die Anzahl in der entsprechenden Liste..
ich verstehe nicht ganz, was das ja bedeutet..da ich die Listen ja jedes mal kopiere, bevor ich sie übergebe, darf das i doch eigentlich nicht größer werden?
das Problem ist auf lange sicht nicht ohne Rekursion lösbar, da die Listen ja auch noch größer werden und da später dann auch noch ein Algorithmus ( Alpha Beta) darauf läuft..
Zu der Abbruchbedingung:
Am anfang hatte ich noch über dem ganzen die Abfrage:
if (karten[spielerDerDranIst].Count > 0)
Das hat aber am Inhalt nichts geändert, da die Schleife das ja quasi auch abfrägt.
Wäre cool wenn sich das jemand mal genauer anschauen könnte, habe jetzt schon viel Zeit damit verbracht, finde den Fehler aber einfach nicht..:(
Hier das ganze nochmal auf das nötigste reduziert:
private void hinzufuegen2(List<List<Karte>> karten, int bspielerDerDranIst)
{
int spielerDerDranIst = bspielerDerDranIst;
int anzahlDurchlaeufe = karten[spielerDerDranIst].Count;
for (int i = 0; i < anzahlDurchlaeufe; i++)
{
List<Karte> a0 = new List<Karte>(karten[0]);
List<Karte> a1 = new List<Karte>(karten[1]);
List<Karte> a2 = new List<Karte>(karten[2]);
List<List<Karte>> kopiekarten = new List<List<Karte>>();
kopiekarten.Add(a0);
kopiekarten.Add(a1);
kopiekarten.Add(a2);
kopiekarten[spielerDerDranIst].RemoveAt(i);
spielerDerDranIst++;
if (spielerDerDranIst == 3)
{
spielerDerDranIst = 0;
}
hinzufuegen2(kopiekarten, spielerDerDranIst);
}
}
karten enthält also 3 Listen vom Typ List<Karte>. Jede dieser Listen repräsentiert die Karten, die der jeweilige Spieler auf der Hand hat. Die funktion soll alle verlaufsmöglichkeiten durchgehen(und dann in einem Treeview anzeigen).
Guten Tag,
ich habe eine Rekursive funktion geschrieben und finde einfach nicht, warum sie nicht funktioniert (immer nach einigen "durchläufen" eine ArgumentOutOfRange Exception wirft)...
Nach 20 mal Debuggen bin ich langsam am verzweifeln und hoffe, dass sich jemand von euch mal die Zeit nimmt, sich das anzuschauen!
private void hinzufuegen(TreeNode bknoten, List<List<Karte>> karten,
List<Karte> stich, int bspielerDerDranIst ,int vorhand)
{
TreeNode knoten = bknoten;
int spielerDerDranIst = bspielerDerDranIst;
int anzahlDurchlaeufe = karten[spielerDerDranIst].Count;
for (int i = 0; i < anzahlDurchlaeufe; i++)
{
try
{
knoten.Nodes.Add(karten[spielerDerDranIst][i].name);
stich.Add(karten[spielerDerDranIst][i]);
if (stich.Count == 3)
{
stich.RemoveRange(0, 3);
}
List<Karte> a0 = new List<Karte>(karten[0]);
List<Karte> a1 = new List<Karte>(karten[1]);
List<Karte> a2 = new List<Karte>(karten[2]);
List<List<Karte>> kopiekarten = new List<List<Karte>>();
kopiekarten.Add(a0);
kopiekarten.Add(a1);
kopiekarten.Add(a2);
kopiekarten[spielerDerDranIst].RemoveAt(i);
spielerDerDranIst++;
if (spielerDerDranIst == 3)
{
spielerDerDranIst = 0;
}
hinzufuegen(knoten.Nodes[i], kopiekarten, stich, spielerDerDranIst, 0);
}
catch (ArgumentOutOfRangeException)
{
textBox1.Text += "Exception! \r\n";
}
}
}
In meinem Fall sind in Karten immer 2 Karten drin, die ersten 6 durchläufe funktionieren auch fehlerfrei.
@WinSharp, nein, denke ich nicht, aber ich dachte mir halt, dass es sicher nicht schaden kann, das von anfang an "optimierter" zu machen...z.B. übergebe ich jedes mal 3 Listen (/Arrays) aus Karten....Karten wäre hierbei dann ja ein Objekt, die Listen auch ein Objekt...alternativ könnte ich dann ja auch feste Arrays übergeben mit den jeweiligen eigenschafen der karte....wobei das erste deutlich übersichtlicher ist.
@JAck30lena, wieso ist es in F# deutlich schneller?
Es geht darum, dass ich den Alpha-Beta Algorithmus für das Kartenspiel Skat implementieren möchte, da kämen dann auch sehr sehr viele Objekte zustande...deshalb habe ich mir die Frage gestellt, ob ich meiner rekursiven Funktion immer ein Objekt übergeben soll (bzw. 2, 3, je nachdem) oder ob ich alles als extra Parameter übergeben soll....die Objekte werden auch teilweise kopiert, das macht dann vielleicht auch noch einen Einfluss für die Entscheidung?
macht es denn einen Unterschied, wenn ich einen Algorithmus mit Objekten löse oder alles ohne eigene Objekte realisiere?
also angenommen mein Objekt hat die Attribute int a, String b und die funktion meineMethode().
Ist es jetzt schneller, wenn ich, anstatt das Objekt zu erzeugen, nur int a, String b und meineMethode(a,b) habe? Oder "erkennt" der Compiler das und macht da keinen unterschied?
Also es wird immer kopiert und eine einzige position wird dann geändert. Theoretisch könnte ich also auch immer nur z.B. die entsprechende Zeile kopieren und für die anderen Zeilen dann nur den Verweis kopieren, aber ob das so viel bringt weiß ich nicht...als alternative habe ich mir überlegt, einfach jedesmal die Änderung wieder rückgängig zu machen. Denkt ihr, dass das Performancetechnisch Sinn ergeben würde?
So, habe es jetzt umgesetzt. Jetzt braucht es nur noch 10% anstatt 40% der Gesamtdauer, also weit mehr als eine vervierfachung der geschwindigkeit des kopierens!
Ersteinmal vielen Dank für die vielen Antworten.
@TH69, ja, es ist zwingend erforderlich, dass ich jedes mal eine DeepCopy mache. Das ganze Programm arbeitet Rekursiv und ruft sich jedes mal etwa 20 mal selbst auf(also die Funktion), dafür muss dann aber auch jedes mal ein neues Feld übergeben werden. Ansonsten werde ich dann wohl auf einen 2Dimensionalen Array umsteigen und dafür die Liste weglassen, das scheint dann ja wohl ordentlich schneller zu gehen ;)
Guten Abend,
Ich bin derzeit dabei ein Programm zu programmieren, das sehr Rechenintensiv ist.
Dabei muss ich unter anderem ein Objekt sehr oft kopieren, welches eine 2 Dimensionale Liste enthält. Bisher braucht dieser Vorgang 40% der rechenzeit.
Ich mache es bisher so:
Das ist die Klasse deren Instanzen kopiert werden sollen mit ihrem Konstruktor:
class Feld
{
public List<List<int>> feld = new List<List<int>>();
public int breite;
public Feld(int breite)
{
this.breite = breite;
for (int i = 0; i < breite; i++)
{
List<int> liste = new List<int>();
for (int j = 0; j < breite; j++)
{
liste.Add(0);
}
feld.Add(liste);
}
}
Das ist die Funktion in der Klasse, mit der ich bisher kopiere:
public Feld KopieErstellen()
{
Feld b = new Feld(breite);
for(int i = 0; i < breite; i++)
{
b.feld.Add(new List<int>());
for (int j = 0; j < breite; j++)
{
b.feld[i].Add(new int());
b.feld[i][j] = feld[i][j];
}
}
return b;
}
Wie kann ich das ganze schneller machen??
Liebe Grüße,
Daniel
Guten Tag,
Ich möchte ein Spiel programmieren, bei dem man selber eine künstliche intelligenz spielen lassen kann. Es gäbe dann also eine Klasse Spieler, die eben eine bestimmte Funktion hat und von dieser Klasse kann man dann seine eigene Klasse ableiten. Diese sollte man nach Programmstart einfach mit dem Programm "laden"/öffnen können. Wie kann ich das am besten realisieren??
Habe jetzt eine Ganze weile in google gesucht, aber keine Klasse zum lösen eines lineraen gleichungssystems gefunden..
Kann mir da jemand helfen?
liebe Grüße :)
okay, also erstmal vielen Danke für die Gute Klasse.
Ich habe damit aber ein kleines Problem, dass ich nicht verstehe.
Also ich gehe so vor, dass ich normale Textboxen erstelle und dann im Formdesigner an beiden Stellen einfach den Typ ändere. Das funktioniert dann auch so weit. Nur, wenn ich jetzt die erlaubten Zeichen ändere, in meinem Fall ein "E" hinzufüge, dann wird das nicht übernommen für die alten Textboxen. Wenn ich jetzt aber wie oben beschrieben eine neue Textbox erstelle und diese dann entsprechend ändere , dann funktioniert das neue Zeichen bei dieser neuen Textbox. Ich habe dann also zwei Textboxen, die von der gleichen Klasse sind aber unterschiedlich funktionieren, die vor der Änderung erstellte Textbox akzeptiert das neue Zeichen nicht, die neue schon. Kann mir das jemand erklären?
Und noch eine zweite Frage, das Symbol der Klasse ist nicht das gewohnte Symbol sondern ziemlich komisch (kann es nicht beschreiben). Woran liegt das?
liebe Grüße
naja, ich wusste ja nicht warum es nicht funktioniert, deshalb konnte ich das ganze auch nicht genauer posten...UNd wie finde ich heraus, ob irgend eines der Controls den Focus hat?
okay,also ich glaube, die zweite Methode ist einfacher... Hierzu habe ich folgendes gefunden:
if (Focused)
{
}
So funktioniert es aber nicht, wenn ich diesen Code einfach in der Form1 verwende..aber weshalb nicht?
okay, jetzt stellt sich mir aber die Frage, wie ich heraus finde, ob der OpenFileDialog geöffnet ist...habe in den Eigenschaften leider nichts gefunden :(
private void pictureBox1_MouseUp(object sender, MouseEventArgs e)
{
int dx = gedrücktX - e.X;
int dy = gedrücktY - e.Y;
verschieben(dx, dy);
}
Jetzt möchte ich eine Datei öffnen, dazu nehme ich einen Openfiledialog. Wenn ich in diesem Dialog jetzt eine Datei auswähle mit Doppelklick, dann wird die verschieben() funktion aufgerufen. Dies passiert aber nur, wenn die Datei, auf die ich klicke, "über" der Picturebox ist. WEnn ich die Datei mit Enter öffne tritt der Fehler auch nicht auf.
Wie kann ich das verhindern??
liebe Grüße