Помощь новичкам

“Нельзя преобразовать тип array of real к array of integer” Почему так нельзя:

begin
  var n := 10;
  var a := ArrFill(n, 2);
  a := a.Select((el, ind)-> Power(el, ind)).ToArray; // тут ошибка
  a.Println;
end.

а так можно:

begin
  var n := 10;
  var a := ArrFill(n, 2);
  var b := a.Select((el, ind)-> Power(el, ind)).ToArray;
  b.Println;
end.

После возведения в степень получается массив вещественных. Он несовместим с массивом целых

Меня сбил с толку intellisense вот только что он показывал, что массив b это массив of integer, а сейчас уже показывает, что of real. Жаль что не заскринил… Погодите а вот у меня есть еще другой похожий код там видно %D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA

Intellisence - он на самом деле не такой уж и intelli. Бывает, что пока не откомпилируешь программу, он не понимает, с каким типом данных имеет дело. А уж если программа содержит ошибки, не дающие ее откомпилировать, вероятность “странностей” увеличивается в разы.

Хорошо работает Intellisence, если программа сразу набирается безошибочно. А если что-то переопределить, может и соврать. Пока вот так.

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

begin
  var n := 10;
  var a := Range(1, n).Select(el -> Power(2, el)).ToArray;
  a.Println;
end.

%D0%A1%D0%BD%D0%B8%D0%BC%D0%BE%D0%BA1

Вы прочитали мой предыдущий пост? Откомпилировали?

Конечно, тут тип real[10]. Врёт. Не может он понять, что получится после проекции с лямбдой, вызывающей функцию.

Ну конечно, программа запускается и выдает результат, но почему пишет, что массив целых, если после Power должен получиться массив вещественных?

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

О, благодарствую, полезная информация. Но наверное этот случай нужно закинуть в ошибки?

А это уж Вам решать…

Это в issue может быть вопрос - кидать или нет. А в ошибки на форуме можно и желательно кидать всё что странно работает. Там уже решат - ошибка или нет, и если это новая ошибка - кинут в issue.

Здравствуйте, изучая программирование, наткнулся на головоломку по питону 1
Решил тоже самое провернуть в PascalABC (версия 3.4, сборка 1672 от 10.06.2018).

1 Пример
2

2 Пример
3

Почему в 1 примере произошла ошибка, а во 2 все отработало? Ведь поменять поля кортежа после его создания невозможно.

Add создаёт новый кортеж

Нет, тут Add вызывается для списка.

Элементы кортежа в паскале нельзя перезаписывать. А оператор += должен полностью перезаписать третий элемент кортежа, чтоб сработать. Если вы напишете так:

begin
  var t := (1, 2, [30, 40]);
  t := (t[0], t[1], t[2] + [50, 60]);
end.

В этом случае создаётся новый кортеж. Все элементы копируются, кроме третьего, для которого возвращается изменённая копия.


Что касается второго случае - List это класс, поэтому когда вы пишете:

var t1 := new List<integer>;

t1 присваивается только указатель но новый созданный список. Когда вы написали:

var tuple := (1,2,t1);

Вы скопировали в третий элемент кортежа адрес этого списка, а не сам список. То есть третий элемент кортежа тут указатель, и когда вы пишете t1.Add - указатель от этого не меняется. Изменяется лишь содержимое списка которое находится по тому указателю.

А, да - с телефона не увидел

у меня этот код не работает, не получается обратиться к элементам кортежа если в кортеже присутствует элемент множество, воспроизводится та же самая ошибка

Да, ну issue создали - значит через некоторое время исправят. Пока откажитесь от множеств в кортежах.

Нужно, чтобы у нас в каком-то режиме воспроизвелось

Как распараллелить этот метод?

public void Backward()
        {
            var V = this.Input;
            V.DW = new float[V.W.Length];
            var inputWidth = V.Width | 0;
            var inputHeight = V.Height | 0;
            var xy_stride = this.Stride | 0;

            for (var d = 0; d < this.OutputDepth; d++)
            {
                var f = this.Filters[d];
                var x = -this.Pad | 0;
                var y = -this.Pad | 0;
                for (var ay = 0; ay < this.OutputHeight; y += xy_stride, ay++)
                {  // xy_stride
                    x = -this.Pad | 0;
                    for (var ax = 0; ax < this.OutputWidth; x += xy_stride, ax++)
                    {  // xy_stride

                        // convolve centered at this particular location
                        var chain_grad = this.Output.Get_Grad(ax, ay, d); // gradient from above, from chain rule
                        for (var fy = 0; fy < f.Height; fy++)
                        {
                            var oy = y + fy; // coordinates in the original input array coordinates
                            for (var fx = 0; fx < f.Width; fx++)
                            {
                                var ox = x + fx;
                                if (oy >= 0 && oy < inputHeight && ox >= 0 && ox < inputWidth) // check if oy not <0 or oy > input height
                                {
                                    for (var fd = 0; fd < f.Depth; fd++)
                                    {
                                        // avoid function call overhead (x2) for efficiency, compromise modularity :(
                                        //V(ox,oy,fd)
                                        //f(fx,fy,fd)
                                        var ix1 = ((inputWidth * oy) + ox) * V.Depth + fd;
                                        var ix2 = ((f.Width * fy) + fx) * f.Depth + fd;
                                        f.DW[ix2] += V.W[ix1] * chain_grad;
                                        V.DW[ix1] += f.W[ix2] * chain_grad;
                                    }
                                }
                            }
                        }
                        this.Biases.DW[d] += chain_grad;
                    }
                }
            }
        }

Я бы взял первый цикл и разбил его на разные потоки. Можно, в теории, и все разбить. Ещё есть $omp (или как оно там называется), но оно вроде в определённых случаях в тихую отказывается работать.

1 лайк