JavaScript Bitburner-Javascript erzeugt Laufzeitfehler

frazzlerunning

Commander
Registriert
März 2017
Beiträge
2.587
Hey Leute, bitte um Hilfe bei einem Script, dass ich für das Spiel Bitburner geschrieben habe:

Javascript:
/** @param {NS} ns */
export async function main(ns) {
    var maxPServers = ns.getPurchasedServerLimit();
    var purchServers = ns.getPurchasedServers();
    var maxServerRam = ns.getPurchasedServerMaxRam();
    var moneyAvail = 0;
    var newServerCost = 0;

    if (purchServers.length != maxPServers) {
        await ns.exec('buyServers.js', 'home');
    }
    purchServers = ns.getPurchasedServers();

    function searchMinServerRam() {
        var minRam = maxServerRam;
        for (var s1 of purchServers) {
            if (minRam > ns.getServerMaxRam(s1)) {
                minRam = ns.getServerMaxRam(s1);
            }
        }
        ns.print(minRam);
        return minRam;
    }

    var oramSize = searchMinServerRam();
    var nramSize = oramSize * 2;

    function replaceServer(ramSize) {
        var repServName = '';
        for (var s2 of purchServers) {
            if (ns.getServerMaxRam(s2) == oramSize) {
                repServName = s2;
            }
        }
        ns.killall(repServName);
        ns.deleteServer(repServName);
        ns.purchaseServer(repServName, ramSize);
        ns.exec('newsetup.js', 'home');
    }

    while (oramSize != maxServerRam) {
        oramSize = searchMinServerRam();
        ns.print(oramSize);
        nramSize = oramSize * 2;
        ns.print(nramSize);
        moneyAvail = ns.getServerMoneyAvailable('home');
        newServerCost = ns.getPurchasedServerCost(nramSize);
        if (nramSize > maxServerRam) {
            nramSize = maxServerRam;
        }
        if (moneyAvail > newServerCost) {
            replaceServer(nramSize);
        }
        await ns.sleep(60000);
    }
}

Beim ausführen des Scripts erhalte ich die Fehlermeldung:
getPurchasedServerCost: ram is NaN.

Die letzten Ausgaben im Script sind:
getServerMaxRam: returned 32.00GB
32
8
{}
NaN
getServerMoneyAvailable: returned player's money: $173.352m
getPurchasedServerCost: ram is NaN.
Script crashed with runtime error

Ich schließe daraus, dass in der function searchMinServerRam() noch alles in Ordnung ist, das aber die 8 (return minRam) nicht in oramSize gespeichert wird.
 
Ich kenne Dein Framework nicht, und leider passen die von Dir gezeigten Ausgaben nicht zu den print() im gezeigten Code - aber ein kleiner Denkanstoss hier:
Tipp mal in Deine Konsole: parseInt({})
 
  • Gefällt mir
Reaktionen: playerthreeone und madmax2010
Bei print() kann man übrigens mehrere Parameter übergeben, also zB einen kleinen Comment oder die Line number.

edit:
die 32 kommen aus Line 25 -> 21
die 8 aus 42 -> 21
die {} aus 43
das NaN aus 45
also gibt der 2. Aufruf von searchMinServerRam ein leeres Object zurück.
(vermute ich^^)
edit 2:
kann auch nicht sein, bei der 32 müsste eigentlich auch schon 8 stehen
Interessant wäre mal was in "purchServers" drin steht.
Zeile 25 und 26 kannst du dir so auch ganz sparen, einfach nur die beiden Variablen deklarieren reicht.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Phrasendreher
Ich hab den Fehler inzwischen gefunden/gelöst: die Variablendefinition in Zeile 25 war das Problem. Ich hab die Variable als function definiert, sollte aber ein Integer sein.

(Zur Info: Bitburner, hat auch ne gute Dokumentation online, und verwendet neben den eigenen Funktionen eben NetScript/JavaScript.)
 
Wenn Zeile 42 so aussehen würde ausgesehen hätte, würde es hätte das ziemlich genau den beobachteten Effekt erklärent:
Code:
oramSize = searchMinServerRam;
 
  • Gefällt mir
Reaktionen: playerthreeone
Wie gesagt, jetzt gehts.
Geändert hab ich die Variablendefinition, ich hab
Code:
 var oramSize = 2;
in Zeile 8 definiert und in Zeile 25 dann auf
Code:
oramSize = searchMinServerRam();
geändert, jetzt ist der Laufzeitfehler weg.

Gibts da einen Unterschied zwischen NetScript und JavaScript?
 
Zurück
Oben