Форум программистов, компьютерный форум, киберфорум
PascalABC.NET
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.55/209: Рейтинг темы: голосов - 209, средняя оценка - 4.55
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65

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

30.09.2014, 11:39. Показов 40888. Ответов 18
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно нарисовать 100 пикселей в случайном порядке
Выдаёт ошибку не выводит пиксели на экран
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
uses GraphABC;
type
  tLocation=class
  private
  x,y:integer;
  col:Color;
  
  public
  constructor Create(initX,initY:integer;initC:Color);
  procedure Draw();
  
  end;
  
  constructor tLocation.Create(initX,initY:integer;initC:Color);
  begin
  x:=initX;
  y:=initY;
  col:=initC;
  end;
  
  procedure tLocation.Draw();
  begin
  SetPixel(x,y,col);
  end;
  
 var mas:array of tLocation;
 maxx:integer;
begin
 
maxx:=100;
 
for var i:=0 to maxx-1 do
begin
mas[i]:=new tLocation(Random(100),Random(100),clBlue);
end;
 
for var i:=0 to maxx-1 do
mas[i].Draw();
 
end.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
30.09.2014, 11:39
Ответы с готовыми решениями:

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Здравствуйте, столкнулся с этим :Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта. program Lab11_2; ...

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Подскажите пожалуйста, как написать программу так чтобы не вылезала ошибка? uses graphabc; type box = class x, x1, y,...

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

18
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.09.2014, 13:38
Лучший ответ Сообщение было отмечено kolyaz как решение

Решение

Pascal
1
2
3
begin
maxx:=100;
setlength(mas,maxx) ;//выдели память под объекты
1
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
30.09.2014, 13:52  [ТС]
Спасибо не знал
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.09.2014, 13:53
Так если используете динамические массивы, то хоть почитайте о них.
0
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
30.09.2014, 14:32  [ТС]
Я только учусь, да и
литературы маловато по паскалю в ооп
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
30.09.2014, 14:54
Динамические массивы, это не ООП

Добавлено через 1 минуту
Открой справку АВС.net и прочитай

Добавлено через 1 минуту
Кликните здесь для просмотра всего текста
Динамические массивы
Тип динамического массива конструируется следующим образом:

array of тип элементов (одномерный массив)
array [,] of тип элементов (двумерный массив)
и т.д.

Переменная типа динамический массив представляет собой ссылку. Поэтому динамический массив нуждается в инициализации (выделении памяти под элементы).

Для выделения памяти под динамический массив используется два способа. Первый способ использует операцию new в стиле вызова конструктора класса:

var
a: array of integer;
b: array [,] of real;
begin
a := new integer[5];
b := new real[4,3];
end.

В этом случае можно также задавать инициализацию массива значениями:

a := new integer[3](1,2,3);
b := new real[4,3] ((1,2,3),(4,5,6),(7,8,9),(0,1,2));

Второй способ использует стандартную процедуру SetLength:

SetLength(a,10);
SetLength(b,5,3);

Процедура SetLength обладает тем преимуществом, что при ее повторном вызове старое содержимое массива сохраняется.

Если объявлен массив массивов

var с: array of array of integer;

то его инициализацию можно провести только с помощью SetLength:

SetLength(с,5);
for i := 0 to 4 do
SetLength(c[i],3);

Для инициализации такого массива с помощью new следует ввести имя типа для array of integer:

type IntArray = array of integer;
var с: array of IntArray;
...
c := new IntArray[5];
for i := 0 to 4 do
c[i] := new integer[3];

При описании инициализацию динамического массива можно проводить в сокращенной форме:

var
a: array of integer := (1,2,3);
b: array [,] of real := ((1,2,3),(4,5,6),(7,8,9),(0,1,2));
c: array of array of integer := ((1,2,3),(4,5),(6,7,8));

При этом происходит выделение памяти под указанное справа количество элементов. При таком способе в инициализаторе одномерного массива должно содержаться не менее 2 элементов.

Динамические массивы одного типа можно присваивать друг другу, при этом обе переменные-ссылки будут указывать на одну память:

var a1: array of integer;
var a2: array of integer;
a1 := a2;

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

Чтобы одному динамическому массиву присвоить копию другого массива, следует воспользоваться стандартной функцией Copy:

a1 := Copy(a2);

Длина массива (количество элементов в нем) возвращается стандартной функцией Length или свойством Length:

l := Length(a);
l := a.Length;

Для многомерных массивов длина по каждой размерности возвращается стандартной функцией Length с двумя параметрами или методом GetLength(i):

l := Length(a,0);
l := a.GetLength(0);
0
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
02.10.2014, 11:28  [ТС]
Замучался уже голова болит

Должен рисовать новое небо при каждом нажатии на клавишу- но не рисует
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
uses GraphABC,ABCButtons;
 
const
  n = 100;
  h = 50;
  
 type
  tPoint=class
    private
      x, y: Integer;
      col: Color;
    public
    constructor Create(InitX, InitY: Integer; InitColor: Color);
    procedure Hide;
    procedure Draw;
    procedure Move(NewX,NewY:integer);
    end;
    
    constructor tPoint.Create(InitX, InitY: Integer; InitColor: Color);
      begin
        x := InitX;
        y := InitY;
        col := InitColor;
      end;
    
    procedure tPoint.Draw;
       begin
       
       PutPixel(x, y, col);
       end;  
       
     procedure tPoint.Hide;
       begin
        PutPixel(x, y, clBlack);
       end;  
    
    procedure tPoint.Move(NewX, NewY: Integer);
      begin
        Hide;
        x := NewX;
        y := NewY;
        
        Draw;
      end;
      
var
  mas:array of tPoint;
  i,x,y:integer;
  GetMaxX,GetMaxY:integer;
  col:Color;
  btnStart: ButtonABC;
  
 
  
 procedure btnStart_OnClick;
    
  begin
 
  var x:=Random(GetMaxX);
      y:=Random(GetMaxY);
  for var i := 1 to n-1 do
      mas[i].move(x,y);
    end;
    
begin
  GetMaxX:=800;
  GetMaxY:=600;
  Randomize;
  SetLength (mas,n);
  
  SetWindowTitle('окно1');
  SetWindowWidth(GetMaxX);
  SetWindowHeight(GetMaxY);
  Window.CenterOnScreen();
  Window.IsFixedSize := true;
  Window.Clear(Color.black);
  
  
  for i := 1 to n-1 do
  begin
    x := Random(GetMaxX);
    y := Random(GetMaxY);
    col := clRandom;
    mas[i]:=new tPoint(x, y, col);
  end;
  begin
  for i := 1 to n-1 do
      mas[i].Draw;
      
   end;   
   
  //КНОПКА
   btnStart := new ButtonABC(10, 10, 100, 30, 'Новое небо!', clMoneyGreen); 
   btnStart.FontColor:= Color.Red;
   btnStart.FontStyle:= fsBold; 
   btnStart.TextScale:= 0.9;
   //процедура-обработчик:
   btnStart.OnClick := btnStart_OnClick; 
end.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
02.10.2014, 12:31
Лучший ответ Сообщение было отмечено kolyaz как решение

Решение

Переделал, будет работать и в .net и просто АВС.
Уже вроде писал, раз объявляете конструктор, то используйте.
Ошибка конечно не из-за этого, а неверной логики программы.
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
uses GraphABC,ABCButtons;
const n = 500;
      GetMaxX=800;
      GetMaxY=600;
type
  tPoint=class
    private
      x, y: Integer;
      col: Color;
    public
    constructor Create(InitX, InitY: Integer; InitColor: Color);
    procedure Hide;
    procedure Draw;
    procedure Move(NewX,NewY:integer);
    end;
    
    constructor tPoint.Create(InitX, InitY: Integer; InitColor: Color);
      begin
        x := InitX;
        y := InitY;
        col := InitColor;
      end;
    
    procedure tPoint.Draw;
       begin
        PutPixel(x, y, col);
       end;  
       
     procedure tPoint.Hide;
       begin
        PutPixel(x, y, clBlack);
       end;  
    
    procedure tPoint.Move(NewX, NewY: Integer);
      begin
        Hide;
        x := NewX;
        y := NewY;
        Draw;
      end;
 var
  mas:array of tPoint;//глобальная переменая массив точек
      
 procedure btnStart_OnClick;
 var i,x,y:integer;
 begin
 for i := 0 to n-1 do
  begin
   x := Random(GetMaxX);//задаем новые коордиинаты 
   y := Random(GetMaxY);
   mas[i].Move(x,y);//рисуем на новом месте
  end; 
end;
var
  i:integer;
  btnStart: ButtonABC;   
 begin  
 Randomize;
 SetLength (mas,n);
 SetWindowTitle('окно1');
 SetWindowWidth(GetMaxX);
 SetWindowHeight(GetMaxY);
 Window.CenterOnScreen();
 Window.IsFixedSize := true;
 Window.Clear(Color.black);
 for i:=0 to n-1 do
  begin
   mas[i]:=tpoint.Create(Random(GetMaxX),Random(GetmaxY),clrandom);//задаем исходное небо
   mas[i].Draw;//рисуем
  end; 
  //КНОПКА
 btnStart := new ButtonABC(10, 10, 100, 30, 'Новое небо!', clMoneyGreen); 
 btnStart.FontColor:= Color.Red;
 btnStart.FontStyle:= fsBold; 
 btnStart.TextScale:= 0.9;
 //процедура-обработчик:
 btnStart.OnClick := btnStart_OnClick; 
end.
1
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
02.10.2014, 12:46  [ТС]
Спасибо, как всегда истина оказалось где-то рядом!
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
02.10.2014, 12:49
Перефразируя кота Матроскина, чтобы построить новое небо, нужно иметь старое..
1
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
03.10.2014, 18:10  [ТС]
Прошу прощения конечно, уже бороду пустил, но всё таки как заставить вот это чудовище двигаться при нажатие стрелок с шагом "h"
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
uses GraphABC,ABCButtons;
const n = 500;
      GetMaxX=800;
      GetMaxY=600;
      h=10;
 
 
type 
     tLocation=class
     private
     x,y:integer;
     public
     constructor Create(InitX, InitY: Integer);
     procedure Hide();virtual;
     procedure Draw();virtual;
    // procedure GetN();virtual;
     procedure Move(NewX,NewY:integer);
     end;
 
     constructor tLocation.Create(InitX, InitY: Integer);
     begin
        x := InitX;
        y := InitY;
     end;
     
     procedure tLocation.Move(NewX,NewY:integer);
     begin
        Hide();
        x:=NewX;
        y:=NewY;
        Draw();
     end;
     
     procedure tLocation.Hide();
     begin
     
     end;
     
     procedure tLocation.Draw();
     begin
     end;
     
     //procedure tLocation.GetN();
     //begin
     //end;
     
 
  
type
  tPoint=class(tLocation)
    private
    
      col: Color;
    public
    constructor Create(initX,initY:integer; InitColor: Color);
    procedure Hide();override;
    procedure Draw();override;
    procedure GetN(GetX,GetY:integer);//override;
    
    end;
    
    constructor tPoint.Create(initX,initY:integer; InitColor: Color);
      begin
        inherited Create (initX,initY);
        col := InitColor;
      end;
    
    procedure tPoint.Draw();
       begin
        PutPixel(x, y, col);
       end;  
       
     procedure tPoint.Hide();
       begin
        PutPixel(x, y, clBlack);
       end;  
    procedure tPoint.GetN(GetX,GetY:integer);
    
    begin
    GetX:=x;
    GetY:=y;
    end;
    
 var
  mas:array of tPoint;//глобальная переменая массив точек
      
 procedure btnStart_OnClick;
 var i,x,y:integer;
 begin
 for i := 0 to n-1 do
  begin
   x := Random(GetMaxX);//задаем новые коордиинаты 
   y := Random(GetMaxY);
   mas[i].Move(x,y);//рисуем на новом месте
  end; 
end;
 
 
 
{for var i := 0 to n-1 do
  begin
   mas[i]:= tPoint.Create(x,y,col);
   
   case Key of
    
    VK_Left: x := x - h;
    VK_Right: x := x + h;
    VK_Up: y := y - h;
    VK_Down: y := y + h;
   end; 
   mas[i].Move(x,y);
  end; }
 
 
 
 
