From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=0.7 required=5.0 tests=BAYES_00,INVALID_DATE, REPLYTO_WITHOUT_TO_CC autolearn=no autolearn_force=no version=3.4.4 Path: utzoo!utgpu!watserv1!watmath!att!pacbell.com!mips!gumby!murphy From: murphy@mips.COM (Mike Murphy) Newsgroups: comp.lang.ada Subject: Re: "Integer" value of a CHARACTER Keywords: conversion cast representation bit-value 'VALUE Message-ID: <43658@mips.mips.COM> Date: 29 Nov 90 20:52:14 GMT References: <1990Nov28.210856.14960@sctc.com> Sender: news@mips.COM Reply-To: murphy@mips.COM (Mike Murphy) Organization: MIPS Computer Systems, Sunnyvale, CA List-Id: In article <1990Nov28.210856.14960@sctc.com> stachour@sctc.com (Paul Stachour) writes: > > In the (simplified) example below, I am trying to get a hash-value >from several characters in a string. However, I seem to get problems >in doing this. In the example given, I get "constraint-error" on the >attempt to do the "conversion". (V_Name is a 60-char string with an >OK name in it, the first character is a "c".) > >-- ********************************************************** -- >function Hash_Name( > The_Name : in V_Name ) > return Positive is > C: STRING(1..1); >begin > C(1) := The_Name(1); > return POSITIVE'VALUE(C(1..1)); >--1 return POSITIVE'VALUE(The_Name(1)); >end; >-- ********************************************************** -- The type'VALUE(string) attribute returns the type-value that the string image represents. Thus POSITIVE'VALUE("12") = 12, while POSITIVE'VALUE("cat") raises constraint_error, because "cat" is not the image of a positive number. To get a hash value, you want to use the 'POS attribute, e.g. CHARACTER'POS(The_Name(1)) = character'pos('c') = 99 To get a real hash value you probably want to do some arithmetic on the 'pos values of more than one character in the string. If you want to use unchecked_conversion, you could convert four characters at a time to integer (assuming 4-byte integers), or convert one character to a tiny_integer (or whatever 1-byte integer your implementation defines): function to_int is new unchecked_conversion (string, integer); function to_tint is new unchecked_conversion (character, tiny_integer); integer_obj := to_int(The_Name(1..4)); tiny_integer_obj := to_tint(The_Name(1)); -- this is essentially the same as doing a 'pos.