🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: comp.lang.modula2
1 messages
1 total messages Started by Robert Nagler Mon, 24 Aug 1987 15:09
Re: Pointers and whatnot
#3768
Author: Robert Nagler
Date: Mon, 24 Aug 1987 15:09
87 lines
4283 bytes
    >In that above case, Text is 80 chars, but suppose the length of Text varies.
    >How would I be able to change the type?

    >Or suppose I just want 137 bytes of storage of no particular type, can one
    >have just a POINTER with no TO?  According to my compiler, no (Logitech
    >Modula-2/86).

Sorry, there are no dynamic arrays in Modula-2.  This is a fundamental
problem with the language.  I have seen that the BSI language committee
has been talking about a new type of "String", but this is not a general
solution to supporting dynamically defined bounds for array types.

There are several ways around your problem:
    1) Use another language which supports real dynamic arrays.
    2) Go for the C-style management of arrays as POINTER TO CHAR and
       increment the pointer yourself to get the desired value.
    3) Declare BigArray = POINTER TO ARRAY [ 0 .. MAX( CARDINAL ) ] OF CHAR.
       When you want to use a variable of that type, you just partially
       allocate the array, e.g. ALLOCATE( p, theAmountIWant ).  However,
       you must be careful to do your own range checking.
    4) Allocate an array which is "big enough", but just remember that 
       "big enough" is never "big enough"!
    
After using M2 for several years, I find approach (3) is the best when
coupled with an opaque interface.  Here is an example:
    DEFINITION MODULE Vectors;
    TYPE
	Object;	
    PROCEDURE Create( vector : Object;
		      length : CARDINAL );
    PROCEDURE Destroy( vector : Object );
    PROCEDURE Get( vector : Object;
		   index  : CARDINAL )
			  : REAL;
    PROCEDURE Set( vector   : Object;
		   index    : CARDINAL;
		   newValue : REAL );
    END Vectors.

The implementation of this module does type checking, thus if an
index is out of bounds, the program crashes (just as if it were 
caught by the run-time system).   Here is what a Vectors.Object looks
like:
    IMPLEMENTATION MODULE Vectors; 
    CONST
	(* The following line is system dependent *)
	maxHigh   = ( SysTypes.MAXCARDINAL DIV SysTypes.bitsPerREAL
		      * SysTypes.bitsPerBYTE ) - 2;
    TYPE
	Object    = POINTER TO ObjectRec;
	ObjectRec = RECORD
	    high : CARDINAL;
	    data : POINTER TO ARRAY [ 0 .. maxHigh ] OF REAL;
	END;

The implementation of Get looks like:
    WITH vector^ DO
	IF index > high THEN
	    ProgErrs.Terminate( "Vectors: range error" );
	END;

	RETURN data^[ index ];
    END; (* WITH *)

The only problems you have is in being careful that the allocation of
"data" is done correctly.  It has been our experience that naive users
will often make mistakes implementing such modules.  However, once 
implemented, the module provides a very clean interface to dynamic 
length objects (whatever they may be, in this case, Vectors of REALs).

There are a couple of points here.  First, we have a fairly advanced
debugging environment which includes an "object allocator".  We don't
usually have problems catching improperly allocated memory areas.  
Second, this method is not a panacea, that is, the general "string"
problem will only be solved with a language modification (I believe).
Strings are so critical to most programs that we did not implement
an object oriented Strings interface.  Instead, we have chosen solution
(4) in combination with some much higher level functions which do
use dynamic allocation of strings.

Applications like Vectors turn out to be faster than just plain
ol' arrays when accompanied by higher level functions, e.g. ComputeFx, 
Multiply, Add, Subtract, ...  We have even found a significant speedup 
after introducing this type of abstraction (as one would expect!).

Rob
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads