German Anfängerproblem mit List/Liste

KL7000F

Member
Licensed User
Longtime User
Hallo,

ich habe derzeit meine Schwierigkeiten mit einer List/Liste. In regelmäßigem Abstand sollen dort Werte "zwischengespeichert" werden. Bei Programmende wird dies in eine Datei gespeichert. Generell funktioniert die ganze Geschichte, nur leider wird beim Auslesen x-mal (so oft wie auch in die Liste gespeichert wird) nur der letzte eingespeicherte Wert ausgelesen. Obwohl ich dies mit einer For-Schleife, wie in der Wiki bzw. in Forenbeispielen gefunden, auslese. Mit ListenName.Add(wp) wird der Wert doch am Ende der Liste hinzugefügt?

Folgend die entsprechenden Codestücke:

B4X:
Sub Process_Globals
    Type WegpunktPumpen(Lat As String, Lon As String, Name As String, Hoehen As Int)
    Dim WegpunktPumpe As List
    Dim wp, wp1 As WegpunktPumpen
End Sub

B4X:
Sub Activity_Create(FirstTime As Boolean)

...

    WegpunktPumpe.Initialize

...

End Sub

B4X:
Sub Eintrag

...

If  xyz > zzx Then
        wp.Lat = Location1.Latitude
        wp.Lon = Location1.Longitude
        wp.Hoehen = Location1.Altitude
        wp.Name = "Wegpunkt"
        WegpunktPumpe.Add(wp)
End If

...

End Sub

B4X:
Sub GPXSchreiben

...

    For i = 0 To WegpunktPumpe.Size - 1
        wp1 = WegpunktPumpe.Get(i)
       
        Writer.WriteLine(TAB & "<wpt lat=" & Chr(34) & wp1.Lat & Chr(34) & " lon=" & Chr(34) & wp1.Lon & Chr(34) & ">")
        Writer.WriteLine(TAB & TAB & "<name>" & wp1.Name & "</name>")
        Writer.WriteLine(TAB & TAB & "<ele>" & wp1.Hoehen & "</ele>")
        Writer.WriteLine(TAB & "</wpt>")
    Next

...

End Sub

Hat jemand eine Idee wo der Haken ist?

Vielen Dank und ein gutes neues Jahr :)
Gruß
Andy
 

DonManfred

Expert
Licensed User
Longtime User
du schreibst der liest immer das gleiche. Postest aber nicht den Code der ausliest. Du postest auch keine LOG-Ausschnitte von LOG-Ausgaben die Du bei lesen und schreiben erstellt hast.
Du solltest erstmal prüfen (log-Ausgaben einbauen an allen wichtigen Stellen) ob der Code der die Datei schreibt (sieht mir nach ner XML-Datei aus) auch wirklich das tut was er soll. Also ob wirklich verschiedene Einträge geschrieben werden.

Nur auf die Schnipsel schauend sieht der Code jedoch ok aus.

Evtl. kann man Dir besser helfen wenn du dein Projekt als ZIP exportierst und DAS hier postest. Mit code-schnipseln kann man oft Fehler nicht sehen die woanders im Code verankert sind.

Wird
B4X:
 WegpunktPumpe.Add(wp)
überhaupt ausgeführt? (LOG-Ausgaben einbauen)

Wenn nicht dann stimmt doch vermutlich an "If xyz > zzx Then" was nicht!?
 

KL7000F

Member
Licensed User
Longtime User
Logs habe ich eingebaut, diese bestätigen meinen ersten Post. Helfen mir aber derzeit nicht viel weiter bei der Problemlösung. Der "letzte" Code in meinem ersten Beitrag zeigt den Schnipsel vom Auslesen. Ich habe mal das Export-Zip angehängt, ebenso die Log und die dazugehörige Datei (*.gpx, hier als *.txt angehängt, da *.gpx nicht akzeptiert wurde), welche von der App erstellt wird.

Gruß
Andy
 

Attachments

  • log_b4a.txt
    7.4 KB · Views: 331
  • WaFoeGPS_2014_01_01_00.txt
    2.1 KB · Views: 333
  • WaFoeGPS_0.5_Beta.zip
    78.9 KB · Views: 320

DonManfred

Expert
Licensed User
Longtime User
Der "letzte" Code in meinem ersten Beitrag zeigt den Schnipsel vom Auslesen.

Falsch. Writer.WriteLine sieht mir eher nach SCHREIBEN als nach LESEN aus ;-)


Nach den ersten Einblick in die Textdateien sieht es für mich so aus als wäre das Problem scheinbar in der Routine die diese GPX-Datei erstellt/schreibt... HIER stehen überall die gleichen LAT/LON-Werte. Wenn hier überall das gleiche steht kann beim auslesen ja auch nichts anders bei rumkommen...

Ich schätze dein Problem liegt darin das du in GPS_LocationChanged immer wieder die EINMAL geDIMte wp benutzt und das in die Liste packst. Du packst also quasi x kopien von ihr in die Liste.

Durch das anhängen an die Liste wird zwar ein neuer Eingetragen. Es ist jedoch nur eine Referenz auf die eigentliche Variable "wp". Ändert sich dann etwas in wp dann werden auch alle Referenzen zu wp geändert. Das wird das Problem hier sein schätze ich.

Neuer Ansatz: bitte ändere deine Routine wie hier (das ist ein Teil der GPS_LocationChanged)

B4X:
BerechneNeueStrecke
Entf1 = Entf

Dim wptemp As WegpunktPumpen  ' Ab hier änderungen... Anlegen einer neuen Instanz des Typs.
wptemp.Initialize
'Array füllen "WegpunktPumpe" mit Wegpunkten
wptemp.Lat = Location1.Latitude
wptemp.Lon = Location1.Longitude
wptemp.Hoehen = Location1.Altitude
wptemp.Name = "Wegpunkt"
WegpunktPumpe.Add(wptemp) ' Und nun in die Liste schreiben. Allerdings ist das nun jedesmal eine neue Version von dem speziellen Typ weil es in jedem Durchlauf neu geDIMt wird
 
Log("WegpunktPumpe: " & WegpunktPumpe.Get(WegpunktPumpe.IndexOf(wptemp)))
 
Last edited:

KL7000F

Member
Licensed User
Longtime User
Falsch. Writer.WriteLine sieht mir eher nach SCHREIBEN als nach LESEN aus ;-)
Ich glaube wir haben aneinander vorbeigeredet :) Ich dachte an das "Auslesen" aus der Liste ;) Sprich dem Schreiben der Datei. Aber lassen wir das ;)

Den Code werde ich mal so ändern, testen und mit einem hoffentlich positiven Ergebnis melden (siehe Edit). Ich ging davon aus, dass beim Schreiben in die List der "alte" (zuvor eingetragene) Wert überschrieben wird (ähnlich wie bei einem String).

Edit:

Code getestet und hat funktioniert :) Mir ist eh noch aufgefallen dass "wp" nicht initialisiert wurde... Habe jetzt "wp" und "wp1" jeweils erst unmittelbar vor der Nutzung mit DIM erstellt und initialisiert.
Da die App in der Regel "nur" sporadisch vorübergehend verwendet wird, denke ich nicht das es "schlimm" ist dies so zu lösen. Oder macht sich sowas im Speicherverbrauch zur Laufzeit bemerkbar? Mir ist bislang zumindest nichts aufgefallen.

Vielen Dank derweil für deine Hilfe! :)

Gruß
Andy
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
Würdest Du in der Liste einen String namens wp (Variable) jeweils mit Add hinzufügen so würdest Du auch hier jeweils nur eine Referenz in die Liste packen. Würde man den Originalstring ändern würden sich auch hier alle kopien verändern. Stichwort "Vererbung"

Ich denke Android bzw. Java) wird sich schon um die Entsorgung von nicht mehr benötigten Resourcen kümmern. Ich glaube das muss man "in diesem Projekt" nicht gross beachten.

Anmerkung: Nette App btw... Wird für EUREN Fall sicher eine Hilfe sein! *schulter klopf" ;-)
 

KL7000F

Member
Licensed User
Longtime User
Ich hoffe doch dass es der ein oder anderen Feuerwehr eine Hilfe ist ;-) Danke für die Lohrbeeren!

Jetzt folgt erstmal eine Änderung der einzelnen Wegpunkte zu einem Track...nachdem das Schreiben und Lesen nun klappt.

Auf jeden Fall nochmal Danke für deine Hilfe!

Gruß
Andy
 
Top