передача по ссылке не работает с использованием переменной массива 2d

  • Автор темы 7Lexus
  • 34
  • Обновлено
  • 12, May 2024
  • #1
Привет, Я передаю пустой 2d-массив в функцию.

Функция сохраняет некоторое значение в массиве 2d. Но когда функция возвращается, я не могу напечатать это значение.

Ниже приведен мой код:
 

const path = require("path");

const fs = require("fs");

module.exports = async function(callback)

{

try {

let argStr = [[],[]]

let argStr2 = "address to, uint amount"

find_the_arguments(argStr, argStr2)

console.log("outside argStr[0][0]"+argStr[0][0])

console.log("outside argStr[0][1]"+argStr[0][1])

console.log("outside argStr[1][0]"+argStr[1][0])

console.log("outside argStr[1][1]"+argStr[1][1])

}

catch (error) {

console.log(error)

}

callback();

}

function find_the_arguments(argStr, argStr2) {

argStr = argStr2.split(",");

for (let i = 0; i < argStr.length; i++) {

argStr[I] = argStr[I].split(" ").filter(s => s !== '')

}

console.log("inside argStr[0][0]"+argStr[0][0])

console.log("inside argStr[0][1]"+argStr[0][1])

console.log("inside argStr[1][0]"+argStr[1][0])

console.log("inside argStr[1][1]"+argStr[1][1])

}


Код (JavaScript): Ниже приведен мой вывод:

$ truffle execdependentArguments.js

Использование сети «развитие».

внутри адреса argStr[0][0]

внутри argStr[0][1]до

внутри argStr[1][0]uint

внутри argStr[1][1]сумма

вне argStr[0][0]не определено

вне argStr[0][1]не определено

вне argStr[1][0]не определено

вне argStr[1][1]не определено

Я хочу, чтобы как внешние, так и внутренние операторы выводили одно и то же значение.

Кто-нибудь, пожалуйста, направьте меня. Зульфи.

pre.cjk {font-family: "DejaVu Sans Mono", моноширинный }p {margin-bottom: 0,1in; line-height: 115% }code.cjk { font-family: "DejaVu Sans Mono", моноширинный }

7Lexus


Рег
14 Aug, 2014

Тем
2

Постов
3

Баллов
23
  • 01, Jun 2024
  • #2
Хотя массивы передаются по ссылке, создание нового массива и присвоение его этой ссылке нарушает ассоциацию.

Это НОВЫЙ массив, поэтому указатель (ссылка) больше не действителен.

МОМЕНТ, который вы делаете: argStr = argStr2.split(","); Вы сломали ссылку.

Таким образом, чтобы сделать то, что вы пытаетесь сделать, вам понадобится еще одна переменная, локальная для области видимости, чтобы осуществить это.
 

async function doIHaveName() {

try {

let

argStr = [ [], [] ],

argStr2 = "address to, unit amount";

console.log("Before call:", argStr, argStr2);

findTheArguments(argStr, argStr2);

console.log("After call:", argStr, argStr2);

} catch (error) {

console.log(error);

}

} // doIHaveName

function findTheArguments(argStr, argStr2) {

console.log("start call:", argStr, argStr2);

let splitStr = argStr2.split(",");

for (let i = 0; i < argStr.length; i++) {

argStr[i] = splitStr[i].split(" ").filter(s => s !== '');

}

console.log("end call:", argStr, argStr2);

}

doIHaveName();

Код (разметка): в этот момент перестаньте бездельничать, пытаясь изменить ссылку, и просто используйте return. Также интересно, почему вы думаете, что такая операция должна быть асинхронной, если вы не делаете ничего, связанного с событиями.

Вы просто усложняете работу с кодом.
 

webmastermd


Рег
23 Mar, 2015

Тем
0

Постов
29

Баллов
29
  • 04, Jun 2024
  • #3
Я сохранил ваш код как jsfiddle: https://jsfiddle.net/itamer/9e13n7qg/3/

вы можете добавить что угодно в console.log и разделить запятыми - вам не придется беспокоиться о типах переменных Я дал первой функции имя, но было бы полезно, если бы вы могли добавить в вызовы некоторые реальные данные и показать нам, каким вы ожидаете результат.
 

olenkahr


Рег
01 Jan, 2011

Тем
0

Постов
2

Баллов
2
  • 05, Jun 2024
  • #4
да, это был всего лишь кусочек, если ты не знал. Я действительно смущен тем, что пытается сделать ваша функция.

Вы передаете argStr, а затем сразу же перезаписываете его.

Перезаписывать параметры не только является плохой практикой, но и противоречит цели их передачи. Я внес еще несколько изменений: https://jsfiddle.net/itamer/9e13n7qg/8/

что дает предсказуемый ответ.

Если вам нужно что-то еще, вам, вероятно, следует переработать jsfiddle, чтобы дать более четкое представление о ваших требованиях, или изложить их здесь. результат:
 async function doihaveaname() {

try {

let argStr = [

[],

[]

]

let argStr2 = "address to, unit amount"

console.log("doihaveaname:", argStr, argStr2)

find_the_arguments(argStr, argStr2)

} catch (error) {

console.log(error)

}

}

function find_the_arguments(argStr, argStr2) {

console.log("params original:", argStr, argStr2)

argStr = argStr2.split(",");

for (let i = 0; i < argStr.length; i++) {

argStr[i] = argStr[i].split(" ").filter(s => s !== '')

}

console.log("params reworked:", argStr, argStr2)

}

doihaveaname()

Код (ApacheConf):
 "doihaveaname:", [[], []], "address to, unit amount" "params original:", [[], []], "address to, unit amount" "params reworked:", [["address", "to"], ["unit", "amount"]], "address to, unit amount"
Код (JavaScript):
 

poolemet


Рег
07 Jan, 2013

Тем
1

Постов
4

Баллов
14
Тем
49554
Комментарии
57426
Опыт
552966

Интересно