Deutsches Simutransforum

Normale Version: Absturz beim Abriss von hohen Hochspannungsleitungen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Simutrans-Version:
102 Nightly (2 März 2009 ?)

PAK-Set (+zusätzliche PAK-Dateien):
PAK128

Betriebssystem:
Linux


Fehler (möglichst genaue Beschreibung):
Situation (s. Anhang): Die gerade verlaufende Hochgeschwindigkeitstrasse mit 300 km/h Brücke über ein anderes Schienenpaar. In der Reihe direkt daneben eine Stromleitung, die bei der Überbrückung des zweiten Schienenpaares die hohen Masten (von Berg zu Berg) benutzt. Reiße ich die Strombrücke ab, stürzt Simutrans sofort mit einem Speicherzugriffsfehler ab. Reiße ich erst die Brücke der Hochgeschwindigkeitstrasse und danach die Strombrücke, ab ist alles in Butter. Ist reproduzierbar...

Verhalten (Absturz, Einfrieren, ...):
Absturz mit Speicherzugriffsfehler

Grüße,
Reinhard
Zitat:Original von schlupp
Simutrans-Version:
102 Nightly (2 März 2009 ?)

Also 1.) bei Nightlies ist immer ein Revisionsnummer dabei. Diese bitte generell auch immer mit angeben. (ich schätze mal r2355 in diesem Fall?) Aber:

Und 2.) da Nightlies ja (sofern neuer Quellcode vorhanden ist) jede Nacht neu erstellt werden, wäre es schon sinnvoll das selber noch mal mit einer aktuellen Version zu testen. März ist über ein halbes Jahr her... und seit dem hat es weit über 400(!) Änderungen im Code (Neuerungen und behobene Bugs) gegeben... Und seit gestern ist übrigens auch eine neue Release-Version draußen (102.2).

Wenn das Problem damit immer noch auftritt kannst Du Dich gerne noch mal melden.
Zitat:Original von DirrrtyDirk
Zitat:Original von schlupp
Simutrans-Version:
102 Nightly (2 März 2009 ?)

Also 1.) bei Nightlies ist immer ein Revisionsnummer dabei. Diese bitte generell auch immer mit angeben. (ich schätze mal r2355 in diesem Fall?)
Die offizielle 102 hat im Fenstertitel das Nightly stehen.

@schlupp:
Wie geschrieben: einfach mal die 102.2 probieren ob der Fehler dann immer noch auftritt.
Hmm, die Revisionsnummer habe ich in Simutrans selber nicht gefunden?

Aber ich habe mir inzwischen wegen der Bushaltestellen die neue Version 102.2 installiert (allerdings noch mit dem 128er Pakset von Version 102.0 - das neue scheint es noch nicht zu geben?). Der Fehler tritt immer noch auf.
Zitat:Original von jonasbb
Die offizielle 102 hat im Fenstertitel das Nightly stehen.

*Nachseh* also meine nicht... - aber egal, die gab's doch eh erst Ende März, oder? (Forenankündigung ist vom 29.03.)

---------------------

EDIT:

Zitat:Original von schlupp
Hmm, die Revisionsnummer habe ich in Simutrans selber nicht gefunden?
Also die Revisionsnummer müsste oben im Rahmen des Fensters stehen. (Bei der aktuellen Nightly z.B. "Simutrans 102.2-2786").

Zitat:Original von schlupp
Aber ich habe mir inzwischen wegen der Bushaltestellen die neue Version 102.2 installiert (allerdings noch mit dem 128er Pakset von Version 102.0 - das neue scheint es noch nicht zu geben?). Der Fehler tritt immer noch auf.
Eine neue Version ist auch nicht immer unbedingt erforderlich - je nachdem was sich im Programm ändert. Allerdings gibt es auch vom pak128 Nightly Versionen (obwohl diese nur wöchentlich erzeugt werden).
Zitat:Original von DirrrtyDirk
Zitat:Original von jonasbb
Die offizielle 102 hat im Fenstertitel das Nightly stehen.

*Nachseh* also meine nicht... - aber egal, die gab's doch eh erst Ende März, oder? (Forenankündigung ist vom 29.03.)
Zitat:Release of 102.0 (r2366)
5-Mar-2009:

Die erste 102 auf SF ist auch vom 5. März. (Windows) Alle anderen auch erst vom 29.
Ah hab sogar noch die zip-Datei... komisch die .exe darin ist allerdings vom 06.03. Big Grin Wer hat noch ein Datum zu bieten?

Aber egal, selbst wenn die vom 05.03. war - er schrieb was vom 02.03. also kann es doch nicht die 102.0 release sein, oder?

The Transporter

Die aktuellste Version vom pak128 gibt es hier, es ist aber eine Nightly Version.
Ich kann den Absturz reproduzieren mit ST 102.2 und Pak128 V1.4.5 (auf Windows, SDL):

Message: karte_t::interactive_event(): Keyboard event with code 114 'r'
Message: karte_t::interactive_event(): Keyboard event with code 0 '?'
Message: karte_t::interactive_event(event_t &ev): calling a tool
Message: wkz_remover(): at 42,52
Message: wkz_remover_intern(): at (42,52,-1)
Message: grund_t::weg_entfernen(): this 04CE7FBC
Message: grund_t::weg_entfernen(): weg 04518E58
Message: grund_t::weg_entfernen(): this 04CE7F8C
Message: grund_t::weg_entfernen(): weg 045D6650

simutrans_SDL.e caused an Access Violation at location 00404dcc in module simutrans_SDL.exe Reading from location 00000000.

Das sagt ja nicht viel aus...
Hier ist ein Fix für den Bug:
Code:
Index: simwerkz.cc
===================================================================
--- simwerkz.cc    (revision 2795)
+++ simwerkz.cc    (working copy)
@@ -407,7 +407,7 @@
            msg = brueckenbauer_t::remove(welt, sp, gr->get_pos(), powerline_wt );
            return msg == NULL;
        }
-        else {
+        else if( !gr->ist_bruecke() ){
            lt->entferne(sp);
            delete lt;
            return true;
Index: bauer/brueckenbauer.cc
===================================================================
--- bauer/brueckenbauer.cc    (revision 2795)
+++ bauer/brueckenbauer.cc    (working copy)
@@ -612,8 +612,10 @@
        // search neighbors
        for(int r = 0; r < 4; r++) {
            if(  (zv == koord::invalid  ||  zv == koord::nsow[r])  &&  from->get_neighbour(to, delete_wegtyp, koord::nsow[r])  &&  !marker.ist_markiert(to)  &&  to->ist_bruecke()  ) {
-                tmp_list.insert(to->get_pos());
-                marker.markiere(to);
+                if(  wegtyp != powerline_wt  ||  to->find<bruecke_t>()->get_besch()->get_waytype() == powerline_wt  ) {
+                    tmp_list.insert(to->get_pos());
+                    marker.markiere(to);
+                }
            }
        }
    } while (!tmp_list.empty());
@@ -657,7 +659,6 @@

        grund_t *gr = welt->lookup(pos);
        if(wegtyp==powerline_wt) {
-            gr->get_leitung()->calc_bild();
            ding_t *br;
            while ((br = gr->find<bruecke_t>()) != 0) {
                br->entferne(sp);
@@ -700,6 +701,10 @@
        grund_t *gr_new = new boden_t(welt, pos, gr->get_grund_hang());
        gr_new->take_obj_from( gr );
        welt->access(pos.get_2d())->kartenboden_setzen(gr_new );
+
+        if(  wegtyp == powerline_wt  ) {
+            gr_new->get_leitung()->calc_neighbourhood(); // Recalc the image. calc_bild() doesn't do the right job...
+        }
    }

    welt->set_dirty();

Es werden noch 2 weitere Bugs gefixt:
- Die Grafik der Leitung am Brückenende wird nach dem Löschen einer Brücke korrekt angezeigt.
- Man kann keine Leitungen auf Leitungsbrücken direkt löschen.