Форум программистов, компьютерный форум, киберфорум
Pascal (Паскаль)
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/8: Рейтинг темы: голосов - 8, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17

Ошибка: ссылка на объект не указывает на экземпляр объекта

22.02.2022, 14:31. Показов 1682. Ответов 14

Студворк — интернет-сервис помощи студентам
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
type
  Tinf=integer; 
  List=^TList;  
  TList=record 
    data:TInf; 
    next:List;  
  end;
 
procedure AddElem(var stek1:List;znach1:TInf);
var
  tmp:List;
begin
  new(tmp); 
  tmp^.next:=stek1; 
  tmp^.data:=znach1;
  stek1:=tmp; 
end;
 
procedure Print(stek1:List);
begin
  if stek1=nil then 
  begin
    writeln('Пусто.');
    exit;
  end;
  while stek1<>nil do 
  begin  
    Write(stek1^.data, ' ');
    stek1:=stek1^.next  
  end;
end;
 
Procedure FreeStek(stek1:List);
var
  tmp:List;
begin
  while stek1<>nil do 
  begin
    tmp:=stek1; 
    stek1:=stek1^.next;
    dispose(tmp);
  end;
end;
 
var
  Stk, 
  tmp,max:List; 
  znach:Tinf; 
  n:integer;
  
begin
  randomize;
  repeat
    Write('Количество элементов очереди: ');
    readln(n);
    until n>0;
  stk:=nil;
  while n>0 do
  begin
    znach:=random(100);
    AddElem(stk,znach);
    dec(n);
    end;
    Write('Очередь: ');
  Print(stk);
  Writeln;
 
  tmp:=stk;
  max:=tmp;
while tmp<>nil do
  begin
    tmp:=tmp^.next;
    writeln(tmp);
    if tmp^.data>max^.data then
      max:=tmp;
  end;
  Writeln('Макс. элемент: ',max^.data);
  
  end.
Добавлено через 20 минут
Нужно создать очередь и найти её максимальный элемент
0
Лучшие ответы (1)
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
22.02.2022, 14:31
Ответы с готовыми решениями:

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
1 процедура создает очередь, 2 - вставляет после каждого положительного элемента заданное число, а 3 - должна сортировать очередь по...

Program1.pas(8) : Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
program files; var f,g:text;x:integer; begin assign(f,'E:\1.txt'); assign(g,'E:\chet.txt'); reset(f); rewrite(g);while not eof(f)...

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта (массив изображений)
uses GraphABC; var p : array of picture; begin for var j := 1 to 2 do p := picture.Create(j+'.png'); for var j := 0 to 9 do ...

14
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
22.02.2022, 15:12
Цитата Сообщение от Glowww Посмотреть сообщение
Pascal
73
writeln(tmp);
Это какой же Паскаль позволяет вывести на экран значение структуры? PascalABC.NET ?
0
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
22.02.2022, 15:28  [ТС]
Именно он
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
22.02.2022, 15:29
Лучший ответ Сообщение было отмечено Glowww как решение

Решение

проблема у тебя в том, что цикл со сравнением и поиском максимального неверно написал - нужно сначала сравнивать, а потом уже переходить к следующему элементу списка, а не наоборот, как у тебя!

я бы вообще вынес код поиска максимального в отдельную процедуру (или функцию, если захочешь изменить):

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
type
  Tinf=integer; 
  List=^TList;  
  TList=record 
    data:TInf; 
    next:List;  
  end;
 
procedure AddElem(var stek1:List;znach1:TInf);
var
  tmp:List;
begin
  new(tmp); 
  tmp^.next:=stek1; 
  tmp^.data:=znach1;
  stek1:=tmp; 
end;
 
procedure Print(stek1:List);
begin
  if stek1=nil then 
  begin
    writeln('Пусто.');
    exit;
  end;
  while stek1<>nil do 
  begin  
    Write(stek1^.data, ' ');
    stek1:=stek1^.next  
  end;
end;
 
Procedure FreeStek(var stek1:List);
var
  tmp:List;
begin
  while stek1<>nil do 
  begin
    tmp:=stek1; 
    stek1:=stek1^.next;
    dispose(tmp);
  end;
  stek1 := nil
end;
 
 
procedure GetMaxValue(stek1:List; var IsEmptyList : boolean; var MaxValue : TInf);
begin
  IsEmptyList := stek1=nil;
  if IsEmptyList then exit;
 
  MaxValue := stek1^.data;
  while stek1<>nil do 
  begin  
    if stek1^.data > MaxValue then MaxValue := stek1^.data;
    stek1:=stek1^.next  
  end;
end;
 
 
var
  stk : List; 
  znach,max : Tinf; 
  n:integer;
  isEmpty : boolean;
  
begin
  randomize;
  repeat
    Write('Количество элементов очереди: ');
    readln(n);
  until n>0;
 
  stk:=nil;
  while n>0 do
  begin
    znach:=random(100);
    AddElem(stk,znach);
    dec(n);
  end;
 
  Write('Очередь: ');
  Print(stk);
  Writeln;
 
  GetMaxValue(stk, isEmpty, max);
 
  if isEmpty then 
    WriteLn('Список пустой, максимальный элемент получить невозможно')
  else
    Writeln('Макс. элемент: ',max);
 
  {очистить список == освободить память}  
  FreeStek(stk)
  
end.
обрати внимание, я немного изменил процедуру освобождения памяти, ну и добавил вызов в конце, чтобы освободить память, выделенную под список.
1
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
22.02.2022, 15:59  [ТС]
Спасибо за объяснение

Добавлено через 7 минут
А как лучше реализовать поиск нечётного максимального числа?
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
22.02.2022, 16:50
Цитата Сообщение от Glowww Посмотреть сообщение
А как лучше реализовать поиск нечётного максимального числа?
да точно так же, только нужно
1) добавить условие для проверки нечётности числа - напоминаю, что для этого подходит стандартная функция odd()
2) ещё нужна переменная-флажок для определения, были ли нечётные числа.
либо можно использовать тот факт, что чётное число заведомо не может быть результатом.

поэтому:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
function MaxOddValue(stek1:List):TInf;
begin
  MaxOddValue := 0; {это значение не может быть, будем его использовать как флажок - что ответа нет}
  if stek1=nil then exit;
 
  while stek1<>nil do 
  begin  
    if odd(stek1^.data ) then
           if (MaxOddValue=0) or  (stek1^.data > MaxOddValue) then MaxOddValue := stek1^.data;
    stek1:=stek1^.next  
  end;
end;
вызов и вывод результата:
Pascal
1
2
3
   max := MaxOddValue(stk);
   if  max=0 then WriteLn('Нет нечётных элементов в списке')
   else WriteLn('Максимальное нечётное значение элемента = ', max);
1
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
22.02.2022, 17:22  [ТС]
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
procedure GetMaxValue(stek1:List; var IsEmptyList : boolean; var MaxValue : TInf);
begin
  IsEmptyList := stek1=nil;
  if IsEmptyList then exit;
 
  MaxValue := 1;
  while stek1<>nil do 
  begin  
    if (stek1^.data > MaxValue) and (stek1^.data mod 2 <> 0) then MaxValue := stek1^.data;
    stek1:=stek1^.next  
  end;
end;
Так тоже правильно?
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
23.02.2022, 13:34
Цитата Сообщение от Glowww Посмотреть сообщение
Так тоже правильно?
Нет!
Список заполняется элементами random(100),
значит существует вероятность, что не будет ни одного элемента больше 0.
А у вас сразу MaxValue := 1
Уж тогда лучше MaxValue := stek1^.data
0
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
23.02.2022, 14:01  [ТС]
mr-Crocodile, С данной функцией возникает ошибка: Нет перегруженной подпрограммы с такими типами параметров
0
 Аватар для mr-Crocodile
3053 / 1672 / 657
Регистрация: 19.03.2019
Сообщений: 5,380
24.02.2022, 09:23
Цитата Сообщение от Glowww Посмотреть сообщение
Нет перегруженной подпрограммы с такими типами параметров
это речь идёт про odd() ? какой у тебя компилятор Паскаля? Покажи скриншот с ошибкой.

Добавлено через 4 минуты
Цитата Сообщение от Glowww Посмотреть сообщение
Так тоже правильно?
так не очень корректно и почему уже объяснили.

но, если хочешь, можешь исправить одну строчку:
Pascal
6
MaxValue := 1;
заменить на
Pascal
6
MaxValue := 0;
это тоже, в общем случае, не очень корректно (если у тебя будут отрицательные числа, то этот код опять станет ошибочным), но для твоего диапазона чисел от 0 до 99 такое присвоение будет работать правильно в данном случае.
Но только не забудь при выводе результата добавить проверку и, если максимальное значение равно нулю - выдавай сообщение, что нечётных чисел в списке нет.
0
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
25.02.2022, 20:49  [ТС]
Скрин ошибки
Миниатюры
Ошибка: ссылка на объект не указывает на экземпляр объекта  
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2022, 08:37
У вас какая версия паскаля?
Такую возможность добавили в PABC.NET несколько лет назад.
Обновитесь и будет вам счастье…
0
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
26.02.2022, 11:52  [ТС]
Pascal abc net 3.8.2 - последний

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
type
  Tinf=integer; 
  List=^TList;  
  TList=record 
    data:TInf; 
    next:List;  
  end;
 
procedure AddElem(var stek1:List;znach1:TInf);
var
  tmp:List;
begin
  new(tmp); 
  tmp^.next:=stek1; 
  tmp^.data:=znach1;
  stek1:=tmp; 
end;
 
procedure Print(stek1:List);
begin
  if stek1=nil then 
  begin
    writeln('Пусто.');
    exit;
  end;
  while stek1<>nil do 
  begin  
    Write(stek1^.data, ' ');
    stek1:=stek1^.next  
  end;
end;
 
Procedure FreeStek(var stek1:List);
var
  tmp:List;
begin
  while stek1<>nil do 
  begin
    tmp:=stek1; 
    stek1:=stek1^.next;
    dispose(tmp);
  end;
  stek1 := nil
end;
 
 
function MaxOddValue(stek1:List):TInf; 
begin
  MaxOddValue := 0; 
  if stek1=nil then exit;
 
  while stek1<>nil do 
  begin  
    if odd(stek1^.data) then
           if (MaxOddValue=0) or (stek1^.data > MaxOddValue) then MaxOddValue := stek1^.data;
    stek1:=stek1^.next
  end;
end;
 
 
var
  stk : List; 
  znach,max : Tinf; 
  n:integer;
  isEmpty : boolean;
  
begin
  randomize;
  repeat
    Write('Количество элементов очереди: ');
    readln(n);
  until n>0;
 
  stk:=nil;
  while n>0 do
  begin
    znach:=random(100);
    AddElem(stk,znach);
    dec(n);
  end;
 
  Write('Очередь: ');
  Print(stk);
  Writeln;
  
   max := MaxOddValue(stk);
   if  max=0 then WriteLn('Нет нечётных элементов в списке')
   else WriteLn('Максимальное нечётное значение элемента = ', max);
 
  FreeStek(stk)
  
end.
0
 Аватар для JuriiMW
5095 / 2661 / 2355
Регистрация: 10.12.2014
Сообщений: 10,060
26.02.2022, 12:22
Pascal
47
48
49
50
51
52
53
54
55
56
57
function MaxOddValue(stek1:List):TInf; 
begin
  Result := 0; 
  while stek1 <> nil do 
    begin  
      if stek1^.data.isOdd then
        if (Result = 0) or (stek1^.data > Result) then
          Result := stek1^.data;
      stek1 := stek1^.next
    end;
end;
2
0 / 0 / 0
Регистрация: 22.02.2022
Сообщений: 17
26.02.2022, 19:17  [ТС]
Благодарю)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.02.2022, 19:17
Помогаю со студенческими работами здесь

Паскаль выдает ошибку: "Ссылка на объект не указывает на экземпляр объекта"
program a; uses crt; var a: array of integer; N, n1, n2, k, l, S, i: integer; begin randomize; Writeln('Введите число...

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Добрый день. Решил сделать платформер на pascalABC.net, и встретился с такой ошибкой в 20 строке: Ошибка времени выполнения: Ссылка на...

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Изучаю паскаль и тут такая проблемка вышла,которую не знаю как решить Суть проблемы такова: нужно сделать проверку на то,находится ли...

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Нужно составить программу для создания и обработки односвязного списка. Прjцедура sum-находит общую стоимость всех товаров из списка....

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Доброго времени суток. Компилятор выдает ошибку (Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта.) на 70...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru