简体   繁体   中英

Ada Record Initialization: “Constraint_Error”

I'm trying to insert new elements in a record. I have default values set in the record and looked up how to initialize a record, but the compiler keeps saying, "warning: null value not allowed here," "warning: 'Constraint_Error' will be raised at run time." The following is the block I am working on.

type employee;
type employeePtr is access employee;
type employee is
record
  id : Integer := 0;
  name : Unbounded_String := To_Unbounded_String("");
  departmentname : Unbounded_String := To_Unbounded_String("");
  jobtitle : Unbounded_String := To_Unbounded_String("");
  payrate : Unbounded_String := To_Unbounded_String("");
  next : employeePtr := null;
end record;

employeeList : employeePtr;

procedure insertNew(employeeid : Unbounded_String; employeename : Unbounded_String; department : Unbounded_String; title : Unbounded_String; rate : Unbounded_String) is
  currentEmployee : employeePtr;
  --tmp : employeePtr := employeePtr'(id => 0, name => "", departmentname => "", jobtitle => "", payrate => "");
  tmp : employeePtr;
  tmpSkp : employeePtr;
  eid : Integer;
  placeAtEnd : Integer;
begin
  eid := Integer'Value(To_String(employeeid));
  tmp.id := eid;
  tmp.name := employeename;
  tmp.departmentname := department;
  tmp.jobtitle := title;
  tmp.payrate := rate;

  if employeeList.id = 0 then
     employeeList := tmp;
  else
     placeAtEnd := 1;
     while currentEmployee.next /= null loop
        if currentEmployee.next.id > eid then
           tmpSkp := currentEmployee.next;
           tmp.next := tmpSkp;
           currentEmployee.next := tmp;
           placeAtEnd := 0;
           exit;
        else
           currentEmployee := currentEmployee.next;
        end if;
     end loop;
     if placeAtEnd = 1 then
        currentEmployee.next := tmp;
     end if;
  end if;
end insertNew;

Right after begin , where I am trying to set the values of members of tmp, is where I am getting these errors. Am I initializing the record incorrectly? Is there something similar to try/catch from Java that could fix this?

Compiling with -gnatl (inside a wrapper, so the line numbers are off by 3) gives

21.       tmp : employeePtr;

All access variables are default-initialized to null . I'd have written

          tmp : constant employeePtr := new employee;

( constant because you're not going to change the pointer, just what it points to).

Returning to the code,

27.       tmp.id := eid;
          |
    >>> warning: null value not allowed here
    >>> warning: "Constraint_Error" will be raised at run time

because Constraint_Error is the required run time error for accessing via a null pointer.

28.       tmp.name := employeename;
          |
    >>> warning: null value not allowed here
    >>> warning: "Constraint_Error" will be raised at run time

29.       tmp.departmentname := department;
          |
    >>> warning: "tmp" may be null

I think the compiler has stopped adding detail to the repeated warning.

30.       tmp.jobtitle := title;
31.       tmp.payrate := rate;

and now it's stopped warning at all.

I didn't know that new is something in Ada, but that was the problem. Similar to malloc, in order to initialize an instance of a record, you use the keyword new , just like in Java.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM