Laden...

Forenbeiträge von ZiMD Ingesamt 564 Beiträge

07.11.2007 - 22:02 Uhr
#if DEBUG
            Console.WriteLine("Debug");
#endif
06.11.2007 - 17:00 Uhr

Oft zeigt sich eben doch, dass es am besten ist, von Anfang an das zu fragen, was man eigentlich wissen will. 🙂

Das wäre aber etwas dreist rüber gekommen einfach so nach der Lösung für den Wettbewerb zu fragen. 😉

Eine Lösung habe ich aber trotz allem nicht parat. 🙂

Na wenn selbst du keine Lösung findest kann ich mich wohl beruhigt zurücklehnen. 😁

06.11.2007 - 15:56 Uhr

Gut in dem Fall hab ich hier auch noch die ursprüngliche Aufgabenstellung:

Liebe Kundschaft,
wenn Sie an der Kasse zwei Gegenstände, die Sie kaufen wollen, nebeneinander
hinlegen und der Centbetrag der Summe beider Preise 11, 33, 55, 77 oder 99 betragen
sollte, dann erhalten Sie eine Prämie in Form eines kleinen Geschenks. Sie
können Ihr Geschenk aus einem reichhaltigen Angebot auswählen. Selbstverständlich
können Sie bei einem Einkauf mehrere Prämien einfordern. Jeder Gegenstand
kann aber nur zur Erlangung einer Prämie verwendet werden.Wir freuen uns, wenn
Sie die Herausforderung annehmen, Ihren Einkauf entsprechend auf dem Band anzuordnen.

Die Aufgabestellung stammt aus dem aktuellen Bundeswettbewerb Informatik. Habe ich einen Fehler in meinen ersten Überlegungen oder ist die Lösung wirklich nur unter extremem Aufwand zu berechnen? In den Beispieldaten, die auf der Homepage des BWINF bereitgestellt werden, gibt es schon in der kleinen Ausführung Fälle mit bis zu 500000 Preisen. Mit meinem Algorithmus oben ist das eindeutig nicht zu lösen. Schon bei 200 Preisen und 1000 Paaren wird die Berechnungszeit unverhältnismäßig lang.

05.11.2007 - 21:18 Uhr

Hi herbivore

Wieviele Paare hast du so?

Von einem bis mehrere Zehntausend.

Die Werte der Elemente werden vermutlich zwischen 1 und 9999 liegen, müssen es aber nicht. Die Verteilung der Werte ist absolut beliebig. Es kann also 9999mal eine Zahl vorkommen oder die Zahlen können gleichmäßig gestreut sein.

05.11.2007 - 20:21 Uhr

Hi herbivore

Wie ist der Zusammenhang zwischen den Werten bei dir?

Die Werte der Elemente sind beliebig. Der 100er Modulo der Summe muss einem von 5 Werten entsprechen. Mehr Zusammenhang gibt es leider nicht.

Vielen Dank schon mal für deine Hilfe.

05.11.2007 - 19:31 Uhr

Hi herbivore,

in dem meinem Fall hilft mir das glaube ich nicht weiter, weil das Modulo 100 der Summe der Werte der Elemente (also die letzten beiden Ziffern) einem von X nicht zusammenhängenden Werten entsprechen muss. Oder hab ich da ein dickes Brett vorm Kopf?

05.11.2007 - 18:53 Uhr

Angenommen ich hätte die einzelnen Elemente und die Kriterien unter denen zwei Elemente eine Kombination eingehen. Würde das einen Unterschied machen?

05.11.2007 - 18:14 Uhr

Hallo,

ich habe eine Liste mit Kombinationen beliebiger Daten:

  1. Element: (a|b)
  2. Element: (a|c)
  3. Element: (d|b)
    In diesem Fall soll ich die längste Aneinanderreihung von Kombinationen finden, ohne dass sich die Elemente in den Kombinationen wiederholen:
  4. Möglichkeit: (a|b)
  5. Möglichkeit: (a|c)(d|b)
    In diesem Fall ist also die 2. Möglichkeit die die ich finden will.

Mein Algo:

\*schnip*

Dadurch ergibt sich leider eine faktorielle Laufzeit. Nun will mir aber keine andere Möglichkeit einfallen diese perfekte Liste von Kombinationen zu berechnen.
Habt ihr eine Idee?

03.11.2007 - 16:43 Uhr

Puh wie meinen? Aber wenn du nur auf die 1. Nachkommastelle scharf bist:

nachKommaZahl = (int)(spannungSpeicherInDateiName * 10) % 10

% ist der Modulo-Operator der den Rest bei einer Division angibt.

03.11.2007 - 15:48 Uhr
double d = 13.6;
int convertInt = Convert.ToInt32(d);
int castInt = (int)d;
Console.WriteLine(convertInt);
Console.WriteLine(castInt);
Console.ReadLine();
/* Ausgabe
 * 14
 * 13
 */
03.11.2007 - 15:46 Uhr

Lass dir einfach mal den Pfad ausgeben.

03.11.2007 - 13:56 Uhr

.

18.10.2007 - 21:39 Uhr

HttpUtility.UrlDecode

10.10.2007 - 16:40 Uhr

Rechtsklick auf Verweise->Verweis hinzufügen->System.Runtime.Remoting

08.10.2007 - 16:30 Uhr

Das kommt daher, dass Computer Gleitkommazahlen eben so darstellen wie sie sie darstellen und hat nichts mit Rad oder Grad zu tun. Mehr dazu gibts bei Wiki

08.10.2007 - 14:47 Uhr

Hier steht alles was man über IDisposable wissen muss:
http://msdn2.microsoft.com/de-de/library/system.idisposable(VS.80).aspx

08.10.2007 - 14:40 Uhr

Alle Klassen die IDisposable implementieren solltest du immer mit using(...) benutzen. Wenn das unnötig viel Verschachtelung erzeugt solltest du zumindest manuell Dispose aufrufen.

08.10.2007 - 14:29 Uhr

Ein Double kann sehr lange Zahlen fassen. Kommt nur drauf an wie genau dus brauchst. Decimal wird meistens nur im kaufmännischen Bereich benutzt wo man sich keine Fehler Geldverlust bedeuten. Für alle anderen Fälle sollte double ausreichen.

08.10.2007 - 13:15 Uhr

Du kannst \d ersetzen durch ([0-4]|[6-9])

08.10.2007 - 12:45 Uhr

Das ist eine unnötig langsame und speicherintensive Methode.

double d = ((double)spaceFree) / spaceTotal;

08.10.2007 - 11:06 Uhr

"^([1-9][0-9]{0,3})?0$"

/€ Aha wies aussieht kannst du uns einfach nicht vermitteln was du wirklich willst. Erst sollen es nur Zahlen mit ner 0 hinten sein und jetzt wieder alle...

08.10.2007 - 10:53 Uhr

Ein Beispiel ist sicher nicht genug um die Kriterien zu erkennen...
Also, der Zahl soll immer 4 Ziffern haben und die letzte Ziffer soll eine 0 sein?
[1-9][0-9]{2}0

08.10.2007 - 10:44 Uhr

Der . ist sicherlich die absolut falsche Lösung!
Der matcht auch "30h0". Warum zeigst du uns nicht deinen Imput String wenn wir dir helfen sollen.

08.10.2007 - 10:25 Uhr

Wie sieht denn der Input String genau aus?

08.10.2007 - 10:23 Uhr

[Artikel] Regex-Tutorial
Und da besonders Punkt 4.12

08.10.2007 - 10:15 Uhr

Jetzt stell dich bitte nicht dümmer als du bist.
Das gute an einem Webcast ist, dass du genau siehst was der Host macht. Und ja der arbeitet auch mit dem VS 2005. Ist dir schon mal in den Sinn gekommen das nachzumachen was er macht? Ich zitiere gerne nochmal die Beschreibung des Cast:

Die Lokalisierung von Windows-Forms-Applikationen ist heutzutage einerseits kein Problem mehr und andererseits auch oft ein Muss. In diesem Webcast wird gezeigt, welche Vorbereitungen für eine Lokalisierung durchgeführt werden müssen. Danach wird demonstriert, wie die Lokalisierung selbst mit Visual Studio durchgeführt wird. Während des Webcasts werden die verschiedenen Klassen aus dem .NET-Framework vorgestellt, die in mehrsprachigen Applikationen eine wichtige Rolle spielen.

08.10.2007 - 00:36 Uhr

Öhm ja kann man schon:

FileInfo[] temp2 = di.GetFiles("*.*", SearchOption.AllDirectories);
List<FielInfo> files = new List<FileInfo>(temp2);
files.RemoveAll(delegate(FileInfo info)
{
    return !Regex.IsMatch(info.Extension, @"^\.(avi|mpg|mpge)$");
});
progress_FileRead.Maximum = files.Count;
foreach (FileInfo file in files)
{
    //mach was
    progress_FileRead.Increment(1);
}
07.10.2007 - 23:13 Uhr

Rechtsklick auf Verweise, dann auf Verweis hinzufügen, dann auf Durchsuchen und dann die richtige dll auswählen.

07.10.2007 - 16:09 Uhr

Ja stell dir vor du findest einen Bug den du dann in allen deinen Programmen einzeln bereinigen musst. schauder

07.10.2007 - 16:05 Uhr

Zumindest steht in der MSDN nicht das es geht.
Aber du könntest ja erstmal alle Dateien aus einem Verzeichnis laden und dann die mit der richtigen Endung raussuchen. Das geht z.B. mit Regex.

07.10.2007 - 14:12 Uhr

Entweder das oder Dlls

07.10.2007 - 11:05 Uhr

Was du hier machst ist alles so wischi waschi.
Lass das readonly einfach weg und gut ist. Außerdem sollten Variablen niemals public sein sondern nur über Properties erreicht werden können.

07.10.2007 - 00:23 Uhr

Na dann versuchs mal so:

public IEnumerable<Feld> Fields
{
    get
    {
        foreach (Feld f in fields)
        {
            yield return f;
        }
    }
}
[...]
TexTemplate tt = new TexTemplate();
foreach (Feld f in tt.Fields)
{
    f.name = "test";
}

Damit kann der Benutzer auf alle Elemente als Feld zugreifen, aber nichts zur Liste hinzufügen.

06.10.2007 - 21:41 Uhr

Ich würds einfach so machen:

tmp.Add(fields[i];

Aber vermutlich geht das alles noch viel einfacher...
Wie wär's, wenn du uns einfach mal sagst was du machen willst und uns deinen bisherigen gesamten Code zeigst.

06.10.2007 - 12:49 Uhr

[EDIT]Abgeteilt von Programmierwettbewerb - ja / nein[/EDIT]

Hätte mal wieder Interesse 👍
Man muss ja nicht unbedingt etwas teures verschenken! Eine kleine Anerkennung wie ein selbst gewählter Rang wäre für einige bestimmt schon Anreiz genug.
Auch wenn der Letzte nicht so ganz viele Bewerbe angelockt hat, sollten wir der Sache doch nochmal eine Chance geben oder?

06.10.2007 - 12:31 Uhr

Nein eben nicht. Ich hab doch gesagt, dass bei dem was du da machst ein neues Feld erstellt wird das aber auf die Selben Objekte zeigt! Außerdem musst du selber wissen was du über Properties freigibst.

Also nochmal:
Du hast keinen Zugriff auf das private "Feld" (ist damit jetzt ein Array oder eine Variable gemeint) fields sondern nur auf die Objekte deren "Adressen" in der Liste gespeichert sind.

Tipp: http://www.galileocomputing.de/openbook/oo/

06.10.2007 - 12:11 Uhr

Original von hobo
D.h. wenn ich folgendes mache:

List<Feld> l1 = new List<Feld>();  
List<Feld> l2 = new List<Feld>(l1);  
  

dann greife ich mit l1[0] und l2[0] auf das selbe Feld zurück?

Nein du greifst auf unterschiedliche Felder zu. Aber die Felder verweisen auf die selben Objekte.

Original von hobo
Wie löse ich denn dieses Problem mit Klassen?

Wenn es unbedingt sein muss kannst du das Interface ICloneable implementieren, aber du solltest davor echt nochmal überlegen ob es echt dass ist was du willst

Original von hobo
Es kommt doch häufiger vor, dass man ein Objekt zurück gibt und auch wieder eins an die Klasse übergibt.

Ja sicher kommt das häufig vor, aber in 99% der Fälle ist das Verhalten das du oben gezeigt hast gewollt.

06.10.2007 - 11:50 Uhr

Du erstellst zwar immer eine neue Liste aber die zeigt weiterhin auf die selben Objekte wieder die alte Liste. Was du suchst ist das Verhalten eines Wertetyps (int, double,...). Dafür musst du "class Feld" umändern in "struct Feld". Besser wäre es aber zu überlegen ob du das Problem nicht anders lösen kannst.

05.10.2007 - 21:17 Uhr

Ich würde generell immer Klassen benutzen wenn man nicht unbedingt das Verhalten eines Wertetyps braucht.

05.10.2007 - 19:32 Uhr

Original von hobo
allerdings kann ich mir da ja auch nicht sicher sein, dass wirklich jeder Index in der List existiert

Warum nicht?


for(int i = 0; i < liste.Count; i++)
{
  if(liste[i] != null)
  {
    ...
  }
}

05.10.2007 - 18:52 Uhr

Die Fehlermeldung "mecker mecker" kannt ich noch garnicht 😁

Und wobei gibt er "Die Adresse oder Größe einer Variable eines verwalteten Typs kann nicht übernommen werden" an?

Hast du schon

public static extern bool C++Funktion([In, Out][MarshalAs(UnmanagedType.LPArray)]OSVERSIONINFO[] osvi);

versucht?

05.10.2007 - 17:45 Uhr

In deinem Code erledigt es das Framework, dass die Managed Objekte zuvor umkopiert werden (Vermutlich).

Schau dir mal den Edit in meinem Post über dir an.

//Edit: Pointer kannst du in diesem Fall eh nicht erstellen, wegen dem "String"
Dafür gibts aber auch ein schönes Konstrukt:


public unsafe struct OSVERSIONINFO
{
    public int dwOSVERSIONINFOSize;
    public int dwMajorVersion;
    public int dwMinorVersion;
    public int dwBuildNumber;
    public int dwPlatformId;
    public fixed char szCSDVersion[128];
}

In dem Fall würde das hier funktionieren:


fixed (OSVERSIONINFO* osp = &osves[0])

05.10.2007 - 17:34 Uhr

Das wird nicht funktionieren, weil der GC die Objekte im Speicher gerne mal selbstständig verschiebt. Außerdem bekommst du eine Exception wenn dein C++ Code versucht in Managed-Speicher zu schreiben.

Du kannst mal das versuchen:


public static extern bool C++Funktion([In, Out][MarshalAs(UnmanagedType.LPArray)]OSVERSIONINFO[] osvi);

05.10.2007 - 16:29 Uhr

Das Problem ist, dass man ein Array nicht so einfach "marshallen" kann.

Im Zweifelsfall würde ich es so machen:

int number = 2;
int size = Marshal.SizeOf(typeof(OSVERSIONINFO));
IntPtr address = Marshal.AllocHGlobal(number * size);
OSVERSIONINFO[] osves = new OSVERSIONINFO[number];
for (int i = 0; i < osves.Length; i++)
{
    osves[i] = new OSVERSIONINFO();
    IntPtr target = (IntPtr)((int)address + i * size);
    Marshal.StructureToPtr(osves[i], target, true);
}
//c++funktion(address);
for (int i = 0; i < osves.Length; i++)
{
    IntPtr target = (IntPtr)((int)address + i * size);
    Marshal.PtrToStructure(target, osves[i]);
}
Marshal.FreeHGlobal(address);
05.10.2007 - 16:03 Uhr

Es wäre sicher sinnvoll deinen C++ bzw. C# Code zu sehen.

Generell wird bei der Übergabe eines structs eine Kopie von selbigem erstellt und bei class nur ein Pointer übergeben.

05.10.2007 - 14:22 Uhr

Na wenns funktioniert kanns schon mal nicht schlecht sein 👍

Trotzdem hätte ichs, mit Bubblesort, so gemacht:

int[] zahlen = new int[10];
Random r = new Random();
for (int i = 0; i < zahlen.Length; i++)
{
    zahlen[i] = r.Next(500);
}
foreach (int zahl in zahlen)
{
    Console.Write("{0} ", zahl);
}
Console.WriteLine();
//Sortieren
for (int i = 0; i < zahlen.Length - 1; i++)
{
    if (zahlen[i] > zahlen[i + 1])
    {
        int temp = zahlen[i];
        zahlen[i] = zahlen[i + 1];
        zahlen[i + 1] = temp;
        if (i > 0)
            i -= 2;
    }
}
//Ende Sortieren
foreach (int zahl in zahlen)
{
    Console.Write("{0} ", zahl);
}
Console.ReadLine();
23.09.2007 - 18:52 Uhr

Hab hier seit Jahren eine MX310 und weil ich viel im Internet surfe könnt ich ohne die Vor- und Zurücktasten an den Seite nicht mehr leben 😁

Ich hab nur keine Ahnung welche ich mir kaufen soll wenn se mal kaputt geht X(

30.04.2007 - 18:59 Uhr

Ob Beta oder nicht, für den privaten Bereich ist ab jetzt C# 3.0 angesagt 😁