0

I would like to be able to declare a constant array of fixed length string for a GTK ComboBox. Is it possible to do with two parameters in ADA?

This code allows the size of the array to be set by declaring the strings. Is it possible to replace the constant in the spec with a parameter somehow?

A simple array does not allow a discriminant. A discriminant record does not permit an anonymous array.

Edit:

Can I somehow declare a type equivalent to the form:

type ArrayOfStrings( sringlength : positive; arraysize : positive ) array( 1..arraysize ) of string( 1..stringlength );

This form is not possible because an array can not have a discriminant.

OR

subtype SelectorString is string;

type SelectorStringArray( arraysize : positive; stringlength : positive ) is record stringarray : array( 1..arraysize ) of SelectorString( 1..stringlength ); end record;

This form is not possible because a record can not have anonymous arrays.

Answered:

The following works,

package Selectors.Strings is

subtype ArrayIndex is positive range 1..64; -- maximum entries in ComboBox

subtype TextIndex is positive range 1..32; -- maximum entry length

type SelectorStringArray is array( arrayindex range <>, textindex range <> ) of character;

function StringSelector( stringarray : SelectorStringArray ) return ArrayIndex;

sel : SelectorStringArray := ( "aa", "bb", "cc", "dd" );

end Selectors.Strings;

The strings in sel must all be the same length.

Thanks,

old engineer

package Selectors.Strings is SelectorStringLength : constant := 2; subtype SelectorString is string( 1..SelectorStringLength ); type SelectorStringArray is array( positive range <> ) of SelectorString; subtype SelectorStringIndex is positive; function StringSelector( stringarray : SelectorStringArray ) return SelectorStringIndex; selectarray : SelectorStringArray := ( "aa", "bb", "cc", "dd" ); end Selectors.Strings; 
2
  • "Is it possible to replace the constant in the spec with a parameter" ... a parameter to what? Are you saying you want to add a procedure that takes a SelectorStringArray parameter and sets selectarray? Commented Apr 3, 2014 at 3:39
  • P.S. Ada is a computer language, ADA is a professional society for dentists. Commented Apr 3, 2014 at 3:49

1 Answer 1

0

I'm not clear on what you're looking for, but you don't have any anonymous arrays in the above code, and you can have a discriminant record type whose component is a named array type. So I'm not sure what your statement "A discriminant record does not permit an anonymous array" is referring to.

Suppose selectarray can have at most 100 strings:

subtype Select_Array_Size is Integer range 0 .. 100; type Selector_Strings (Size : Select_Array_Size := 0) is record Data : SelectorStringArray (1 .. Size); end record; procedure Set_Select_Array (Data : SelectorStringArray); selectarray : Selector_Strings; -- will be initialized with Size=>0, -- Data=>an array of length 0 

and in the body

procedure Set_Select_Array (Data : SelectorStringArray) is begin selectarray := (Size => Data'Length, Data => Data); end Set_Select_Array; 

and then use selectarray.Data instead of selectarray to access the data.

You need a maximum array length because some compilers will allocate as much space as the maximum possible size for the Data component of Selector_Strings.

The other option is to make selectarray an access to the array type.

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.