5 ms·
Ranged types are directly from Pascal. You can also use them to specify the valid indexes for an array (so a given array might be zero-based, or one-based, or
by drfuchs 6y ago
Ranged types are directly from Pascal. You can also use them to specify the valid indexes for an array (so a given array might be zero-based, or one-based, or 1900-based, or even -32768-based). A very positive feature, I agree.
- Jtsummers 6y agoAnd, even better, arrays in Ada (can't speak to Pascal) can be any discrete type so long as it is a range: type Character_Histogram is Array (range 'A'..'Z') of Integer; -- syntax may be off, not enough practice to do this cold right now
- Avshalom 6y agoI don't think it even needs to be a range, you can index using enums
- Jtsummers 6y agoWell, "range" was not the correct term. What I meant is that you can't treat the source as sparse. You can't skip portions of it. So you can't make an array that only covers every other element of this enumeration: type Colors is (Red, Green, Blue, Black, Gray, White); It has to be a consecutive group of them, taken in order, as the specification of even this enumeration has an ordering to it as far as Ada is concerned. So I can make an array using all of Colors as the index, or some subset but it has to be, say, Red..Blue and not Red|Blue skipping over Green.
- Lucretia9 6y agoAda 2012 allows you to define gaps, this is my best example I have available https://github.com/Lucretia/sdlada/blob/master/src/sdl-video-pixel_formats.ads#L87 https://github.com/Lucretia/sdlada/blob/master/src/sdl-video...
- Jtsummers 6y agoThat is great to read, and probably a sign that my learning materials should be updated. I'll try to remember this in the future.
- FpUser 6y agotype TPerson = record name: string; age: integer; end; TThrteenPersons = array[10..22] of TPerson; procedure Check(const aPerson: TPerson); var vPerson: TThrteenPersons; begin vPerson[11] := aPerson; // this is ok vPerson[1] := aPerson; // this one gives compile error end; alternatively if runtime range checking is on then vPerson[i] = aPerson will raise the exception if i is out of range
- Jtsummers 6y agoRight. I know it works with numeric indexes in Pascal. My point was that (using my previous example) in Ada it works with any discrete type, in that case characters (which are not numbers in disguise in Ada) so I can do this: Histogram : Character_Histogram; ... Histogram['A'] := Histogram['A'] + 1; (Ok, a bit more work because I didn't initialize the histogram to 0.)
- Lucretia9 6y agoSquare brackets are coming, so you'd have to use ('A')
- Jtsummers 6y agoHah, I've been in Go lately so my brain defaulted to the wrong thing in that example.
- FpUser 6y agoPascal (well Delphi/FreePascal incarnation) also works with chars and enums. This modern pascal is very feature rich and has plenty of fancy bells and whistles.
- drfuchs 6y agoWirth's original, standard Pascal allowed for int/char/bool/enum, and ranges thereof, as array bounds; it wasn't a Delphi enhancement.
- kwhitefoot 6y agoIn Pascal you can use any ordinal type as the type of the array index. You can create a new type from a range of ordinal values. So you can have arrays where the index runs from -10 to +20 or from +7 to +26 for instance. Booleans are also ordinal types so you can have an array where the index is boolean.