• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Brak możliwości odczytu elementów tablicy dwuwymiarowej [czysty JS]

Object Storage Arubacloud
+1 głos
332 wizyt
pytanie zadane 30 października 2017 w JavaScript przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 31 października 2017 przez plkpiotr

Próbuję zaimplementować jeden z algorytmów heurystycznych w języku JavaScript, jednak napotkałem na dosyć błahy problem, którego rozwiązania nie widzę...

Podświetlona linia powoduje w konsoli następujący błąd:

Uncaught TypeError: Cannot read property '0' of undefined
    at countFunctionCost (algorithm.js:50)
    at useSimulatedAnnealing (algorithm.js:58)
    at algorithm.js:91

Kod na obecną chwilę jest następujący:

function createEmptyMatrix(numberOfProducts, numberOfMachines) {
    var matrix = new Array(numberOfProducts);
    for (var i = 0; i < numberOfProducts; i++) {
        matrix[i] = new Array(numberOfMachines);
        for (var j = 0; j < numberOfMachines; j++)
            matrix[i][j] = 0;
    }
    return matrix;
}

function createRandomMatrix(numberOfProducts, numberOfMachines) {
    var matrix = new Array(numberOfProducts);
    for (var i = 0; i < numberOfProducts; i++) {
        matrix[i] = new Array(numberOfMachines);
        for (var j = 0; j < numberOfMachines; j++)
            matrix[i][j] = Math.floor((Math.random() * 10) + 20);
    }
    console.log(matrix);
    return matrix;
}

function createRandomVector(numberOfProducts) {
    var vector = new Array(numberOfProducts);
    for (var i = 0; i < numberOfProducts; i++)
        vector[i] = Math.floor((Math.random() * 50) + 80);
    console.log(vector);
    return vector;
}

function createRandomSolution(limits, numberOfProducts, numberOfMachines) {
    var solution = createEmptyMatrix(numberOfProducts, numberOfMachines);
    for (var i = 0; i < numberOfProducts; i++) {
        var remaining = limits[i];
        for (var j = 0; j < numberOfMachines; j++) {
            if (j !== numberOfMachines - 1) {
                var amount = Math.floor((Math.random() * (remaining + 1)));
                solution[i][j] = amount;
                remaining -= amount;
            } else
                solution[i][j] = remaining;
        }
    }
    console.log(solution);
}

function countFunctionCost(solution, prices, times) {
    var sum = 0;
    for (var i = 0; i < prices.length; i++) {
        for (var j = 0; j < prices[0].length; j++) {
            sum += solution[i][j] * prices[i][j] * times[i][j];
        }
    }
}

function useSimulatedAnnealing(temperatureStart, temperatureEnd, alpha, neighbourhoods, limits, prices, times) {
    var temperature = temperatureStart;
    var solution = createRandomSolution(limits, prices.length, prices[0].length);
    var functionCost = countFunctionCost(solution, prices, times);

    // return {
    //     solution: solution,
    //     functionCost: functionCost
    // };
}

var prices = [
    [4, 4, 2, 3],
    [1, 2, 1, 3],
    [1, 1, 1, 2],
    [5, 4, 3, 3],
    [7, 8, 7, 8],
    [5, 5, 6, 7]
];

var times = [
    [6, 7, 8, 7],
    [6, 5, 3, 2],
    [8, 7, 7, 6],
    [1, 2, 2, 1],
    [3, 2, 1, 1],
    [2, 3, 3, 3]
];

var limits = [10, 15, 20, 15, 12, 16];
// var prices = createRandomMatrix(6, 4);
// var times = createRandomMatrix(6, 4);
// var limits = createRandomVector(6);

console.log(prices);
console.log(times);
var outputAlgorithm = useSimulatedAnnealing(400, 0.001, 0.999, 3, limits, prices, times);
// var solutionName = outputAlgorithm.solution;
// var functionCostName = outputAlgorithm.functionCost;

Wynika to z tablicy dwuwymiarowej solution, gdyż w funkcji countFunctionCost() mogę się odwołać do elementów prices i times.

Domyślam się, że chodzi o utworzenie solution w funkcji useSimulatedAnnealing(), jednak nie rozumiem co jest przyczyną tego błędu... Zasięg zmiennych w JS płata figle, nazewnictwo zmiennych, czy może źle przekazuję argumenty do funkcji?

Program poprawnie wyświetla wszystkie console.log()

2 odpowiedzi

+2 głosów
odpowiedź 31 października 2017 przez ScriptyChris Mędrzec (190,190 p.)
wybrane 1 listopada 2017 przez plkpiotr
 
Najlepsza

Na końcu funkcji createRandomSolution brakuje return solution :) W JavaScript, funkcja która nie kończy się jawnie słówkiem return, zwraca undefined.

komentarz 31 października 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
edycja 1 listopada 2017 przez plkpiotr

Dziękuję, w przerwie na uczelni doczytałem sobie że tablice w JS przekazywane są jako wartość przez funkcje (bez return nie zmieni ich zawartości)  więc dzięki temu i powyższej odpowiedzi zrozumiałem, czego nie rozumiem :)

+1 głos
odpowiedź 31 października 2017 przez kap Stary wyjadacz (11,620 p.)

@plkpiotr
 

doczytałem sobie że tablice w JS przekazywane są jako wartość przez funkcje (bez return nie zmieni ich zawartości)

To źle sobie doczytałeś, tablice przekazywane są przez referencję (w uproszczeniu), weźmy chociaż taki prosty przykład:
 

function addItem(arr, item) {
  arr.push(item)
}

const exampleArray = []

console.log(exampleArray) // []

addItem(exampleArray, 'elo')

console.log(exampleArray) // ["elo"]

 

komentarz 1 listopada 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
przywrócone 1 listopada 2017 przez plkpiotr

Dzięki, rzeczywiście zdążyłem się przekonać, że jednak tak nie jest, usuwam tą  treść, by nie wprowadzić kogoś w błąd. 

komentarz 1 listopada 2017 przez plkpiotr Stary wyjadacz (12,420 p.)

Źródło niezrozumienia: webmaster/helion

komentarz 1 listopada 2017 przez kap Stary wyjadacz (11,620 p.)
To przykre, że takie materiały wiszą w sieci i to w dodatku pod domeną heliona ;/
komentarz 1 listopada 2017 przez kap Stary wyjadacz (11,620 p.)

Btw, nie usuwaj postów, nawet błędnych, bo zaburzasz ciągłość dyskusji - przestaje ona mieć sens. Błędne stwierdzenia przekreślaj i ewentualnie dodawaj prawidłowe.

komentarz 1 listopada 2017 przez plkpiotr Stary wyjadacz (12,420 p.)
Ok - poprawiam

Podobne pytania

0 głosów
1 odpowiedź 178 wizyt
pytanie zadane 7 października 2019 w Java przez Szczurek431 Początkujący (330 p.)
0 głosów
1 odpowiedź 720 wizyt
0 głosów
2 odpowiedzi 437 wizyt
pytanie zadane 14 stycznia 2019 w C i C++ przez Shimeo7 Obywatel (1,910 p.)

92,573 zapytań

141,423 odpowiedzi

319,648 komentarzy

61,959 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...