С Новым годом! Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/30: Рейтинг темы: голосов - 30, средняя оценка - 4.87
 Аватар для APALoff
1648 / 1077 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507

Ошибка времени выполнения: Object reference not set to an instance of an object

16.01.2014, 16:06. Показов 5988. Ответов 10
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Есть код - в TP он нормально проходит компиляцию, а вот в PABC.net выдает ошибку - видимо я не понимаю каких то нюансов в различии TP и PABC.net:
Chastot2.pas(43) : Ошибка времени выполнения: Object reference not set to an instance of an object.
Сама строка:
Pascal
1
While (P^.Ch<>C) and (P<>nil) do P:=P^.NextP;
Переменные описаны так:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
Type 
  St2 = String[2];
  DC = ^tDC;
  tDC = Record
          Ch   : St2;
          NN   : Longint;
          NextP : DC;
          PredP : DC;
        End;
Var
  P0,P,Pt : DC;
  C : St2;
Где я ошибся?

Добавлено через 33 минуты
Volvo (aka UI), ай ниид хелп. Ты наверняка знаешь...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
16.01.2014, 16:06
Ответы с готовыми решениями:

Ошибка времени выполнения: Object reference not set to an instance of an object
Программа должна выводить на экран двоичное представление введённого числа. При этом обязательно нужно использовать массив boolean. После...

Ошибка "Object reference not set to an instance of an object" при создании списка
Добрый день. Задача такая: На входе дано несколько чисел (не знаем, какое кол-во). На выходе должна быть упорядоченная последовательность...

Ошибка времени выполнения: Object reference not set to an instance of an object
Делал задачу begin 1 в paskalABC.net . Program aaaaaalegko; uses pt4; var a,p:real; begin Task('Begin1'); readln(a); ...

10
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
16.01.2014, 17:30
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Поменяй местами 2 части условия (сначала проверь, что указатель не нулевой, и только потом пытайся обратиться по этому указателю). Это, кстати, общее правило, при использовании любого компилятора...

P.S. И не надо путать ошибки компиляции и ошибки времени выполнения, PABC.NET тоже прекрасно откомпилирует указанную строку, а вот в рантайме будет облом...
2
 Аватар для APALoff
1648 / 1077 / 1081
Регистрация: 03.07.2013
Сообщений: 4,507
16.01.2014, 17:50  [ТС]
Такая проверка и так делается.
Полный вариант процедуры:
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Procedure Append2ch(C : St2);
  Procedure NewPt;
  Begin
    New(Pt);
    Pt^.Ch:=C;
    Pt^.NN:=1;
    Pt^.NextP:=P0;
    Pt^.PredP:=nil;
    P0:=Pt;
  End;
Begin
  P:=P0;
  If P=nil then NewPt
  else
    Begin
      While (P^.Ch<>C) and (P<>nil) do P:=P^.NextP;
      If P=nil then NewPt else Inc(P^.NN);
    End;
End;
Добавлено через 58 секунд
Цитата Сообщение от UI Посмотреть сообщение
шибки компиляции и ошибки времени
Да, не так написал - компиляцию проходит, но выдает ошибку на запуске. Но в TP и компилит и запускает без ошибок.

Добавлено через 12 минут
И вправду помогло! Спасибо!

Добавлено через 1 минуту
Я понял где я "протупил"... Все таки хорошо, когда кто нибудь со стороны может глянуть "незамыленным" глазом. =)
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
16.01.2014, 18:17
Цитата Сообщение от APALoff Посмотреть сообщение
Но в TP и компилит и запускает без ошибок
Ну, TP - не показатель, тем более, что по умолчанию галочки runtime-проверок сняты. Если запустить со всеми возможными проверками - будет гораздо больше шансов получить ошибку выполнения, еще лучше - проверять в FPC, он еще жестче контролирует такие вещи.
1
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
07.05.2015, 22:58
Посдскажите, пожалуйста, та же проблема

Добавлено через 1 минуту
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
    p := begL^.link;
    flag := true;
    while (p <> nil) do
    begin
        if (((p^.data > 0) and (flag = true)) or ((p^.data < 0) and (flag = false))) then
        begin
            p := p^.link;
            pM := p;
            pP := p;
            flag := not flag;
        end;
        if ((p^.data > 0) and (flag = false)) then
        begin
            while ((pM <> nil) and (pM^.data > 0)) do
                pM := pM^.link;
            swap(p^.data, pM^.data);
        end;
        if ((p^.data < 0) and (flag = true)) then
        begin
            while ((pP <> nil) and (pP^.data > 0)) do
                pP := pP^.link;
            swap(p^.data, pP^.data);
        end;
        writeLn();
        outList(begL);
    end;
похожая ситуация, та же ошибка, но проверку, что указатель ненулевой я поставил в цикле

Добавлено через 1 минуту
задача: перетасовать список. Привести к такому виду: -1 1 -1 1 -1 1 (то есть расставить через один) и т. д.
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
07.05.2015, 22:58
Derrt, полный код где? Или я должен дописать, методом телепатии, то, чего не хватает, чтобы ошибку воспроизвести?
0
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
07.05.2015, 22:59
пост выше
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
07.05.2015, 23:00
Выше ничего не дает, я по обрывкам кода диагнозы ставить не имею
0
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
07.05.2015, 23:01
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
program lab6sda8;
//uses CRT;
type
    /// указатель на список
    point = ^tList;
    /// тип для списка
    tList = record
        data: integer;
        link: point;
    end;
var
    begL: point;
    n: integer;
/// создать новый список
procedure addNewList(var begL: point; const n: integer);
var
    i, tmp: integer;
    p: point;
begin
    new(p);
    p^.link := nil;
    begL := p;
    writeLn('Введите числа <> 0');
    for i := 1 to n do
    begin
        new(p^.link);
        p := p^.link;
        p^.link := nil;
        repeat
            read(tmp);
        until (tmp <> 0);
        p^.data := tmp;
    end;
end;
/// вывести список
procedure outList(begL: point);
var
    p: point;
begin
    p := begL^.link;
    while (p <> nil) do
    begin
        write(p^.data, ' ');
        p := p^.link;
    end;
end;
/// удалить список
procedure deleteList(var begL: point);
var
    p: point;
begin
    while (p <> nil) do
    begin
        p := begL;
        begL := begL^.link;
        dispose(p);
    end;
end;
/// сортировать список "-" "+" (чередовать через один)
procedure sortMinusPlus(var begL: point);
var
    // указатель на текущий элемент
    p: point;
    // указатель на отрицательный элемент
    pM: point;
    // указатель на положительный элемент
    pP: point;
    flag: boolean;
begin
    p := begL^.link;
    flag := true;
    while (p <> nil) do
    begin
        if (((p^.data > 0) and (flag = true)) or ((p^.data < 0) and (flag = false))) then
        begin
            p := p^.link;
            pM := p;
            pP := p;
            flag := not flag;
        end;
        if ((p^.data > 0) and (flag = false)) then
        begin
            while ((pM <> nil) and (pM^.data > 0)) do
                pM := pM^.link;
            swap(p^.data, pM^.data);
        end;
        if ((p^.data < 0) and (flag = true)) then
        begin
            while ((pP <> nil) and (pP^.data > 0)) do
                pP := pP^.link;
            swap(p^.data, pP^.data);
        end;
        writeLn();
        outList(begL);
    end;
end; 
begin
    write('Введите количество элементов списка: ');
    readLn(n);
    if (n > 0) then
    begin
        addNewList(begL, n);
        outList(begL);
        sortMinusPlus(begL);
        writeLn();
        outList(begL);
    end
    else writeLn('Список пуст');
    deleteList(begL);
end.
Добавлено через 1 минуту
скинул
0
Супер-модератор
Эксперт Pascal/DelphiАвтор FAQ
 Аватар для volvo
33197 / 21493 / 8233
Регистрация: 22.10.2011
Сообщений: 36,886
Записей в блоге: 12
07.05.2015, 23:14
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

Тут ошибка в логике:
Pascal
1
2
3
            while ((pM <> nil) and (pM^.data > 0)) do
                pM := pM^.link;
            swap(p^.data, pM^.data); // <-- Вот тут pM = nil, из-за предыдущего цикла
, соответственно, pM^.data - это попытка разыменования нулевого указателя. Несколькими строками ниже - та же ситуация с pP.

Перепроверяй алгоритм.
0
0 / 0 / 0
Регистрация: 29.11.2014
Сообщений: 64
07.05.2015, 23:18
volvo, хм, похоже разобрался.
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
program lab6sda8;
//uses CRT;
type
    /// указатель на список
    point = ^tList;
    /// тип для списка
    tList = record
        data: integer;
        link: point;
    end;
var
    begL: point;
    n: integer;
/// создать новый список
procedure addNewList(var begL: point; const n: integer);
var
    i, tmp: integer;
    p: point;
begin
    new(p);
    p^.link := nil;
    begL := p;
    writeLn('Введите числа <> 0');
    for i := 1 to n do
    begin
        new(p^.link);
        p := p^.link;
        p^.link := nil;
        repeat
            read(tmp);
        until (tmp <> 0);
        p^.data := tmp;
    end;
end;
/// вывести список
procedure outList(begL: point);
var
    p: point;
begin
    p := begL^.link;
    while (p <> nil) do
    begin
        write(p^.data, ' ');
        p := p^.link;
    end;
end;
/// удалить список
procedure deleteList(var begL: point);
var
    p: point;
begin
    while (p <> nil) do
    begin
        p := begL;
        begL := begL^.link;
        dispose(p);
    end;
end;
/// сортировать список "-" "+" (чередовать через один)
procedure sortMinusPlus(var begL: point);
var
    // указатель на текущий элемент
    p: point;
    // указатель на отрицательный элемент
    pM: point;
    // указатель на положительный элемент
    pP: point;
    flag: boolean;
begin
    p := begL^.link;
    flag := true;
    while (p <> nil) do
    begin
    // дополнительно проверим, не nil ли след. элемент
    if (p^.link <> nil) then begin
        if (((p^.data > 0) and (flag = true)) or ((p^.data < 0) and (flag = false))) then
        begin
            p := p^.link;
            pM := p;
            pP := p;
            flag := not flag;
        end;
        if ((p^.data > 0) and (flag = false)) then
        begin
            while ((pM <> nil) and (pM^.data > 0)) do
                pM := pM^.link;
            swap(p^.data, pM^.data);
        end;
        if ((p^.data < 0) and (flag = true)) then
        begin
            while ((pP <> nil) and (pP^.data > 0)) do
                pP := pP^.link;
            swap(p^.data, pP^.data);
        end;
        writeLn();
        outList(begL);
    end;
    end;
end; 
begin
    write('Введите количество элементов списка: ');
    readLn(n);
    if (n > 0) then
    begin
        addNewList(begL, n);
        outList(begL);
        sortMinusPlus(begL);
        writeLn();
        outList(begL);
    end
    else writeLn('Список пуст');
    deleteList(begL);
end.
Добавлено через 1 минуту
окей, понял, спасибо, странно, что если просто добавить условие, то все работает
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
07.05.2015, 23:18
Помогаю со студенческими работами здесь

Ошибка на ровном месте: Object reference not set to an instance of an object
Программа на VS2010 C# winforms Программа работала, сделал релиз, начал тестить на других компах, естественно проставил везде net4 на...

Unity ошибка NullReferenceException: Object reference not set to an instance of an object
Сам новичок в C# и Unity. Много чего не знаю. Подскажите, пожалуйста. Столкнулся с ошибкой: NullReferenceException: Object reference not...

Ошибка System.NullReferenceException : Object reference not set to an instance of an object
Совсем недавно начал учить C# . Наткнулся на ресурс codewars,где нужно по условию написать код и чтобы он прошел тесты. Код проходит 4 из 5...

Ошибка: System.NullReferenceException: 'Object reference not set to an instance of an object'
interface Monitor { double Diagonal { get; set; } int Resolution { get; set; } int Price_monitor { get;...

При streamreader.ReadLine() выскакивает ошибка object reference not set to an instance of object
Здраствуйте, у меня вдруг появилась такая проблема, что при streamreader.ReadLine() выскакивает ошибка object reference not set to an...


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

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru