1 (изменено: alexii, 2014-09-26 22:21:25)

Тема: JScript: Падает скрипт на одной из машин

Есть скрипт, использует 2х-мерные массивы (вернее массивы массивов) и некие рекурсивные алгоритмы.

Запускался на 3х машинах. Windows XP SP 2, Windows SP XP 3 и Windows 7
Так вот на той, которая с SP3 падает скрипт.
Функция, где возникает проблема: (m, n и columns - члены Matrix)


Matrix.prototype.ToString = function(dec_places, alignment, columndivider) {
    var divider = " ";
    if (!isUndefined(columndivider)){
        divider = columndivider;
    }
    var str = "";    
    with(this){
        for (var j=0; j<m; j++){            
            for (var i=0; i<n; i++){
                var part = "";
                if (!isUndefined(dec_places))
                    part = columns[i][j].toFixed(dec_places);
                
                else
                    part = columns[i][j]

                if (!isUndefined(alignment)){
                    var diff = alignment - part.length;
                    var spaces = "";
                    for (var s=0; s<diff; s++)
                        spaces += " ";
                    part = spaces + part;
                }
                str += (part + divider);

            }
            if (j < m-1)
                str += "\n";
        }
    }
    return str;
}

Подключился отладчиком через Visual Studio, там вижу следующее
m=4 n=5
Все объекты в columns от i до j целы
Но на определенной комбинации i и j (конкретно при j = 1 и i = 1) после выполнения строчки

part = columns[i][j].toFixed(dec_places);

this.columns становится 'undefined' и на следующем шаге цикла скрипт падает.

Может кто сталкивался с таким странным поведением WSH на каких-либо платформах?
Еще часть кода, которая может быть полезна для анализа (используются при создании этих матриц).


function Matrix(n, m)
{
    this.n = n;
    this.m = m;
    this.columns = new Array(n);
    for (var r=0; r<n; r++){
        var col = new Array(m);
        for (var it=0; it<m; it++){
            col[it] = 0;
        }
        this.columns[r] = col;        
    }
}

Matrix.prototype.Clone = function() {
    var mm = new Matrix(this.n, this.m);
    for (var i=0; i<this.n; i++){
        mm.columns[i] = this.columns[i].slice(0);
    }
    return mm;
}


2

Re: JScript: Падает скрипт на одной из машин

Что здесь должно быть?! Двойные отрицания усложняют понимание.


    if (!isUndefined(columndivider)){
        divider = columndivider;
    }

Естестенно в этом фрагменте не понятно, каким должно быть значение divider. А оно у Вас - undefined. Это пишется просто


divider = columndivider || ' ';

Или еще проще


Matrix.prototype.ToString = function(dec_places, alignment, divider) {
  divider = divider || ' ';

В javascript/jscript имена функций и методов принято начинать с маленькой буквы. То есть:


Matrix.prototype.toString = function(dec_places, alignment, divider) {

Хотя кому как - Вы сам себе барин

Упростить это не желаете? Уже для матрицы 4*5 выполняется 40 сравнений и только для того, чтобы выбрать способ перевода числа в строку. Надо вынести этот код за пределы всех циклов.


        for ( ...
            for ( ...
                if ( ...
                if ( ...
( 2 * b ) || ! ( 2 * b )

3

Re: JScript: Падает скрипт на одной из машин

Спасибо, конечно, за краткий курс по JavaScript. Про булевые операции над undefined уверен не был, поэтому и не пользовался.  Про вынос за цикл, это не та функция, где следует запариваться над производительностью. Для вывода нужна просто. Для меня JavaScript инструмент, к которому я прибегаю раз в год, если что.

Итак, покритиковали мой код, однако вопрос то был в другом.

4

Re: JScript: Падает скрипт на одной из машин

Camarada пишет:

Итак, покритиковали мой код, однако вопрос то был в другом.

Позвольте полюбопытствовать на счет того, как именно цеплялись отладчиком, как трассировали?

5

Re: JScript: Падает скрипт на одной из машин

greg zakharov пишет:
Camarada пишет:

Итак, покритиковали мой код, однако вопрос то был в другом.

Позвольте полюбопытствовать на счет того, как именно цеплялись отладчиком, как трассировали?

Запустил с ключом
csrcript //X my_script.js
Предлагает запустить установленную Visual Studio, скрипт в нее загружается и встает на первой инструкции.
Дальше пожалуйста брейкпоинты, вотч виндоус, стэк трейс и все прелести.

6

Re: JScript: Падает скрипт на одной из машин

Camarada, что показала трассировка? - Если проблема в самом cscript, попробуйте помониторить его Process Monitor'ом.

7

Re: JScript: Падает скрипт на одной из машин

Итак, покритиковали мой код, однако вопрос то был в другом.

Здоровая критика никогда не помешает. даже в своих разработках я нахожу косяки. Независимо от сложности кода всегда стоит думать о его простоте. Даже в таком простом коде на первый взгляд методе Matrix.prototype.ToString закралась ошибка, которую трудно отловить. Я уже указал Вам на это.

Исправьте


    var divider = " ";
    if (!isUndefined(columndivider)){
        divider = columndivider;
    }

на

var divider = columndivider || ' ';
( 2 * b ) || ! ( 2 * b )

8

Re: JScript: Падает скрипт на одной из машин

Camarada,
OFFTOP:

Camarada пишет:

Про булевые операции над undefined уверен не был, поэтому и не пользовался.  Про вынос за цикл, это не та функция, где следует запариваться над производительностью. Для вывода нужна просто.

С этого и начинается небрежное написание кода... А потом удивляемся:

Camarada пишет:

Запускался на 3х машинах. Windows XP SP 2, Windows SP XP 3 и Windows 7
Так вот на той, которая с SP3 падает скрипт.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

9

Re: JScript: Падает скрипт на одной из машин

greg zakharov пишет:

Camarada, что показала трассировка? - Если проблема в самом cscript, попробуйте помониторить его Process Monitor'ом.

Не представляю, что я там могу увидеть. Может посоветуете на какие именно вещи обратить внимание?

Румата пишет:

Даже в таком простом коде на первый взгляд методе Matrix.prototype.ToString закралась ошибка, которую трудно отловить. Я уже указал Вам на это.

Что-то я не пойму, где же там ошибка, вы мне предлагаете упростить код. Упрощение значительное, но какую ошибку это исправит, я не понимаю.
Вот метод isUndefined() если что.

function isUndefined(obj){
    return typeof obj === 'undefined';
}

Тем более не зная этой конструкции, через год я посмотрю на этот скрипт и не пойму, что же значит странная запись object || ' '
Для меня как для C++ программиста в лучшем случае это будет означать вызов Object::operator!(object) и что-то там еще несуразное

10

Re: JScript: Падает скрипт на одной из машин

Camarada пишет:

Не представляю, что я там могу увидеть...Для меня как для C++ программиста...через год я посмотрю на этот скрипт и не пойму, что же значит странная запись object || ' '

O_O

11

Re: JScript: Падает скрипт на одной из машин

O_O

Кхе-кхе … Я, вон, каждый раз читаю справку к «findstr.exe», дабы припомнить детали.

12

Re: JScript: Падает скрипт на одной из машин

alexii пишет:

O_O

Кхе-кхе … Я, вон, каждый раз читаю справку к «findstr.exe», дабы припомнить детали.

Так хелп почитать это одно. А увидеть || '', это ж надо целую главу JScript перечитать)

13

Re: JScript: Падает скрипт на одной из машин

Camarada,

Camarada пишет:

А увидеть || '', это ж надо целую главу JScript перечитать)

Не соглашусь. Для человека вообще имеющего представление о программировании, понятно что это оператор

Лезем в google и набираем JavaScript операторы

Первая же ссылка: Справочник: Операторы - Javascript.ru

Тут же замечаем, что наш оператор "||" перечислен в разделе Логические операторы

Открываем раздел и тут же получаем пояснение

Логическое ИЛИ (||)

expr1 || expr2

Возвращает expr1, если оно может быть преобразовано к true; в ином случае возвращает expr2. Так что, при вызове с булевыми значениями, || вернет true только в том случае, когда хотя бы один операнд истинен, иначе вернет false.

На мой взгляд вполне исчерпывающая информация. И на это Вы потратите не более минуты.

Передумал переделывать мир. Пашет и так, ну и ладно. Сделаю лучше свой !

14

Re: JScript: Падает скрипт на одной из машин

Xameleon, признаю, не так сложно найти.

Однако очень хотелось бы поменьше флуда.

15

Re: JScript: Падает скрипт на одной из машин

Camarada пишет:

Однако очень хотелось бы поменьше флуда.

Встречное предложение: не провоцируйте. Особенно вопросов касательно операторов. Тем паче, что уважающий себя сишник не станет бить себя пяткой в грудь, приговаривая, дескать, я - сишник, но вот че-то как-то меня напрягает такая-то конструкция, что, согласитесь, достаточно странно для сишника в отношении си-подобного синтаксиса. Потому не могу не согласиться с Xameleon.
alexii, невозможно помнить абсолютно все, но зарезервированные слова, операторы и прочие синтаксические единицы, все же необходимый базис для разработчика, а какие-то узкие моменты... Например, мне часто приходится в последнее время работать с WinAPI, так что же? Мне ль его весь помнить?!

16

Re: JScript: Падает скрипт на одной из машин

greg zakharov пишет:
Camarada пишет:

Однако очень хотелось бы поменьше флуда.

Встречное предложение: не провоцируйте.

ОК. Просто я стараюсь всегда выкладывать на форумах минимум кода, ибо почти всегда это приводит к обсуждению кода и "зачем так делать" вместо проблемы. Stackoverflow в этом плане радует, кстати надо попробовать обратиться туда. Просто на этом форуме обычно всегда решал вопросы связанные с WSH.

По теме. Пробовал перезагружать ту машину (ну как машину, нетбук на Атоме, он у меня все время включен), AVG отключал. Но в этом конкретном месте все продолжает падать.

Просто, если бы это были плюсы, я бы подумал, что где-то допущена ошибка по работе с памятью, выход за пределы массива, испортился стек. Однако это JScript, поэтому я подозреваю, что проблема в каких-то либах либо самом движке WSH на данной машине.

17

Re: JScript: Падает скрипт на одной из машин

Camarada, если Вы оформляете код в соответствии с правилами форума, никто Вас и пальцем не тронет каким бы ни был длинным код. Это во-первых. Касательно Stackoverflow - попробуйте. Но на Вашем бы месте следовало бы:
1)проверить на вшивость jscript.dll на virustotal, скажем, с помощью sigcheck.exe Руссиновича (sigcheck -q -vs %windir%\system32\jscript.dll)
2)если все чисто, перерегистрировать jscript.dll
3)если не помогло, изучить падение с помощью Process Monitor'а Руссиновича (токмо не забудьте про отладочные символы)
Нюансов, если это действительно системный баг, может быть куча, но прежде все же не мешало отладить сам код скрипта

18

Re: JScript: Падает скрипт на одной из машин

greg zakharov пишет:

Camarada, если Вы оформляете код в соответствии с правилами форума, никто Вас и пальцем не тронет каким бы ни был длинным код. Это во-первых. Касательно Stackoverflow - попробуйте. Но на Вашем бы месте следовало бы:
1)проверить на вшивость jscript.dll на virustotal, скажем, с помощью sigcheck.exe Руссиновича (sigcheck -q -vs %windir%\system32\jscript.dll)
2)если все чисто, перерегистрировать jscript.dll
3)если не помогло, изучить падение с помощью Process Monitor'а Руссиновича (токмо не забудьте про отладочные символы)

Спасибо за советы. Обязательно воспользуюсь, когда доберусь до компьютера.

greg zakharov пишет:

Нюансов, если это действительно системный баг, может быть куча, но прежде все же не мешало отладить сам код скрипта

Он работает, уже и на большем количестве машин проверено.

P. S. Из правил форума по оформлению кода нашел только.

3.10. Если Вы публикуете ссылку на свою разработку или публикуете код своего скрипта, объясните внятно, зачем нужна эта разработка или скрипт, как это запустить и как это использовать. В противном случае Ваша публикация будет абсолютно бессмысленной.

и еще

Обязательно используйте теги для оформления кода

Может я действительно невнятно выразился где-то?