Перейти к содержимому

Фотография

Как вернуть двумерный масив


  • Авторизуйтесь для ответа в теме
Сообщений в теме: 18

#1 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 28 января 2008 - 09:00

Помогите пожалуйста,

В общем проблема в том что я не могу присвоить двумерный масив, который возвращается функ-ей.

ТОетсь - у меня есть функция которая после обработки возвращает двумерный масив.

НО когда я пытаюсь присвоить результат фун-ции масиву, то присваеивается только последняя строчка.
Делаю так : Mass = ReturnMass();, Может че не так делаю?

Пытался найти ответ у програмистов, но их ответ доказал лишь то что, С# и C#Script довольно разные языки.
  • 0

#2 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 28 января 2008 - 09:32

Гляньте здесь

А вообще, не понятно, почему были созданы такие жёсткие ограничения для объекта Tables (по сути, двумерный массив)...
  • 0

#3 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 28 января 2008 - 10:25

Гляньте здесь



Спасибо помогло :)

Масив масивов - нормально работает.

НО все же задам вопросик для ощего развития...
Я пробовал работать с двумерными масивами С# - Arr[i,j] - в таком формате, и все бы ничего работало нормально, пока мне не пришлось вернуть его с помошью фунции, как я говорил возвращается только одна строка.

Можно ли это реализовать в манере двумерного масива?
  • 0

#4 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 28 января 2008 - 10:36

Я пробовал работать с двумерными масивами С# - Arr[i,j] - в таком формате, и все бы ничего работало нормально...


А что значит нормально работало? Я так понимаю, что Вы его инициализировали как-то так:
//Jscript
var arr = new Array(2,2)
arr[0,0] = "0.0"
arr[0,1] = "0.1"
arr[1,0] = "1.0"
arr[1,1] = "1.1"

Вы пробовали получать значения отдельных "ячеек"?

P.S. VBScript поддерживает двумерные массивы - это так, для справки, мало ли пригодится :)
  • 0

#5 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 28 января 2008 - 10:50

Я пробовал работать с двумерными масивами С# - Arr[i,j] - в таком формате, и все бы ничего работало нормально...


А что значит нормально работало? Я так понимаю, что Вы его инициализировали как-то так:
//Jscript
var arr = new Array(2,2)
arr[0,0] = "0.0"
arr[0,1] = "0.1"
arr[1,0] = "1.0"
arr[1,1] = "1.1"


нет не совсем так
//C#Script
var arr = new Array();
arr[0,0] = "0.0";
arr[0,1] = "0.1";
arr[1,0] = "1.0";
arr[1,1] = "1.1";

Вы пробовали получать значения отдельных "ячеек"?


Пробовал, вытаскивал и Логом и дебагером и с помощью ShowMessage
Все елементы сохранялись и отображались нормально
  • 0

#6 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 28 января 2008 - 10:58

Пробовал, вытаскивал и Логом и дебагером и с помощью ShowMessage
Все елементы сохранялись и отображались нормально


Хм, забавно, ибо я на выходе получаю одномерный массив (специально создал C#script проект и "прогнал" Ваш пример)...
  • 0

#7 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 28 января 2008 - 15:27

Хм, забавно, ибо я на выходе получаю одномерный массив (специально создал C#script проект и "прогнал" Ваш пример)...


Да действительно, извените за сказаную глупость :)

Я просто сделал вывод в том же цыкле что и присваивание, выводил по строчно вот он у меня и работал :)))
Спасибо что раскрыли глаза, а то сделал детскую ошибку и решил что открыл Америку.
  • 0

#8 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 31 января 2008 - 15:00

Тема не закрыта - возникла новая проблема :(

function GetDataFromExcel(Path, Sheet,ammonth)
{
   var lDriver = DDT["ExcelDriver"](Path, Sheet); 
   var arrExcelData = new Array();
   var arrElement = new Array();
   var count=0;
   while (!lDriver["EOF"]())
   {
	 for (var i=0;i<ammonth;i++)
		arrElement[i]=lDriver["Value"](i);
	
	 arrExcelData[count]=arrElement;
	 count++;
	 lDriver["Next"]();
  }
  return arrExcelData;
}


Эта ф-я считывает данные с екселя и возвращет двумерный масив - все бы не чего , вот только всем елементам конечного масива присваивается последнее значение масива arrElement.

Тоесть я считываю первую строку в масив arrElement, потом присваиваю его нулевуму елементу масива arrExcelData.
все нормально, но когда считываю и присваиваю вторую строку, то в масиве arrExcelData - присваивается новый елемент [1] а также меняется и [0] на последний, и тд

В итоге я получаю масив полностью одинаковых масивов - раных последней строки Екселя :(((

Никак не могу понять где сдесь ошибка?


Тоесть
  • 0

#9 Genka

Genka

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 328 сообщений
  • ФИО:Геннадий Алпаев
  • Город:Украина, Днепр


Отправлено 31 января 2008 - 15:16

а попробуйте вместо

arrExcelData[count]=arrElement;

написать
arrExcelData.push(arrElement);

и тогда переменная count не нужна
  • 0

TestComplete для начинающих (видеозаписи курса)

Software Testing Automation Tips (50 вещей, которые должен знать каждый автоматизатор, книга на английском языке)

Онлайн-учебник "Автоматизация тестирования от «А» до «Ы»"
Сборник рецептов по TestComplete (книга на английском языке)
Онлайн-учебник по TestComplete
Онлайн-учебник по SilkTest


#10 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 31 января 2008 - 15:22

а попробуйте вместо

arrExcelData[count]=arrElement;

написать
arrExcelData.push(arrElement);

и тогда переменная count не нужна



Ничего не изменилось :( все также меняются все Элементы)
  • 0

#11 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 31 января 2008 - 16:22

//C#Script

function GetDataFromExcel(Path, Sheet,ammonth)

{

   var lDriver = DDT["ExcelDriver"](Path, Sheet); 

   var arrExcelData = new Array();

   var count=0;

   while (!lDriver["EOF"]())

   {

	 var arrElement = new Array();

	 for (var i=0;i<ammonth;i++)

		arrElement[i]=lDriver["Value"](i);

	

	 arrExcelData[count]=arrElement;

	 count++;

	 lDriver["Next"]();

  }

  return arrExcelData;

}

  • 0

#12 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 01 февраля 2008 - 07:49

//C#Script
function GetDataFromExcel(Path, Sheet,ammonth)
{
   var lDriver = DDT["ExcelDriver"](Path, Sheet); 
   var arrExcelData = new Array();
   var count=0;
   while (!lDriver["EOF"]())
   {
	 var arrElement = new Array();
	 for (var i=0;i<ammonth;i++)
		arrElement[i]=lDriver["Value"](i);
	
	 arrExcelData[count]=arrElement;
	 count++;
	 lDriver["Next"]();
  }
  return arrExcelData;
}



Спасибо - работает!



Исходя из этого кода я предпологаю, что под каждый отдельно взятый масив выделяется память, точнее обьявляется первый елемент масива, по этому из и нужо обьявлять каждый раз для нового елемента :((

Поправте меня если я не прав.
  • 0

#13 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 01 февраля 2008 - 08:02

Исходя из этого кода я предпологаю, что под каждый отдельно взятый масив выделяется память, точнее обьявляется первый елемент масива, по этому из и нужо обьявлять каждый раз для нового елемента :((


arrExcelData = {rrElement, rrElement, ...}
в Вашем случае rrElement - один объект, который Вы постоянно обновляли.
  • 0

#14 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 01 февраля 2008 - 08:16

Исходя из этого кода я предпологаю, что под каждый отдельно взятый масив выделяется память, точнее обьявляется первый елемент масива, по этому из и нужо обьявлять каждый раз для нового елемента :((


arrExcelData = {rrElement, rrElement, ...}
в Вашем случае rrElement - один объект, который Вы постоянно обновляли.



1.Но ведь если я буду использовать как елемент не масив а обычную переменную в цыкле, то работать будет нормально

var arr = new Array();
var element;
for (var i=0;i<n;i++)
{
element++;
arr[i]=element;
}

Я ведь тоже в таком случае обновляю одну переменную, вот только в масие сохраняются данные и они будут у меня разные, А если елемент масив, то такое не катит :)

2. И еще один вопросик:

Нужно ли в С# Script для масивов использовать оператор delete?
Насколько я знаю в самом C# нужно а вот Jave - нет они сами удаляются :)
  • 0

#15 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 01 февраля 2008 - 15:51

1.Но ведь если я буду использовать как елемент не масив а обычную переменную в цыкле, то работать будет нормально
Я ведь тоже в таком случае обновляю одну переменную, вот только в масие сохраняются данные и они будут у меня разные, А если елемент масив, то такое не катит :)


Массивы и переменные - это совсем разные вещи. В случае с массивом, Вы работаете не с объектом, а ссылкой на объект.

2. И еще один вопросик:
Нужно ли в С# Script для масивов использовать оператор delete?
Насколько я знаю в самом C# нужно а вот Jave - нет они сами удаляются :)


Вы делаете типичную ошибку, сопоставляя C#Script с C# и Java. C#Script образован от JScript, который ни к C#, ни к Java прямого отношения не имеет. В JScript объекты удалять нельзя, a оператор delete используется для удаления элементов массива (и не только).
  • 0

#16 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 01 февраля 2008 - 16:13

Массивы и переменные - это совсем разные вещи. В случае с массивом, Вы работаете не с объектом, а ссылкой на объект.


Это я знаю :). Я это и имел введу в своем первом высказывании.



Вы делаете типичную ошибку, сопоставляя C#Script с C# и Java. C#Script образован от JScript, который ни к C#, ни к Java прямого отношения не имеет. В JScript объекты удалять нельзя, a оператор delete используется для удаления элементов массива (и не только).



А вот это уже интиресно:
Тоесть если я напишу:

delete arr;

то я удалю все его елементы, или нужно удалять по елементно?
  • 0

#17 AlexP

AlexP

    Опытный участник

  • Members
  • PipPipPipPip
  • 406 сообщений
  • Город:Санкт-Петербург

Отправлено 01 февраля 2008 - 16:37

А вот это уже интиресно:
Тоесть если я напишу:

delete arr;

то я удалю все его елементы, или нужно удалять по елементно?


Нужно удалять поэлементно:
delete(Array[index])

но ничего сложного в написании функции, которая будет полностью отчищать массив, нет.
  • 0

#18 Dmitry N

Dmitry N

    Профессионал

  • Members
  • PipPipPipPipPipPip
  • 1 742 сообщений
  • ФИО:Николаев Дмитрий
  • Город:Где-то в России

Отправлено 01 февраля 2008 - 17:52

Здравствуйте.

то я удалю все его елементы, или нужно удалять по елементно?

Не парьтесь, просто пересоздайте его. Старый массив удалится автоматически сборщиком мусора. Если хотите явно вызвать сборщик, зовите функцию CollectGarbage().
  • 0
С уважением,
Дмитрий

#19 tom_13

tom_13

    Постоянный участник

  • Members
  • PipPipPip
  • 206 сообщений
  • Город:Киев

Отправлено 05 февраля 2008 - 09:08

Здравствуйте.

то я удалю все его елементы, или нужно удалять по елементно?

Не парьтесь, просто пересоздайте его. Старый массив удалится автоматически сборщиком мусора. Если хотите явно вызвать сборщик, зовите функцию CollectGarbage().


Спасибо за информацию :) Теперь буду спокоен :)
  • 0


Количество пользователей, читающих эту тему: 0

0 пользователей, 0 гостей, 0 анонимных