Показать сообщение отдельно
Старый 24.08.2010, 18:33
XDiaBLo вне форума Посмотреть профиль Отправить личное сообщение для XDiaBLo Найти все сообщения от XDiaBLo
  № 1  
Ответить с цитированием
XDiaBLo

Регистрация: Mar 2010
Сообщений: 51
По умолчанию Ограничения ByteArray при клонировании

Использую общепринятый метод
Код AS3:
public static function clone(source:Object):* 
		{
			var copier:ByteArray = new ByteArray();
			copier.writeObject(source);
			copier.position = 0;
			return copier.readObject();
		}
для копирования объекта, и получаю
Цитата:
TypeError: Error #1034: Ошибка типа Coercion: невозможно преобразовать Object@2db3b999 в MemberType.
at Main()
вот вызов
Код AS3:
        var mt:MemberType = new MemberType(maxLength);
	var copy:MemberType = Utils.clone(mt) as MemberType
И на всякий случай весь класс MemberType, хотя я думаю что данных было бы достаточно
Код AS3:
package  
{
	/**
	 * ...
	 * @author XDiaBLo
	 */
	public class MemberType
	{
		public var maxLength:int;
		public var solutionType:Vector.<int>;
		public var energy:Number;
		//Инициализация
		public function MemberType(initLength:int) 
		{
			maxLength = initLength;
			solutionType = new Vector.<int>(maxLength, true);
			var i:int;
			for (i = 0; i < maxLength; i++)
			{
				solutionType[i] = i;
			}
			for (i = 0; i < maxLength; i++)
			{
				tweakSolution();
			}
		}
		//Подстройка
		public function tweakSolution()
		{
			var x, y, temp:int;
			do
			{
				x = Utils.getRandom(maxLength);
				y = Utils.getRandom(maxLength);
			}while (x == y);
			temp = solutionType[x];
			solutionType[x] = solutionType[y];
			solutionType[y] = temp;
		}
		public function hasQueen(i:int, j:int):Boolean
		{
			return solutionType[i] == j;
		}
		//Вычисление количества конфликтов.
		public function computeEnergy()
		{
			trace("computeEnergy()");
			var i, j:int;
			var board:Vector.<Vector.<Boolean>> = new Vector.<Vector.<Boolean>>(maxLength, true);
			for (i = 0; i < maxLength; i++)
			{
				board[i] = new Vector.<Boolean>(maxLength, true);
			};
 
			var dx:Vector.<int> = Vector.<int>([ -1, 1, -1, 1]);
			var dy:Vector.<int> = Vector.<int>([ -1, 1, 1, -1]);
			for (i = 0; i < maxLength; i++)
			{
				var tempSol:int = solutionType[i];
				for (j = 0; j < maxLength; j++)
				{
					if (tempSol == j)
					{
						board[i][j] = true;
					}
					else
					{
						board[i][j] = false;
					}
				}
			}
			var conflicts:int = 0;
			var x, y, tempX, tempY:int;
			for (i = 0; i < maxLength; i++)
			{
				x = i; y = solutionType[i];
				for (j = 0; j < 4; j++)
				{
					tempX = x; tempY = y;
					while(1)
					{
						tempX += dx[j]; tempY += dy[j];
						if ((tempX<0) || (tempX >= maxLength) || (tempY < 0) || (tempY >= maxLength)) break;
						if (board[tempX][tempY] == true) conflicts++;
					}
				}
			}
			energy = conflicts;
		}
		public function getEnergy():Number
		{
			trace("getEnergy()");
			computeEnergy();
			return energy;
		}
	}
}
Алгоритм который я реализовываю, значения не имеет, но если интересует, могу рассказать.

Добавлено через 23 минуты
То есть ошибка происходит когда я делаю var copy:MemberType = Utils.clone(mt);
А когда делаю var copy:MemberType = Utils.clone(mt) as MemberType;
происходит
Цитата:
TypeError: Error #1009: Не удается вызвать свойство или метод со ссылкой на объект "null".
at Main/draw()
at Main()
когда делаю вызов draw(copy, 250, 10); у которого сигнатура
public function draw(memberType:MemberType, xDelta:int, yDelta:int)


Последний раз редактировалось XDiaBLo; 24.08.2010 в 19:59.