zeusosc schrieb:
Dan invertiere B nochmal und bestimme den Abstand der Werte zu A, danach invertiere das invertierte von B nochmal und bestimme den Abstand zu B,..
Dann hast Du doch Deine Rundungsfehler,...
Mit solchen Tricks macht man es nur noch schlimmer. Das ist auch kein Wunder, wenn der Abstand genau in den letzten signifikaten Stellen rumkrebst und die Anzahl signifikanter Stellen mit jeder Invertierung abnehmen kann.
int size = 15;
Matrix A = new Matrix(size, size);
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
A[i, j] = 1.0 / (i + j + 1);
Matrix B = Matrix.Inverse(A);
Matrix C = Matrix.Inverse(B);
Matrix Error = C - A;
//Bisschen fragwürdig. Kann man auch weglassen mit keinem anderen Ergebniss
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
Error[i, j] = Math.Abs(Error[i, j]);
//"Fehlerkorrektur". C war zweimal invertiert und Annahme linearer
//Fehlerfortpflanzung. Also halben Error abziehen
Matrix CorrectedB = B - 0.5 * Error;
Matrix X = new Matrix(Matrix.Identity(size)) - A * CorrectedB;
Matrix Y = new Matrix(Matrix.Identity(size)) - A * B;
double ErrorWithCorrectedB = 0;
double ErrorWithNormalB = 0;
for (int i = 0; i < size; ++i)
for (int j = 0; j < size; ++j)
{
ErrorWithCorrectedB += Math.Abs(X[i, j]);
ErrorWithNormalB += Math.Abs(Y[i, j]);
}
if (ErrorWithCorrectedB > ErrorWithNormalB)
Console.WriteLine("--- verschlimmbessert ---");
(Advanced Matrix Library in C#. NET von CodeProject)
Um die Performance kann man sich kümmern sobald Kritisch ^^ (-> Profiler)
Bis dahin kann man Linq die Arbeit machen lassen:
//Pseudo
class Demo
{
public Demo()
{
// Fill _boxes somehow
}
private List<Box> _boxes;
public Article GetArticleById(int id)
{
return (from k in _boxes from a in k.Artikel where a.Id == id select a).FirstOrDefault();
}
}
public class Box
{
public List<Article> Artikel { get; set; }
}
public class Article
{
public int Id { get; private set; }
}
Dravere schrieb:
µ schrieb:
Btw. MDI ist unschön und veraltet.
Ah gut, ein Vertreter dieser Fraktion. Kannst du mir da mal Gründe aufführen? Ich kenne so viele gute MDI Lösungen, welche ohne MDI katastrophal aussehen, dass ich es einfach nicht begreifen kann, dass man sich so explizit gegen MDI wehrt.
Naja, Fraktionszugehörigkeit möchte ich noch nicht beanspruchen. MDI kann nett sein aber die meisten Anwendungen sind ein unübersichtlicher Krampf für den Benutzer.
Tabs gehen mir andererseits zu stark in die Gegenrichtung.
Zeitgemäß finde ich Dockpanels wie im Visual-Studio. Es gibt eine DockpanelSuite für Winforms mit der man sowas schnell nachbauen kann. Damit hat der Benutzer wahlweise Tabs oder ein MDI-Layout, erweitert um intuitive Docking-Eigenschaften beim Ziehen der Fenster an einen Rand
Vielen Dank für die Hilfe, es funktioniert endlich.
Für die Nachwelt:
Ich habe den Code, den man unter diesem Link finden kann http://www.gamedev.net/topic/419710-simulate-keypress-and-directx/ , benutzt.
struct INPUT
{
public UInt32 type;
//KEYBDINPUT:
public ushort wVk;
public ushort wScan;
public UInt32 dwFlags;
public UInt32 time;
public UIntPtr dwExtraInfo;
//HARDWAREINPUT:
public UInt32 uMsg;
public ushort wParamL;
public ushort wParamH;
}
enum SendInputFlags
{
KEYEVENTF_EXTENDEDKEY = 0x0001,
KEYEVENTF_KEYUP = 0x0002,
KEYEVENTF_UNICODE = 0x0004,
KEYEVENTF_SCANCODE = 0x0008,
}
[DllImport("user32.dll")]
static extern UInt32 SendInput(UInt32 nInputs, [MarshalAs(UnmanagedType.LPArray, SizeConst = 1)] INPUT[] pInputs, Int32 cbSize);
private void button2_Click(object sender, EventArgs e)
{
//...
INPUT[] InputData = new INPUT[1];
InputData[0].type = 1; //INPUT_KEYBOARD
InputData[0].wScan = (ushort)0x0F;
InputData[0].dwFlags = (uint)SendInputFlags.KEYEVENTF_SCANCODE;
if (SendInput(1, InputData, Marshal.SizeOf(InputData[0])) == 0)
{
System.Diagnostics.Debug.WriteLine("SendInput failed with code: " +
Marshal.GetLastWin32Error().ToString());
}
//...
}
Bei der Zeile
InputData[0].wScan = (ushort)0x0F;
muss man dann den Keycode eingeben. Da ich die TAB-Taste wollte, wäre das eig. ASCII 0x09, aber DirectX hat da eine andere Tabelle: http://tescosi.com/wiki/General:DirectX_KeyMap
Deswegen ist die TAB Taste 0x0F.
Vielen Dank nochmal für die Hilfe.
Da du ja schon programmierne kannst waere vielleicht das Buch "Kompaktkurs C# 4.0" von Moessenboeck etwas fuer dich.
Da sind die meisten Sprachfeatures erklaert jedoch ohne grossen Schnickschnak. Es ist halt wie der Titel schon sagt ziemlich kompakt geschrieben.
Das Problem ist auch tatsächlich nicht gelöst und dürfte durch open-close irgendwo haken. Möglicherweise bei dem Streamwrite oder Streamread nicht den Datenstrom nicht wieder beendet zu haben oder beim Form.Show Hide.
Ich gewöhne mir das an, dass Programm hat bereits über 30 Forms und öffnet einige dateien und hat bisher einwandfrei funktioniert, muss dann aber letztens doch mal was vergessen haben.
Ich werde da jetzt mal suchen, aber wollte nochmal sagen, dass es noch weitere Auffälligkeiten gibt.
Alle Programme debuggen normal
Ich kann auch beim PC Neustart oftmals nicht erfolgreich debuggen, er macht manchmal auch nur ne Uhr ohne die Fehlermeldung kurz und macht dann nichts.
Manchmal muss ich vier fünf mal das Visual Studio neustarten und wenn ich schnell auf debugg gehe, dann gehts manchmal und bis jetzt lief es dann immer, nur sobald ich eine Änderung vorgenommen hatte und dann nochmals debuggen wollte, gings nicht mehr.
Aber wie gesagt, ich suche mal alles ab, kann sich ja nur um Stunden handeln
geeky schrieb:
Das Setup-Programm schreibt normalerweise nen Logfile (dd_.txt, VSS.txt oder so, meist im %TEMP%-Ordner), such das mal und werf einen Blick rein.
Danke aber SharpDevelop (V 4.1.0.8000) läuft super Visual C# von MS brauche ich nicht mehr dazu !!!
Kaeltepol schrieb:
Kopiere ich dieses Objekt in ein Feld und greife hierauf zu, so kommt es zu einer Fehlermeldung (Exception).
Und welche Fehlermeldung ist das?
Sofern der Server noch eine Verbindung annehmen kann und ein entsprechenden Befehl unterstützt - Ja!
Ansonsten kannst du den Prozess nur auf brutale Weise abschießen.
Das geht auch einfacher.
public struct CarData
{
public int Id;
public string GameName;
}
public class CarDataList : List<CarData>
{
public CarData GetCarByGameName(string gameName)
{
return FirstOrDefault(c => c.GameName== name);
}
}
Unabhängig davon, hattest du auch verstanden was das Problem war?
Hallo Dravere, genau sowas habe ich gesucht, bin aber nicht auf Navigation gekommen Werde mal sehn wie weit ich mit den Infos komme. Vielen Dank!
An knivil: wo stehen denn hier Nachfragen in Richtung Zukunftssicherheit? Verschone uns bloß mit dem Heise-Scheiß!!!! Oder warte auf das Sonderheft zu diesem Thema. Heise macht nähmlich zu jedem Scheißdreck ein Sonderheft!!!!
Die Listbox wird nicht von alleine wissen dass sie beim Event "SelectedIndexChanged" dein "lstTab_SelectedIndexChanged" aufrufen soll.
http://itnotes.net/wp-content/uploads/2011/03/Capture_Enter.jpg
- Klick deine Listbox an
- Im Properties-Fensterchen (im bild da rechts) auf den Blitz klicken, dort werden die Events angezeigt die die Listbox feuern kann
- Schaue dort nach SelectedIndexChanged und wähle da deine Funktion aus
Alternativ: Klicke doppelt auf die Listbox, dann erzeugt er automatisch eine leere Funktion wo du das was du bisher in lstTab_SelectedIndexChanged stehen hast rein kopieren kannst
Im Grunde sollte deine Anwendung bei jedem Button-Klick genau den gleichen Code immer wieder abarbeiten. Macht sie das nicht?
Zeig mal ein wenig Code. Denn wenn deine Anwendung oben geschriebenes nicht tut, hast du irgendwas falsch gemacht.
Bei der Frage class vs. struct beachte ich in .NET fast nur den Aspekt: Brauche ich Referenz- oder Wertsemantik? Und dann entscheidet es sich aller Regel nach für class structs machen meistens mehr Arbeit, wenn man sie für mehr benutzt als reine POD-Speicher.
Ich denke ich würde das so machen:
private class MyValueAsClass {
public MyType value1 {
get;
private set;
}
public MyType value2 {
get;
private set;
}
public MyType value3 {
get;
private set;
}
public MyValueAsClass(MyType val1, MyType val2, MyType val3) {
this.value1 = val1;
this.value2 = val2;
this.value3 = val3;
}
}
Das geht auch einfacher:
double d = Double.Parse("0.41", CultureInfo.InvariantCulture);
bzw. noch besser mittels TryParse (damit keine Exception geworfen werden könnte):
double d = 0;
if (Double.TryParse("0.41", NumberStyles.Float, CultureInfo.InvariantCulture, out d))
{
// ...
}