Teilen durch 0

  • VB.NET

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von Cistbesser.

    Teilen durch 0

    Hi,

    ich bekomme hier einen Fehler "Teilen durch 0". Es liegt wohl an der CInt() Funktion, allerdings weiß ich nicht, wie ich es sonst machen soll. Die Funktion soll folgendes machen:
    - Dateinamen aus Ordner lesen
    - Datum und Uhrzeit am Ende des Namens zu einer ganzen Zahl zusammenhängen
    - Maximale Zahl bestimmen
    Am Ende soll Datum und Uhrzeit wieder getrennt werden und im Ordner nach der Datei gesucht werden, die diesen Teil enthält. Das ist dazu da, die letzte gespeicherte Datei wieder zu öffnen.

    VB.NET-Quellcode

    1. Dim Ordnerinhalt As New List(Of String)
    2. Dim directory As New System.IO.DirectoryInfo(savePathDS)
    3. For Each datei As System.IO.FileInfo In directory.GetFiles
    4. If datei.Extension = ".xml" And datei.Name <> "000_formular_Start.xml" Then
    5. Ordnerinhalt.Add(datei.Name.ToString) 'Lese alle Dateinamen aus \konfig\
    6. End If
    7. Next
    8. Dim Dateien() As String = Ordnerinhalt.ToArray
    9. Dim Num(Dateien.Length) As Integer
    10. For i As Integer = 0 To Dateien.Length - 1
    11. Dim speicher As Integer
    12. Dateien(i) = Mid(Dateien(i), Dateien(i).Length - 16, 13) 'mmjjjj_ssmmss
    13. Dim aStr() As String = Dateien(i).Split("_") 'entferne _
    14. Dateien(i) = aStr(0) & aStr(1) 'mmjjjjssmmss
    15. speicher = CInt(Dateien(i))
    16. Num(i) = speicher
    17. Next
    Hi @Cistbesser

    VB.NET-Quellcode

    1. Dim Ordnerinhalt As New List(Of String)
    2. Dim directory As New System.IO.DirectoryInfo(savePathDS)
    3. Dim Num As List(Of Integer)
    4. For Each datei As System.IO.FileInfo In directory.GetFiles
    5. If datei.Extension = ".xml" AndAlso Not datei.Name = "000_formular_Start.xml" Then
    6. Ordnerinhalt.Add(datei.Name.ToString) 'Lese alle Dateinamen aus \konfig\
    7. End If
    8. Next
    9. For Each Datei In Ordnerinhalt.ToArray
    10. Dim speicher As Integer
    11. Datei = Datei.Substring(Datei.Length - 16, 13) 'mmjjjj_ssmmss
    12. Datei = Datei.Replace("_"c, "") 'entferne _ -> mmjjjjssmmss
    13. speicher = Convert.ToInt32(Datei)
    14. Num.Add(speicher)
    15. Next


    setzt dir mal nen Haltepunkt in Zeile 13 und 14 und schau dir an was genau in "Datei" drin steht.

    edit:

    Ich hab gerade noch mal nachgedacht:

    Aus 092012_150516.xml würde erst 092012_150516 würde 092012150516 das ist aber eigentlich keine "Zahl" im herkömmlichen Sinn. Was bezweckst du mit dem Speicehrn in "Num"
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Schamash“ ()

    Ich benutze Visual Studio Express 2010 und hab öfters den Bug, dass ich kein Überwachungsfenster angezeigt bekomme. Ist halt super wenn man mit Arrays arbeitet.
    Dein Code hat funktioniert, allerdings gefällt ihm Convert.ToInt32() nicht. Dafür ist die Zahl zu lang. Ich habs auf .ToInt64 geändert und jetzt kommt der gleiche Fehler wie vorher.
    Ich speicher den neuen Wert in Num(), da ich ja das Teilstück als String zerleg, zusammensetz und das dann als Integer haben möchte. Das schreibe ich in Num(), um mit der Funktion Num.max() das Maximum aus dem Array zu bekommen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Cistbesser“ ()

    @Cistbesser

    Dir ist aber schon bewusst das 30112014150612 größer ist wie 01122014150612

    Also die Datei von 30.Nov ist nummerisch größer wie die vom 1.Dezember.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Vielleicht eine kleine anregung:
    Dateien haben erstelldaten. Daten können nach größe sortiert werden. Wäre vielleicht einfacher darauf zurückzugreifen als diesen ganzen zerrlegemist, der zu mehr Fehlern führt als er löst.

    Zum Thema "Bug" in VB2010. Auch in 2010 kannst du dir den Inhalt einer Variablen per MousOver anschauen.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Der Vollständigkeit halber mal der Code zum Dateien sortieren. Element 0 enthält die älteste Datei.

    VB.NET-Quellcode

    1. Dim directory As New System.IO.DirectoryInfo(savePathDS)
    2. Dim Ordnerinhalt As New List(Of String)
    3. For Each datei As System.IO.FileInfo In directory.GetFiles
    4. If datei.Extension = ".xml" Then
    5. Ordnerinhalt.Add(datei.CreationTime.ToString)
    6. End If
    7. Next
    8. Ordnerinhalt.ToArray()
    9. Ordnerinhalt.Sort()

    Cistbesser schrieb:

    Element 0 enthält die älteste Datei.


    Das ist nicht ganz richtig. Es enthält das Erstelldatum der Datei. Auch hier hast du nur sortierte Strings und keine "Datumse".
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    soll ich fixnfertig vorsagen, oder soll ich sagen, was man wissen muss, ums selbst zu lösen?

    Also was man wissen muss, kann ich ja auf jeden Fall ablassen:
    1. den Begriff "Überladung" verstehen. List(Of T) hat nämlich mehrere Sort-Methoden.
    2. das Delegat-Konzept verstehen. Es gibt nämlich eine List(Of T).Sort-Methode, die einen Comparison(Of T) - Delegaten akzeptiert. Eine Comparison(Of T) ist ein Delegat, der weiß, wie man 2 T-Objekte vergleicht - hier müsste man also eine Comparison angeben, die das ErstellDatum zweier FileInfo-Objekte vergleicht
    3. VisualStudio richtig nutzen (Google ist nicht deine Mami) - dort wird auch der ObjectBrowser kurz vorgestellt, und damit sollte man die List(Of T)-Klasse gründlich studieren, um die Syntax der richtigen .Sort()-Überladung zu verstehen. Weiters ist dort gezeigt, wie der OB auch mitte MSDN verlinkt ist, für weitergehende Dokumentation (meist inklusive Codebeispiele)
    4. anonyme Methoden: der erwähnte Comparison-Delegat ist optimal als anonyme Methode zu formulieren, weil für sonen popeligen Vergleich muss man keine Extra-Methode anlegen

    So, nu versuchma - Die Lösung sollte nur eine oder maximal 2 Zeilen lang sein.
    Kannst auch nochmal nachfragen - ich tippe mal drauf, dass du bei Überladung und ObjectBrowser noch mitkommst, aber bei Delegat und anonyme Methode dann doch aussteigst.
    Aber das kann ich nicht wissen, daher klatsch ich dir das einfach vor, und du musst sagen, wo die Fahnenstange zuende ist.
    Auf jeden Fall geht garnix drumrum, diese Dinge zu erlernen, falls du vb.net programmieren können willst.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    @ErfinderDesRades
    Nicht vorsagen :) Ich versuche ihn ja auch ganz langsam zu richtigen Lösung zu schieben :)
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    Ruhig Blut :D
    Ich habs doch schon längst, und es funktioniert sogar 8-)
    Interessant ist jedoch, dass man vor dem laden des Datasets die Clear() aufrufen muss, ansonsten kommt eine ConstraintException.

    VB.NET-Quellcode

    1. Dim directory As New System.IO.DirectoryInfo(savePathDS)
    2. Dim Ordnerinhalt As New List(Of String)
    3. For Each datei As System.IO.FileInfo In directory.GetFiles
    4. If datei.Extension = ".xml" And datei.Name <> "000_formular_Start.xml" Then
    5. Ordnerinhalt.Add(datei.CreationTime.ToString)
    6. End If
    7. Next
    8. Ordnerinhalt.Sort()
    9. For Each datei As System.IO.FileInfo In directory.GetFiles
    10. If Ordnerinhalt.ToArray.Length = 0 Then
    11. MsgBox("Es befinden sich keine Dateien in diesem Ordner.", MsgBoxStyle.Exclamation Or vbOKOnly, "Hinweis")
    12. Else
    13. If datei.CreationTime.ToString = Ordnerinhalt(Ordnerinhalt.ToArray.Length - 1) Then
    14. Try
    15. Datas.Clear()
    16. Datas.ReadXml(datei.FullName)
    17. dnamesplit(datei.Name.ToString)
    18. Catch FnF As FileNotFoundException
    19. MsgBox("Datei nicht gefunden.", MsgBoxStyle.Exclamation Or vbOKOnly, "Fehler")
    20. End Try
    21. End If
    22. End If
    23. Next

    OK, jetzt hast du etwas das funktioniert :)

    Die Lösung könnte aber auch 1-2 Zeilen lang sein.
    There is no CLOUD - just other people's computers

    Q: Why do JAVA developers wear glasses?
    A: Because they can't C#

    Daily prayer:
    "Dear Lord, grand me the strength not to kill any stupid people today and please grant me the ability to punch them in the face over standard TCP/IP."
    also wenn ich den Code richtig verstehe, soll die Methode schlicht die neueste XML-Datei im angegebenen Ordner ins Dataset laden?
    Tipp: Poste immer ganze Methoden. Wenn die zu lang sind, deutet das eh auf eine schlechte Code-Aufteilung hin.
    Und wurde glaub schon gesagt: String-Vergleiche sind hier unangebracht, denn es sind Datumse, die du vergleichst.
    Willst du noch eine verbesserte Version, oder Nase voll?

    achso: zur Dataset-Wunderlichkeit: Dataset.ReadXml fügt die Datei den bestehenden Daten zu.
    Und das gibt logisch Constraint-Exceptions, denn dadurch passiert ja, dass Primär-Schlüssel, die ja nur einmalig vorkommen dürfen, mehrfach auftreten - peng!
    @Schamash
    Das Sortieren ist doch eine Zeile :D
    Das restliche Zeug ist ja nur zum Einlesen und Aufrufen

    @ErfinderDesRades
    Deine Zusammenfassung ist richtig. Mir geht's bei der Funktion nur darum, dass man nicht extra im Ordner wühlen muss, wenn man an der Datei vom Vortag bei Arbeitsende noch nicht fertig war. Im Prinzip ist die Funktion eigentlich überflüssig, ist halt einfach Luxus :D
    Ich schau mir gleich mal die Überladungen an, vll finde ich noch was.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Cistbesser“ ()

    VB.NET-Quellcode

    1. Private Sub LoadLastDataFile(ByVal SchichtplanPfad As String)
    2. Dim files As FileInfo() = New DirectoryInfo(SchichtplanPfad).GetFiles("*.xml")
    3. Dim newestDate = files.Max(Function(fi) fi.LastAccessTime)
    4. Dim file = files.First(Function(fi) fi.LastAccessTime = newestDate)
    5. Datas.Clear()
    6. Datas.ReadXml(file.FullName)
    7. End Sub

    Zum Verständnis brauchst du nun ein Verständnis von Extension-Methods.
    Denn .Max und .First sind keine FileInfo()-Methoden, sondern Extensions von IEnumerable(Of FileInfo)
    Die Extensions finden sich im ObjectBrowser an anderer Stelle - das findet man am einfachsten, indem man aus dem Editor hinspringt (Context-Menu "zu Definition gehen")

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „ErfinderDesRades“ ()