var
  i:integer;
  btnStart: ButtonABC;   
 begin  
 Randomize;
 SetLength (mas,n);
 SetWindowTitle('окно1');
 SetWindowWidth(GetMaxX);
 SetWindowHeight(GetMaxY);
 Window.CenterOnScreen();
 Window.IsFixedSize := true;
 Window.Clear(Color.black);
 for i:=0 to n-1 do
  begin
   mas[i]:= tPoint.Create(Random(GetMaxX),Random(GetmaxY),clrandom);//задаем исходное небо
   mas[i].Draw;//рисуем
   
  end; 
  
  //КНОПКА
 btnStart := new ButtonABC(10, 10, 100, 30, 'Новое небо!', clMoneyGreen); 
 btnStart.FontColor:= Color.Red;
 btnStart.FontStyle:= fsBold; 
 btnStart.TextScale:= 0.9;
 //процедура-обработчик:
 btnStart.OnClick := btnStart_OnClick; 
 //OnKeyDown := KeyDown; 
end.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.10.2014, 18:14
Цитата Сообщение от kolyaz Посмотреть сообщение
вот это чудовище двигаться
Что должно двигаться?
0
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
03.10.2014, 18:23  [ТС]
пиксели с шагом "h"
например кнопка стрелка вверх - все пиксели побежали с шагом "h" и т.д.
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.10.2014, 18:37
Добавь метод например
Pascal
1
2
3
4
5
6
7
procedure tPoint.MoveTo(dX,dY:integer);
     begin
        Hide();
        x:=x+dX;
        y:=y+dY;
        Draw();
     end;
Создай обработчик нажатия клавиш
Pascal
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
procedure KeyDown(Key: integer);
var i:integer;
begin
  case Key of
   VK_Left:begin
           for i := 0 to n-1 do
           mas[i].MoveTo(-h,0);//влево
           end;
   VK_Right:begin
            for i := 0 to n-1 do
            mas[i].MoveTo(h,0);//вправо
           end;
   VK_Up: begin
          for i := 0 to n-1 do
          mas[i].MoveTo(0,-h);//вверх
          end;
   VK_Down:begin
           for i := 0 to n-1 do
           mas[i].MoveTo(0,h);//вниз
           end;
  end;
end;
В программе вызывай его когда нужно
Pascal
1
OnKeyDown:=KeyDown;
0
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
03.10.2014, 18:44  [ТС]
А как это сделать с общим методом для всех
Pascal
1
2
3
4
5
6
7
procedure tLocation.Move(NewX,NewY:integer);
     begin
        Hide();
        x:=NewX;
        y:=NewY;
        Draw();
     end;
т. к. дальше прийдётся работатать и с другими объектами но с одним "родительским" Move
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.10.2014, 18:47
Лучший ответ Сообщение было отмечено kolyaz как решение

Решение

Да как все делал, так и делай, как с методом Move.
Вообще принято метод рисования на новом месте называть MoveTo, а сдвиги Move
1
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
03.10.2014, 18:58  [ТС]
СппаааСиииииБО!!!!!!!
Посоветуйте литературу по теме чтоб меньше доставал
0
Почетный модератор
 Аватар для Puporev
64315 / 47611 / 32743
Регистрация: 18.05.2008
Сообщений: 115,167
03.10.2014, 19:05
Я не знаю конкретной литературы. Начинал с Турбо Паскаля, основы получил, потом Делфи, потом АВС, везде есть похожее, методом тыка подбираю.

Добавлено через 1 минуту
А в Паскаль АВС основное это встроенная Справка, и в простом и в .net
Кстати если пишешь в .net то там и создавай темы, не пудри людям мозги простым АВС
0
1 / 1 / 1
Регистрация: 13.08.2014
Сообщений: 65
03.10.2014, 19:10  [ТС]
Всё или не чего, и не иначе ! Понятно
А тему вроде как перенесли
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
03.10.2014, 19:10
Помогаю со студенческими работами здесь

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Здравствуйте. Подскажите пожалуйста как решить эту проблему: Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта....

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Работаю над игрой. Хочу чтобы объект2 разрушался в то время, когда объект1 подошел к нему. Пользуюсь командой "Destroy", но...

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

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

Ошибка времени выполнения: Ссылка на объект не указывает на экземпляр объекта
Искал на форуме ничего путного не нашёл(тапками не кидайтесь). uses GraphABC,ABCobjects; var object1:rectangleABC;spPl:integer;...


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

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Программа принимает математическое выражение в виде строки и выдаёт его производную в виде строки и вычисляет значение производной при заданном х Логарифм записывается как: (x-2)log(x^2+2) -. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru