Declare dynamic array or change array size

I need to define an array with a dimension that is previously calculated:

PROC myprogram(num arraysize)
VAR num myarray{arraysize};

ENDPROC

RAPID returns an error saying arraysize isn’t a constant. So is there any possibility or workaround to achieve that? Or is there even an instruction to append dimensions to an array?

Regards,
Michael

Varibles cannot be dynamically allocated during run-time in RAPID. What you can do is to declare the array to be large, 128, say. And then use a num variable to point out the last valid element. Something like this perhaps


MODULE apa

CONST num maxarraysize := 128;
VAR num myarray{128};
VAR num arraysize:=0;
VAR num currentarraysize:=0;

PROC main()
initarray;
insertelement(2);
insertelement(45);
insertelement(673);
printarray;
ENDPROC

PROC initarray()
currentarraysize:=0;
ENDPROC

PROC insertelement(num element)
currentarraysize:=currentarraysize+1;
myarray{currentarraysize}:=element;
ENDPROC

PROC printarray()
FOR i FROM 1 TO currentarraysize DO
TPWrite "Element myarray{" + NumToStr(i,0) + "} = " + numtostr(myarray{i},0);
ENDFOR
ENDPROC
ENDMODULE

Hello @Henrik_Berlin or anyone else,

I am facing exactly the same problem.
It seems like it is still the same 15 years later, but has a new workaround been developped since then ?
Is there any alternative anyone konws about, except from oversizing the array at the beginning ?

Hi…

When the encounter is a problem I use Array as a parameter…

See the example to read the file…

	PROC FileContentRead(INOUT string contentP{*},string pathFileP)
         ! ## ATTRIBUTES ###########################################################################
         VAR iodev fileIodevReadL;
         VAR num indexL:=1;
         ! ## ATTRIBUTES ###########################################################################

         ! Open the file for Writing...
         Open pathFileP,fileIodevReadL\Read;

		 ! Iterates through the array for reading...
         WHILE indexL<=Dim(contentP,1) DO
             contentP{indexL}:=ReadStr(fileIodevReadL\RemoveCR\DiscardHeaders);

             Incr indexL;
         ENDWHILE

         Close fileIodevReadL;

         RETURN ;
     ERROR
         ! ################################################ #########################################
         ! HANDLING OF POSSIBLE ERRORS
         ! ################################################ #########################################

         ! If an error is found, it displays a message and exits the program...
         IF ERRNO=ERR_FILEACC THEN
             ! Clean the screen...
             TPErase;

             ErrWrite "ERR_FILEACC","Error reading file"
                 \RL2:="An error occurred while reading the parameter file."
                 \RL3:="Action:"
                 \RL4:="Check the file syntax.";

             ! Close the file.
             Close fileIodevReadL;

             Stop;
             Stop;

             EXIT;
         ENDIF
     ENDPROC

Good Works.