Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.62/21: Рейтинг темы: голосов - 21, средняя оценка - 4.62
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516

Почему переменной не присваивается значение?

06.11.2019, 12:29. Показов 4682. Ответов 29
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Столкнулся в программе с необъяснимой ошибкой - в строке 94 ячейке массива не присваивается значение:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
program ServerLife;
 
uses System.Net, System.Net.Sockets, System.IO;
 
var
  server: TcpListener := new TcpListener(IPAddress.Any, 5000);
  BreakPr := True;
  f: text;
  pow := biginteger.pow(2, 400);
 
begin
  writeln('IP:', Dns.GetHostByName(Dns.GetHostName()).AddressList.ToArray());
  assign(f, 'Data.txt');
  var BestRes, BestComb: BigInteger;
  
  //Ввод данных с файла
  writeln('Ввод данных с файла');
  var p := -1;
  var sd: array of string := ('0 0', string('0'));
  if not (FileExists('Data.txt')) then
    writealllines('Data.txt', sd);
  var NotProcessed := new BigInteger[0, 2];
  foreach var s: string in readlines('Data.txt') do
  begin
    if p = -1 then
    begin
      BestRes := s.ToWords.ElementAt(0).ToBiginteger;
      BestComb := s.ToWords.ElementAt(1).ToBiginteger;
    end
    else
    begin
      SetLength(NotProcessed, (NotProcessed.Length div 2) + 1, 2);
      NotProcessed[p, 0] := s.ToWords.ElementAt(0).ToBiginteger;
    end;
    inc(p);
  end;
  
  //Тело программы
  writeln('Тело программы');
  server.Start();
  while BreakPr do
  begin
    
    //Вычисление обработанного количества данных в процентах:
    writeln('Вычисление обработанного количества данных в процентах:');
    
    //Введение переменных;
    var percent := '';
    var delit := biginteger.Pow(2, 400);
    var delim := NotProcessed[0, 0] * 100;
    
    //Вычисление целой части;
    repeat
      percent += (delim div delit).ToString;
      delim := delim mod delit;
    until delim div delit = 0;
    
    //Вычисление дробной части.
    percent += '.';
    loop 120 do
    begin
      percent += (delim div delit).ToString;
      delim := (delim mod delit) * 10;
    end;
    (percent + '%').Println;
    
    //Запуск сервера
    writeln('Запуск сервера');
    var client := server.AcceptTcpClient();
    var stream := client.GetStream();
    
    //Получение данных
    writeln('Получение данных');
    var br := new BinaryReader(stream);
    var data := br.ReadString();
    
    //Проверка наличия ответа в запросе на данные:
    if data <> 'R' then
    begin
      
      //Нахождение лучшего результата;
      if data.ToWords.ElementAt(2).ToBiginteger > BestRes then
      begin
        BestRes := data.ToWords.ElementAt(2).ToBiginteger;
        BestComb := data.ToWords.ElementAt(1).ToBiginteger;
      end;
      
      //Удаление обработанных данных из списка необработанных.
      for var i := 0 to (NotProcessed.Length div 2) - 1 do
        if data.ToWords.ElementAt(0).ToBiginteger = NotProcessed[i, 0] then
        begin
          if i = 0 then
          begin
            NotProcessed[0, 0] += 1000000;
            if NotProcessed[0, 0] > pow then
              NotProcessed[0, 0] := pow;
            NotProcessed[0, 1] := 0;
          end
          else
          begin
            for var k := i to (NotProcessed.Length div 2) - 2 do
            begin
              NotProcessed[i, 0] := NotProcessed[i + 1, 0];
              NotProcessed[i, 1] := NotProcessed[i + 1, 1];
            end;
            SetLength(NotProcessed, (NotProcessed.Length div 2) - 1, 2);
          end;
        end;
    end;
    
    //Проверка на наличие данных с просроченным ответом;
    data := '';
    var seconds := True;
    for var i := 0 to (NotProcessed.Length div 2) - 1 do
      if ((milliseconds - NotProcessed[i, 1] > 1000000) or (NotProcessed[i, 1] = 0)) and Seconds then
      begin
        data := NotProcessed[i, 0].ToString;
        NotProcessed[i, 1] := milliseconds;
        Seconds := False;
      end;
    
    
    //Добавление нового элемента в массив.
    if Seconds then
    begin
      SetLength(NotProcessed, (NotProcessed.Length div 2) + 1, 2);
      (NotProcessed[(NotProcessed.Length div 2) - 1, 0], NotProcessed[(NotProcessed.Length div 2) - 1, 1]) := (NotProcessed[0, 0], NotProcessed[0, 1]);
      NotProcessed[0, 0] := (NotProcessed[(NotProcessed.Length div 2) - 1, 0] + 1000000 > pow) ? pow : NotProcessed[(NotProcessed.Length div 2) - 1, 0] + 1000000;
      NotProcessed[0, 1] := milliseconds;
      data += NotProcessed[0, 0].ToString;
    end;
    
    //Передача данных
    writeln('Передача данных');
    var bw := new BinaryWriter(stream);
    bw.Write(data);
    bw.Flush();
    
    //Остановка сервера
    writeln('Остановка сервера');
    stream.Close();
    client.Close();
    
    //Запись данных в файл
    writeln('Запись данных в файл');
    rewrite(f);
    println(f, BestRes, BestComb);
    for var i := 0 to (NotProcessed.Length div 2) - 1 do
      Println(f, NotProcessed[i, 0]);
    close(f);
    BreakPr := (NotProcessed.Length = 2) and (NotProcessed[0, 0] = pow) ? False : True;
  end;
end.
Что скажете?
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
06.11.2019, 12:29
Ответы с готовыми решениями:

Не присваивается значение переменной элементу массива в модуле.
проблема такая, есть программа: uses modulx; begin init; {raschet znachenyi funkcii} rzf(xmax,x,y,n); {minimalnoe i...

Почему не присваивается минимальное по модулю значение?
Почему не присваивается минимальное значение? Нахожу наименьшее по модулю значение среди элементов побочной диагонали. Program 123; var...

Обменять значения переменной, имеющей наибольшее значение с переменной, имеющей наименьшее значение
Даны значения трех вещественных переменных a, b и c, отличные друг от друга. Обменять значения переменной, имеющей наибольшее значение с...

29
 Аватар для FFPowerMan
2156 / 1236 / 508
Регистрация: 11.10.2018
Сообщений: 6,236
06.11.2019, 12:30
Цитата Сообщение от ProMix0 Посмотреть сообщение
Pascal
1
+=
- такой оператор разве есть в Паскале? По-моему, нет.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
06.11.2019, 12:33  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
program ClientLife;
 
uses System.Net, System.Net.Sockets, System.IO;
 
///Отправляет строку по указанному адресу и возвращает ответ
function Connect(Self: string; IP: string; Port: integer): string; extensionmethod;
begin
  var client := new TcpClient(IP, Port);
  var stream := client.GetStream();
  var bw := new BinaryWriter(stream);
  bw.Write(Self);
  bw.Flush();
  var br := new BinaryReader(stream);
  Result := br.ReadString();
  stream.Close();
  client.Close();
end;
 
begin
  //Определение IP сервера
  {writeln('Определение IP сервера');
  var w := new WebClient();
  var IPS := w.DownloadString('https://yadi.sk/d/_cGBP77ieNcG8Q').ToWords('I').Print;
  while not ((IPS.First.ToString.First = 'P') and (IPS.First.ToString.Last = 'P')) do
    IPS := IPS.Skip(1);
  var IP := IPS.First.ToWords('P').JoinIntoString.Println;}
  
  var IP:={Напишите ваш IP:}0.0.0.0;
  
  var (Field, Field1) := (new byte[42, 42], new byte[42, 42]);
  var BestComb: BigInteger;
  var sum, bestsum: integer;
  
  //Получение данных с сервера
  writeln('Получение данных с сервера');
  var c := string('R').Connect(IP, 5000);
  
  while True do
  begin
    
    //Перебор 100000 вариантов (~5 мин)
    writeln('Перебор 1000000 вариантов (~5 мин)');
    var g := c.ToBigInteger;
    var n := 0;
    loop 10000 do
    begin
      
      //Перевод числа BigInteger в двумерный бинарный(из нулей и единичек) массив
      var duo := '';
      var delim := g + n;
      while not (delim = 0) do
      begin
        duo := (delim mod 2).ToString + duo;
        delim := delim div 2;
      end;
      duo += '0' * (400 - duo.Length);
      var k := 1;
      for var i := 11 to 30 do
        for var j := 11 to 30 do
        begin
          Field[i, j] := StrToInt(Duo[k]);
          Inc(k);
        end;
      
      //Симуляция игры (10 ходов)
      loop 10 do
      begin
        for var i := 1 to 40 do
          for var j := 1 to 40 do
            case Field[i - 1, j - 1] + Field[i - 1, j] + Field[i - 1, j + 1] + Field[i, j - 1]
            + Field[i, j + 1] + Field[i + 1, j - 1] + Field[i + 1, j] + Field[i + 1, j + 1] of
              0, 1, 4..8: Field1[i, j] := 0;
              2: Field1[i, j] := Field[i, j];
              3: Field1[i, j] := 1;
            end;
        for var i := 1 to 40 do
          for var j := 1 to 40 do
            Field[i, j] := Field1[i, j];
      end;
      
      //Нахождение лучшей комбинации
      sum := 0;
      for var i := 1 to 40 do
        for var j := 1 to 40 do
          if Field[i, j] = 1 then
            inc(sum);
      if sum > bestsum then
      begin
        BestComb := g + n;
        bestsum := sum;
      end;
      
      inc(n);
      if n mod 100 = 0 then
        ((n div 100) * 100).Println;
    end;
    
    //Отправка результатов на сервер и получение новой задачи
    writeln('Отправка результатов на сервер и получение новой задачи');
    c := concat(c, ' ', BestComb.ToString, ' ', BestSum.ToString).Connect(IP, 5000);
    (BestSum, BestComb) := (0, 0);
  end;
end.
Вторая половинка программы. Для работы вставьте свой IP в 28 строчке.

Добавлено через 52 секунды
Цитата Сообщение от FFPowerMan Посмотреть сообщение
Сообщение от ProMix0
Pascal
1
+=
- такой оператор разве есть в Паскале? По-моему, нет.
Давно есть. Но с другими тоже не работает.
0
 Аватар для kotAV
142 / 108 / 57
Регистрация: 15.09.2017
Сообщений: 425
06.11.2019, 12:49
Лучший ответ Сообщение было отмечено ProMix0 как решение

Решение

ProMix0,
Pascal
1
var NotProcessed := new BigInteger[0, 2];
Это же пустой массив

Добавлено через 5 минут
И ещё, .Length возвращает общее количество элементов. Потестите:
Pascal
1
2
3
4
5
6
7
begin
  var a := new integer[3, 2];
  a.Println;
  a.Length.Println; //6
  a.RowCount.Println; //3
  a.ColCount.Println //2
end.
Для возвращения размера нужного измерения можно использовать .RowCount/.ColCount для матриц или .GetLength(номер_измерения) для любых массивов.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
06.11.2019, 12:52  [ТС]
В строке 32 он обретает размер

Добавлено через 39 секунд
Цитата Сообщение от kotAV Посмотреть сообщение
.Length возвращает общее количество элементов
Знаю, уже обжигался на этом

Добавлено через 46 секунд
Но за
Цитата Сообщение от kotAV Посмотреть сообщение
.GetLength
спасибо
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
07.11.2019, 11:21  [ТС]
У кого-нибудь есть идеи, куда можно ещё обратиться за помощью?
0
Status 418
Эксперт Python
4584 / 2350 / 601
Регистрация: 26.11.2017
Сообщений: 5,262
Записей в блоге: 3
07.11.2019, 12:24
А зачем Вам вообще двумерный массив? Используйте два списка (List).
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
08.11.2019, 07:48  [ТС]
Так проще
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
09.11.2019, 11:19  [ТС]
Короче, я нашёл ответ - значение присваивается, но в режиме отладки это почему-то не отображается.
0
 Аватар для kotAV
142 / 108 / 57
Регистрация: 15.09.2017
Сообщений: 425
09.11.2019, 12:24
ProMix0, написал о проблеме: ide#163
1
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
09.11.2019, 12:31
Да кстати, если бы значение не присваивалось бы - оно было бы 0, потому что это стандартное значение для BigInteger. А если бы у вас был массив, к примеру, классов - не присвоенным элементам отображало бы nil.

А если отображает пустое место - это обязательно баг ide и о нём надо сообщить.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
09.11.2019, 17:17  [ТС]
Куда сообщить?

Добавлено через 1 минуту
Хотя уже не актуально

Добавлено через 26 минут
Если не сложно, напишите на примере использование процедуры fill для массивов
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
09.11.2019, 21:50
Pascal
1
2
3
4
5
begin
  var a := new integer[10];
  a.Fill(i->i*i);
  a.Println;
end.
.Fill принимает функцию, которая принимает индекс в массиве и возвращает элемент, который нужно сохранить по этому индексу.
Если не понимаете что такое -> и как передавать функции как параметры:
http://pascalabc.net/downloads... ambdas.pdf

Цитата Сообщение от ProMix0 Посмотреть сообщение
Куда сообщить?
Желательно найти минимальный код и отправить в issue, куда кинул ссылку kotAV. А так - если искать минимальный код лень, то хотя бы в 1 из данных тем:
http://forum.mmcs.sfedu.ru/t/o... t/2530/185
http://forum.mmcs.sfedu.ru/t/o... et/2532/84
Там точно кто-нибудь заметит и сделает issue.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
10.11.2019, 08:05  [ТС]
i - это номер ячейки?
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
10.11.2019, 08:20
Да. Точнее вместо i подставляет номер каждой ячейки.
Тот код - короткая запись такого:
Pascal
1
2
3
4
5
6
7
8
9
10
function lambda1(i: integer): integer;
begin
  Result := i*i;
end;
 
begin
  var a := new integer[10];
  a.Fill(lambda1);
  a.Println;
end.
Который по сути делает то же самое что:
Pascal
1
2
3
4
5
6
7
8
9
10
11
function lambda1(i: integer): integer;
begin
  Result := i*i;
end;
 
begin
  var a := new integer[10];
  for var i := 0 to a.Length-1 do
    a[i] := lambda1(i);
  a.Println;
end.
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
11.11.2019, 17:58  [ТС]
Спасибо
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
12.11.2019, 10:28  [ТС]
А почему он выдаёт ошибку?
Pascal
1
nul.Fill(i,j -> 0);
Неизвестное имя 'i'
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.11.2019, 12:00
Потому что вы забыли скобки. Как компилятор поймёт, это 2 параметра переданные в метод .Fill, i и j->0, или это всё 1 лямбда? Если у лямбды несколько параметров - надо писать (i,j)->....
0
80 / 33 / 10
Регистрация: 14.06.2019
Сообщений: 516
12.11.2019, 12:21  [ТС]
Pascal
1
.Fill((i,j)->0)
Нет перегруженной подпрограммы с такими типами параметров
0
 Аватар для Sun Serega
2355 / 1458 / 526
Регистрация: 07.04.2017
Сообщений: 4,798
12.11.2019, 12:52
Так а к чему вы его применяете?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
12.11.2019, 12:52
Помогаю со студенческими работами здесь

Почему переменной не присваивается суммовое значение
Range(&quot;D1&quot;).Formula = &quot;=COUNT(B2:B1000)&quot; Range(&quot;E1&quot;).Formula = &quot;=SUM(C2:C1000)&quot; Dim e As Long Dim y As Long Dim x As...

Присваивает переменной не то значение (при x=y=z=0, n=4, но почему-то переменная a, которой присваивается n + 0,006 )
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;locale.h&gt; #include &lt;math.h&gt; int main() { setlocale(LC_ALL, &quot;Rus&quot;); float...

Значение присваивается переменной, но не присваивается TexBox
есть функция public static void ControllerInfo(string name, ref string customer, ref int addres) которая возвращяет ссылку на переменную,...

Почему переменной присваивается произвольное значение("мусор")?
Мой черновой вариант кода. Он очень черновой так что многое не суть важно, но переменной х я присваиваю значение 0. Если после приглашения...

Не присваивается значение переменной
private void button1_Click(object sender, EventArgs e) { double OhmMMcl=0; double OhmMMst=0; ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru