C# Zwei Buchstaben miteinander vergleichen

eightcore

Lt. Commander
Registriert
Juli 2008
Beiträge
1.648
Guten Tag.
Ich bin kurz vor dem Durchdrehen. Ich will je einen Buchstabem aus zwei Strings mit einander vergleichen.

unbenannt8dnu.jpg



Wenn ich das Programm dann ausführe, etwas in die Textbox schreibe und auf den Button klicke, meldet Visual Studio, dass IndexOutOfRangeException nicht behandelt wurde.
Der Index war ausserhalb des Arraybereichs.


Was läuft hier?


MfG | eightcore
 
Zuletzt bearbeitet:
sLetters wird nur in OnLoad zugewiesen, allerdings gibst du den Text doch erst nach dem Laden der Form ein oder? Das gehört in das OnClick-Event vom Button.

Beschäftige dich aber mal bitte mit lokalen Variablen und Membern. Sieht irgendwie sehr sehr konfus aus.
 
/* nicht mehr relevant */

P.S.: Probiere doch pastebin.com aus. Die Lesbarkeit wird dadurch , meiner Ansicht, verbessert.
Gruß
 
sLetters ist einfach leer.
Des Weiteren weist du auch sLetters ein "" aus der Textbox direkt beim Laden zu. Nachher passiert da einfach nichts an Zuweisungen.
Dann bekommst du als Length entweder 0 oder -1 und weil sLetters leer ist, ist es halt ein OutOfRange.
 
r34ln00b schrieb:
Probiere doch pastebin.com aus. Die Lesbarkeit wird dadurch , meiner Ansicht, verbessert.
Oder man nutzt einfach Code-Tags. ;) [CODE][/CODE] bzw. [PHP][/PHP]
 
Yuuri schrieb:
sLetters wird nur in OnLoad zugewiesen, allerdings gibst du den Text doch erst nach dem Laden der Form ein oder? Das gehört in das OnClick-Event vom Button.

Beschäftige dich aber mal bitte mit lokalen Variablen und Membern. Sieht irgendwie sehr sehr konfus aus.

Das ist jetzt nicht wichtig, ich habe mit diesem Programm nicht das Ziel, es danach zu verwenden, ich erarbeite darin nur ein Teilcode für ein anderes Programm.
 
Zuletzt bearbeitet:
Hi,

noch ein Tipp: "=" ist nicht das gleiche wie "Equals", gerade bei strings (Groß- und Kleinschreibung) kann man da leicht durcheinander kommen. Lies dir das mal durch, ich weiß ja nicht genau, wofür du den Vergleich brauchst :)

Ansonsten: Yuuri hat recht :)

VG,
Mad
 
Du verwendest zu viele Semikolons. Das Semikolon am Ende der for-Schleife ist eine so genannte leere Anweisung und sorgt dafür, dass die for-Schleife dort auch bereits beendet ist. Der darauf folgende { Block } wird genau einmal ausgeführt und zwar immer, unabhängig von der for-Schleife. Das Gleiche gilt für die nachfolgende if-Abfrage. Buchstaben vergleicht man einfach zeichenweise:

if (sLetters[x] == sABC[x]) {
}
 
sLetters und sABC werden beide über [x] addressiert, also sobald mehr als 26 Zeichen in der Eingabebox sind = IndexOutOfRangeException ..

Das .ToString() kannst Du Dir sparen, nimm stattdessen char für sActualLetter und sActualAlphabetLetter und vergleiche mit "==".
 
Hi,

ist es egal ob die Eingabe komplett upper/lower case ist oder muss das berücksichtig werden? Also die Schreibweise oder ist nur interessant ob es die gleiche Reihenfolge der Buchstaben (Eingabewerte) ist?

Weil wenn es nur darum geht, was eingegeben wurde und ob der eingegebene Wert (ohne Berücksichtigung der Schreibweise (cases)) dann würde ich sagen guck dir mal folgendes an:

String.Compare(string_1, string_2, StringComparison.InvariantCultureIgnoreCase)
...guck dir mal die Überladungen an. ;)

Ansonsten vergleiche wirklich je char wie lynxx schon sagte.


... ich hoffe, ich hab richtig verstanden was du erreichen möchtest.
 
Zuletzt bearbeitet:
lynxx schrieb:
sLetters und sABC werden beide über [x] addressiert, also sobald mehr als 26 Zeichen in der Eingabebox sind = IndexOutOfRangeException ..

Die gibts auch schon bei einem oder zwei Zeichen (natürlich auch bei mehr).

Ich Versuchs mal mit Char.

HaGGi.13 schrieb:
Hi,

ist es egal ob die Eingabe komplett upper/lower case ist oder muss das berücksichtig werden? Also die Schreibweise oder ist nur interessant ob es die gleiche Reihenfolge der Buchstaben (Eingabewerte) ist?

Weil wenn es nur darum geht, was eingegeben wurde und ob der eingegebene Wert (ohne Berücksichtigung der Schreibweise (cases)) dann würde ich sagen guck dir mal folgendes an:

String.Compare(string_1, string_2, StringComparison.InvariantCultureIgnoreCase)
...guck dir mal die Überladungen an. ;)

Ansonsten vergleiche wirklich je char wie lynxx schon sagte.


... ich hoffe, ich hab richtig verstanden was du erreichen möchtest.


Im späteren Programm, wo dies dann vorkommt, wird der Inhalt der Textbox zu Grossbuchstaben gewandelt und einer Variable zugeteilt.

Ich fange mal von vorne an:

beim eigentlichen Programm handelt es sich um ein kleines Tool, mit dem man die automatische Wiedergabe einzelner Laufwerke ausschalten kann. Es erstellt also eigentlich nur ein Registryschlüssel, der richtige Registry-Wert zu schreiben ist aber nicht ganz einfach.


unbenannt2lua.jpg


In diesem fall wird AutoPlay für die Laufwerke Z, P und C deaktiviert (dort wo eine 1 ist).

Der entstandene Binär-Code muss man nun in Dezimalcode umwandeln und den in die Registry eintragen.
 
Zuletzt bearbeitet:
Nun, wo du den Zweck des Ganzen verraten hast, klingt das alles sehr kompliziert für eine so einfache Sache. Wozu einen String mit allen Laufwerksbuchstaben eingeben lassen, viel zu Fehleranfällig. Besser mit Buttons oder Checkboxen machen, in Windows Forms gibts doch auch ne Listbox mit CheckedListBoxItems. Darüber dann einfach den Binärwert ändern, die Umwandlung in Hex sollte kein Problem sein.
 
WingX schrieb:
Nun, wo du den Zweck des Ganzen verraten hast, klingt das alles sehr kompliziert für eine so einfache Sache. Wozu einen String mit allen Laufwerksbuchstaben eingeben lassen, viel zu Fehleranfällig. Besser mit Buttons oder Checkboxen machen, in Windows Forms gibts doch auch ne Listbox mit CheckedListBoxItems. Darüber dann einfach den Binärwert ändern, die Umwandlung in Hex sollte kein Problem sein.

Das würde ich machen, wenn das Programm ausschliesslich zu Nutzungszwecken programmiert würde, allerdings dient es auch dazu, meine Programmier-Kenntnisse zu fördern, weshalb ich mich mit dem einfachsten Weg nicht zufrieden gebe.

Ich habe den funktionierenden Code, der aus einem einzelnen Laufwerksbuchstaben den richtigen Registry-Wert erstellen kann.

Code:
private int GenerateValue()
        {
                string sInput = "d";
                string sABC = "zyxwvutsrqponmlkjihgfedcba";
                int iABCLength = sABC.Length;

                int iIndexOf = sABC.IndexOf(sInput);
                int iRest = iABCLength - iIndexOf - 1;
                string sBin = "1";
                for (int y = 0; y < iRest; y++)
                {
                    sBin += "0";
                }
                MessageBox.Show(sBin);

Nun, in der Realität wird aber sInput mehr als einen Buchstaben beinhalten.
Das heisst, die einfachste Möglichkeit wäre es, diesen Code für jeden einzelnen Buchstaben von sInput durchlaufen zulassen, allerdings bräuchte das dann eine Menge Variablen, da man die einzelnen Binär-Werte am Schluss addieren müsste.

Die zweite und von mir bevorzugte Möglichkeit wäre es, den Code so abzuändern, dass sBin von mehreren Buchstaben beeinflusst werden könnte.


Leider habe ich etwas zu wenig Programmierwissen, um mich diesem Problem selber zu stellen.
Habs stundenlang versucht.
 
Hi,

nur noch eine kurze Anmerkung:

Das würde ich machen, wenn das Programm ausschliesslich zu Nutzungszwecken programmiert würde, allerdings dient es auch dazu, meine Programmier-Kenntnisse zu fördern, weshalb ich mich mit dem einfachsten Weg nicht zufrieden gebe.

Der einfachste (und damit idR schnellste) Weg ist in der Realität aber meist der einzige, den der Kunde am Ende bereit ist zu zahlen. Du bestellst ja auch keinen Porträtmaler, um dein Zimmer zu streichen oder?

Benutze einfachen, klaren, simplen Code. Eine Sache zu verkomplizieren bringt dich vielleicht mit mehr programmiertechnischen Rafinessen in Verbindung, aber eine Doktorarbeit aus einem einfachen Registry-Eintrag-Änderer zu machen ist übertrieben und realitätsfremd.

Schließe dein einfaches Projekt mit einfachen Mitteln ab und suche dir ein neues, in dem du komplexere Thematiken wirklich brauchst! Das bringt dir sicherlich mehr und ist vor allem realitätsnah! :)

Viel Erfolg noch bei der Programmierung!

VG,
Mad
 
So sollte es gehen:
Code:
        private int f(string input)
        {
            int res = 0;
            foreach (var x in input.ToLower())
            {
                res = res | (1 << (x - 'a'));

            }
            return res;
        }
'f' nimmt den Input-String mit den Laufwerken und liefert dir direkt den Dezimal-Wert für die Registry.
 
Madman1209 schrieb:
Hi,

nur noch eine kurze Anmerkung:



Der einfachste (und damit idR schnellste) Weg ist in der Realität aber meist der einzige, den der Kunde am Ende bereit ist zu zahlen. Du bestellst ja auch keinen Porträtmaler, um dein Zimmer zu streichen oder?

Benutze einfachen, klaren, simplen Code. Eine Sache zu verkomplizieren bringt dich vielleicht mit mehr programmiertechnischen Rafinessen in Verbindung, aber eine Doktorarbeit aus einem einfachen Registry-Eintrag-Änderer zu machen ist übertrieben und realitätsfremd.

Schließe dein einfaches Projekt mit einfachen Mitteln ab und suche dir ein neues, in dem du komplexere Thematiken wirklich brauchst! Das bringt dir sicherlich mehr und ist vor allem realitätsnah! :)

Viel Erfolg noch bei der Programmierung!

VG,
Mad

Ich will, dass die Laufwerkbuchstabenauswahl per Tastatur erfolgt. Das Tool soll komplett mit der Tastatur bedient werden können. Ich mag dieses Herumgeklicke nicht.

Wenn ein Programm fertig ist, interessiert den Kunden nicht, ob der einfachste oder der komplizierteste Weg gewählt wurde, da er gar nicht wissen kann, von welchem Weg Gebrauch genommen worden ist. Entscheidend ist, ob eine Marktlücke und ein Bedürfnis besteht, ob die Geschwindigkeit und Bedienung befriedigend ist und ob es seinen Zweck erfüllt.

Aber diese Kundengeschichte hat überhaupt nichts mit meinem Tool zu tun!

Und ich habe nicht gefragt, ob ich das Problem mit Check- oder Textboxen lösen soll, sondern WIE ich es mit Textboxen lösen kann.




Der Lösungsvorschlagt von cx01 bringt mir eine NullReferenceException.
 
eightcore schrieb:
Der Lösungsvorschlagt von cx01 bringt mir eine NullReferenceException.

Seltsam, hier klappt es. Was hast du denn als Input genommen? Wenn ich z.B. f("ABC") aufrufe, liefert er 7 zurück.
 
eightcore schrieb:
Ich will, dass die Laufwerkbuchstabenauswahl per Tastatur erfolgt. Das Tool soll komplett mit der Tastatur bedient werden können. Ich mag dieses Herumgeklicke nicht.
Das funktioniert auch mit Checkboxen, sogar komfortabler. Du musst nur jeweils ein & vor den Buchstaben setzen, dann wird automatisch beim Drücken von ALT + Buchstabe die Checkbox mit &Buchstabe (de)aktiviert.
 
Hi,

Wenn ein Programm fertig ist, interessiert den Kunden nicht, ob der einfachste oder der komplizierteste Weg gewählt wurde, da er gar nicht wissen kann, von welchem Weg Gebrauch genommen worden ist. Entscheidend ist, ob eine Marktlücke und ein Bedürfnis besteht, ob die Geschwindigkeit und Bedienung befriedigend ist und ob es seinen Zweck erfüllt.

der Kunde "weiß" es nicht exakt, aber ein Pflichten-/Lastenheft mit expliziter Beschreibung ist nicht unüblich - und wenn deine Konkurrenz nur die Hälfte der Zeit braucht (was idR die Hälfte der kosten verursacht) und die gleichguten Ergebnisse liefert... für wen entscheidet sich dein Kunde dann? ;)

Entscheidend ist [...] ob [...] die Bedienung befriedigend ist.

Ich mag dieses Herumgeklicke nicht.

Finde ich ein wenig widersprüchlich - aber das ist eben deine Meinung.

Das war auch überhaupt nicht böse gemeint, ich finde lediglich, das Projekt kannst du mit einfachsten Mitteln umsetzen und es macht wenig Sinn, diese zu verkomplizieren. Es gibt sicher noch genug andere Projekte, die sich vortrefflich eignen, um tiefer in die Programmierung zu gehen - gerade WPF mit verschiedenen Design-Patterns (z.B. MVVM) seien dir da wärmstens ans Herz gelegt.

Das sind nur Empfehlungen, was du dann am Ende machst ist dein Bier. Ich wollte nur andeuten: Zum Spaß ist das Projekt ok, aber man sollte einfach nicht in die falsche Richtung denken. Der beste Programmierer bringt nichts, wenn er nicht in aktzeptabler Zeit das gleiche Ziel erreicht (alles schon erlebt: hoch begabt, sehr talentiert, vollkommen am Kunden und der Zeit vorbei). Wenn du allerdings nicht nur zum Spaß programmieren willst und dir vorstellen kannst das auch mal beruflich zu machen solltest du dir einfach andere Vorgehensweisen zu Gemüte führen. Das ist nur ein gut gemeinter Rat :)

Wie gesagt: nicht falsch verstehen, ich mein's dir nur gut und hab auch schon ein wenig Programmiererfahrung! :) ;)

VG,
Mad
 
cx01 schrieb:
Seltsam, hier klappt es. Was hast du denn als Input genommen? Wenn ich z.B. f("ABC") aufrufe, liefert er 7 zurück.

Nun klappts bei mir auch. Fälschlicherweise wurde die Funktion gleich beim Laden des Forms ausgeführt.


Tausend Dank!!!!!

Was mich aber interessieren würde, ist, was der Code von cx01 macht...
 
Zurück
Oben