Меня сбил с толку intellisense вот только что он показывал, что массив b это массив of integer, а сейчас уже показывает, что of real. Жаль что не заскринил… Погодите а вот у меня есть еще другой похожий код там видно
Intellisence - он на самом деле не такой уж и intelli. Бывает, что пока не откомпилируешь программу, он не понимает, с каким типом данных имеет дело. А уж если программа содержит ошибки, не дающие ее откомпилировать, вероятность “странностей” увеличивается в разы.
Хорошо работает Intellisence, если программа сразу набирается безошибочно. А если что-то переопределить, может и соврать. Пока вот так.
Наверно все же потому, что это Intellisence - это небольшая вспомогательная программа, а не полноценный компилятор. Если Вам нужна точная информация о типе, ставьте отладочную точку прерывания и после запуска программы смотрите его в локальных переменных.
Это в issue может быть вопрос - кидать или нет. А в ошибки на форуме можно и желательно кидать всё что странно работает. Там уже решат - ошибка или нет, и если это новая ошибка - кинут в issue.
Здравствуйте, изучая программирование, наткнулся на головоломку по питону
Решил тоже самое провернуть в PascalABC (версия 3.4, сборка 1672 от 10.06.2018).
1 Пример
2 Пример
Почему в 1 примере произошла ошибка, а во 2 все отработало? Ведь поменять поля кортежа после его создания невозможно.
Элементы кортежа в паскале нельзя перезаписывать. А оператор += должен полностью перезаписать третий элемент кортежа, чтоб сработать. Если вы напишете так:
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 - указатель от этого не меняется. Изменяется лишь содержимое списка которое находится по тому указателю.
у меня этот код не работает, не получается обратиться к элементам кортежа если в кортеже присутствует элемент множество, воспроизводится та же самая ошибка
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 (или как оно там называется), но оно вроде в определённых случаях в тихую отказывается работать.