2015-09-07 5 views
1

Это PointClass.pas
Получите нарушение доступа, когда я запускаю программу pascal, как ее решить? (С бесплатным паскаль)

{$mode objfpc} // Directive to be used for defining classes 
{$m+}   // Directive to be used for using constructor 

UNIT PointClass ; 
INTERFACE 
TYPE Point = CLASS(TObject) 
    PRIVATE 
     x : INTEGER ; 
     y : INTEGER ; 
    PUBLIC   
     (* Setter *) 
     PROCEDURE setX (ix : INTEGER) ; 
     PROCEDURE setY (iy : INTEGER) ; 
     PROCEDURE setPoint (ix, iy : INTEGER) ; 

     (* Getter *) 
     FUNCTION getX : INTEGER ; 
     FUNCTION getY : INTEGER ; 
END; 

IMPLEMENTATION 
USES Classes, SysUtils ; 

PROCEDURE Point.setX (ix : INTEGER) ; 
BEGIN 
    x := ix ; {line 26} 
END ; 

PROCEDURE Point.setY (iy : INTEGER) ; 
BEGIN 
    y := iy ; 
END ; 

PROCEDURE Point.setPoint (ix, iy : INTEGER) ; 
BEGIN 
    x := ix ; 
    y := iy ; 
END ; 

FUNCTION Point.getX : INTEGER ; 
BEGIN 
    getX := x ; 
END ; 

FUNCTION Point.getY : INTEGER ; 
BEGIN 
    getY := y ; 
END ; 
END. 

и Main.pas

PROGRAM TESTSHAPE ; 
USES PointClass ; 
VAR 
    p1 : Point ; 

BEGIN 
    p1.Create ; 

    p1.setX (2) ; {line 9} 
    p1.setY (1) ; 
    WRITELN ('X is ', p1.getX, ' and Y is ', p1.getY) ; 

    p1.setPoint (23, 2) ; 
    WRITELN ('X is ', p1.getX, ' and Y is ', p1.getY) ; 
END. 

компилировать с

fpc -Tlinux -Criot -gl main.pas 


Это может пройти ком штабелер, но когда я запускаю программу, ее сказал:

An unhandled exception occurred at $0000000000422AC5 : 
EAccessViolation : Access violation 
$0000000000422AC5 line 26 of PointClass.pas 
$00000000004001DA line 9 of main.pas 

Я так стараюсь, и найти много, но до сих пор не может решить эту проблему.
(Извините за мой плохой английский!)

+0

линии 9 Main.pas является ** p1.setX (2); ** и линия 26 является PointClass.pas ** x: = ix; ** – BryanChen

ответ

1

Я нашел его. Main.pas является неправильным:

p1.Create ; {Wrong} 

Правильная линия:

p1 := Point.Create ; 
+0

Вы понимаете свою ошибку? Экземпляр класса является ссылкой, это не _whole stuff_, это указатель на _whole stuff_. Конструктор возвращает эту ссылку. –

+0

Я понимаю. Иногда я слишком осторожен при кодировании. Спасибо, @Nestedtype – BryanChen

 Смежные вопросы

  • Нет связанных вопросов^_^