mikrocontroller.net

Forum: PC-Programmierung Ausprobieren ob ID im Array Gültig ist


Autor: baer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich bin gerade am lernen von C#...

ich habe mir ein Array erstellt, in welchen Informationen stehen über 
die Konsole kann ich mit einer ID einfach eine Position raussuchen 
anschließend werden mir dann die Informationen angezeigt.

jetzt habe ich ein Array mit 50 Feldern...

wenn ich jetzt -1 oder 50 eingebe kommt natürlich eine Exception...

ich habe es mit try & catch versucht, allerdings fehlt mir da der 
richtige Ansatz...
<- ich möchte nicht das Array zurück geben sondern erstmal nur die ID
            bool isID = false;
            int inputID = 0;

            do
            {
                try
                {
                    inputID = Convert.ToInt32(Console.ReadLine());
                    if( myArray[inputID -1].id >= 0)
                        isID = true;
                }
                catch (FormatException)
                {
                    Console.WriteLine("dies war keine gültige ID! Bitte erneut eine Zahl zwischen {0} und {1} eingeben.", 1, myArray.Length);
                    isID = false;
                }
            } while (!isID);
            return inputID -1;

hat jemand eine gute Idee für mich

Vielen Dank

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
            bool isID = false;
            int inputID = 0;

            do
            {
                inputID = Convert.ToInt32(Console.ReadLine());
                if ((inputID > 0) && (inputID < myArray.Length){
                    if( myArray[inputID -1].id >= 0)
                        isID = true;
                }
                else
                {
                    Console.WriteLine("dies war keine gültige ID! Bitte erneut eine Zahl zwischen {0} und {1} eingeben.", 1, myArray.Length);
                }
            } while (!isID);
            return inputID-1;

Autor: Rufus Τ. F. (rufus) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
STK500-Besitzer schrieb:
> if ((inputID > 0) && (inputID < myArray.Length){

Da fehlt eine Klammer und obendrein sollte der zweite Vergleich statt < 
<= verwenden, sonst wird das letzte Arrayelement unterschlagen.

Autor: c-hater (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
baer schrieb:

> ich habe mir ein Array erstellt, in welchen Informationen stehen über
> die Konsole kann ich mit einer ID einfach eine Position raussuchen
> anschließend werden mir dann die Informationen angezeigt.

Nein. Was du meinst, ist keine "ID", sondern schlicht und einfach ein 
Array-Offset.

> jetzt habe ich ein Array mit 50 Feldern...
>
> wenn ich jetzt -1 oder 50 eingebe kommt natürlich eine Exception...

Weil halt der Offset ausserhalb des gültigen Bereichs ist. Das sollte 
nie passieren, wenn man korrekten Code programmiert hat. Du hast Glück, 
dass "managed code" wie der von C# produzierte Arrayzugriffe 
diesbezüglich überwacht und die Exception wirft, anstatt wild in 
irgendwelchem Speicher rumzuschreiben, der überhaupt nicht zum Array 
gehört.

> ich habe es mit try & catch versucht, allerdings fehlt mir da der
> richtige Ansatz...

Mit try & catch kann man das zwar durchaus lösen, ist aber nicht gerade 
optimal. Sowas macht man sinnvollerweise nur, wenn es wirklich keine 
andere Möglichkeit gibt, einen potentiellen Fehler vorbeugend zu 
erkennen. Die gibt es aber hier:

Der Bereich der zulässigen Offsets für ein Array fängt in C# immer beim 
Offset 0 an und hört bei der Länge des Arrays - 1 auf.

Auf die Länge des Arrays kann man über die Eigenschaft "Length" 
zugreifen. Wirklich wenig überraschend...

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Rufus Τ. F. schrieb:
> Da fehlt eine Klammer und obendrein sollte der zweite Vergleich statt <
> <= verwenden, sonst wird das letzte Arrayelement unterschlagen.

ADHS... ;)

c-hater schrieb:
> Der Bereich der zulässigen Offsets für ein Array fängt in C# immer beim
> Offset 0 an und hört bei der Länge des Arrays - 1 auf.

Es geht aber darum, dass der Bediener etwas eingibt, das ihm geläufig 
ist.
Wenn man etwas für Benutzer, die keinen näheren technischen Bezug haben, 
programmiert, ist es für die einfacher wenn man ab 1 indiziert.
Wie man das intern verarbeitet, ist was anderes, solange es sauber 
funktioniert.

Autor: Lutz (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
if ((inputID < 0) || (inputID > (myArray.Length-1)))
  Console.WriteLine("dies war keine gültige ID!...
try & catch sollte wirklich nur für die unerwarteten/unwahrscheinlichen 
Sachen genutzt werden, da zu Aufwändig.

Autor: STK500-Besitzer (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Lutz schrieb:
 if ((inputID < 0) || (inputID > (myArray.Length-1)))
  Console.WriteLine("dies war keine gültige ID!...

das müsste dann aber
 if ((inputID < 1) || (inputID > (myArray.Length-1)))

heissen...

Autor: bluppdidupp (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>inputID = Convert.ToInt32(Console.ReadLine());
...man kann statt Convert.ToInt32() auch Int32.TryParse() nutzen, wenn 
man davon ausgehen kann, dass da schonmal kein Int32 eingegeben wird.
Ich persönlich setze bei sowas auch immer noch zusätzlich String.Trim() 
ein: Wenn mal die Zwischenablage involviert ist, passiert es recht 
schnell, dass der Benutzer mal irgendwelche Leerzeichen oder ähnliches 
mit kopiert hat.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.