Create a two-dimensional array at runtime

From Rosetta Code

cheap diethylpropion xenical online cheap clonazepam nokia ringtones mp3 ringtones free kyocera ringtones rivotril online paxil online nexium online pharmacy online online cheap ambien fioricet paxil online free cool ringtones buy nexium cheap zoloft tenuate mtv ringtones order diazepam flexeril online rivotril online sonyericsson ringtones buy hoodia punk ringtones motorola ringtones cheap nexium zyban online soma online cyclobenzaprine online cheap xenical nextel ringtones cheap ultram cheap carisoprodol free motorola ringtones mtv ringtones alltel ringtones wwe ringtones celexa online buy zoloft diazepam online free tracfone ringtones free music ringtones pharmacy online online viagra online cheap hydrocodone norco online verizon ringtones carisoprodol online alltel ringtones xanax online cheap soma propecia online buy paxil cheap rivotril online hoodia sony ericsson ringtones flexeril online lorazepam online alprazolam online cheap carisoprodol free qwest ringtones tenuate online lortab online kyocera ringtones cheap sildenafil vicodin online alprazolam online sharp ringtones free punk ringtones but vigrx meridia online qwest ringtones free nextel ringtones cyclobenzaprine online jazz ringtones buy zyban online cialis diazepam online diethylpropion online kyocera ringtones zanaflex online cheap ultram order ambien mp3 ringtones free music ringtones cheap zoloft lortab online cheap xanax cheap vigrx cheap albuterol free kyocera ringtones free mono ringtones cheap lipitor buy propecia buy xanax propecia online free ericsson ringtones ortho online buy hgh tracfone ringtones clomid online buy tramadol cheap vigrx free motorola ringtones free real ringtones meridia online ortho online polyphonic ringtones ultracet online nextel ringtones lisinopril online free sony ericsson ringtones sony ericsson ringtones alltel ringtones free nokia ringtones cheap cialis cheap viagra real ringtones cheap celexa valium online free nokia ringtones levitra online free nokia ringtones nexium free cingular ringtones polyphonic ringtones diethylpropion online tenuate online cheap cialis free jazz ringtones free online pharmacy phentermine free motorola ringtones levitra online mono ringtones zyban online free samsung ringtones mp3 ringtones cheap soma cheap ultram cheap ambien vicodin online vicodin online funny ringtones zanaflex buy albuterol nexium online propecia online but ambien free nokia ringtones online alprazolam cheap viagra cheap ultracet hoodia online cheap cyclobenzaprine free ringtones cheap phentermine cheap soma real ringtones jazz ringtones online vicodin zyban online ericsson ringtones free sagem ringtones diazepam online free sharp ringtones cingular ringtones but adipex free verizon ringtones free qwest ringtones clonazepam online buy zanaflex mtv ringtones free mtv ringtones free kyocera ringtones sony ericsson ringtones cheap tenuate real ringtones cheap valium paxil online cheap didrex sildenafil online free nextel ringtones free midi ringtones cheap ativan xanax online buy cyclobenzaprine cheap lorazepam alltel ringtones cheap didrex mp3 ringtones cingular ringtones tracfone ringtones xanax online free tracfone ringtones norco online fioricet online cheap lorazepam free ringtones viagra online

Task
Create a two-dimensional array at runtime
You are encouraged to solve this task according to the task description, using any language you may know.

Get two integers from the user, then create a two-dimensional array where the two dimensions have the sizes given by those numbers, and which can be accessed in the most natural way possible. Write some element of that array, and then oputput that element. Finally destroy the array if not done by the language itself.

Ada

with Ada.Text_Io; use Ada.Text_Io;
with Ada.Float_Text_Io; use Ada.Float_Text_Io;
with Ada.Integer_Text_Io; use Ada.Integer_Text_Io;

procedure Two_Dimensional_Arrays is
   type Matrix_Type is array(Positive range <>, Positive range <>) of Float;
   Dim_1 : Positive;
   Dim_2 : Positive;
begin
   Get(Item => Dim_1);
   Get(Item => Dim_2);
   -- Create an inner block with the correctly sized array
   declare
      Matrix : Matrix_Type(1..Dim_1, 1..Dim_2);
   begin
      Matrix(1, Dim_2) := 3.14159;
      Put(Item => Matrix(1, Dim_2), Fore => 1, Aft => 5, Exp => 0);
      New_Line;
   end;
   -- The variable Matrix is popped off the stack automatically
end Two_Dimensional_Arrays;


C

With language built-in facilities:

#include <iostream>
#include <istream>
#include <ostream>

int main()
{
  // read values
  int dim1, dim2;
  std::cin >> dim1 >> dim2;

  // create array
  double* array_data = new double[dim1*dim2];
  double** array = new double*[dim1];
  for (int i = 0; i < dim1;   i)
    array[i] = array_data   dim2*i;

  // write element
  array[0][0] = 3.5;

  // output element
  std::cout << array[0][0] << std::endl;

  // get rid of array
  delete[] array;
  delete[] array_data;
}

Using std::vector from the standard library:

#include <iostream>
#include <istream>
#include <ostream>
#include <vector>

int main()
{
  // read values
  int dim1, dim2;
  std::cin >> dim1 >> dim2;

  // create array
  std::vector<std::vector<double> > array(dim1, std::vector<double>(dim2));

  // write element
  array[0][0] = 3.5;

  // output element
  std::cout << array[0][0] << std::endl;

  // the array is automatically freed at the end of main()
}

Clean

import StdEnv

Start :: *World -> { {Real} }
Start world
    # (console, world) = stdio world
      (_, dim1, console) = freadi console
      (_, dim2, console) = freadi console
    = createArray dim1 (createArray dim2 1.0)

Common Lisp

(let ((d1 (read))
      (d2 (read)))
  (assert (and (typep d1 '(integer 1)) 
               (typep d2 '(integer 1))) 
          (d1 d2))
  (let ((array (make-array (list d1 d2) :initial-element nil))
        (p1 0)
        (p2 (floor d2 2)))
    (setf (aref array p1 p2) t)
    (print (aref array p1 p2))))

The assert will allow the user to reenter the dimensions if they are not positive integers.

Java

import java.io.*;

public class twoDimArray {
  public static void main(String[] args) {
     try {
        BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
        
        int nbr1 = Integer.parseInt(in.readLine());
        int nbr2 = Integer.parseInt(in.readLine());
        
        Double[][] array = new Double[nbr1][nbr2];
        array[0][0] = 42.0;
        System.out.println("The number at place [0 0] is "   array[0][0]);
        
     } catch(IOException e) { }
  }
} 


Perl

Interpreter: Perl 5.x

Predefining an array (or multi-dimension array) size is unnecessary, Perl dynamically resizes the array to meet the requirements. Of course I'm assuming that the user is entering array size 0 based.

sub make_array($ $){
  # get array sizes from provided params, but force numeric value
  my $x = ($_[0] =~ /^\d $/) ? shift : 0;
  my $y = ($_[0] =~ /^\d $/) ? shift : 0;
  
  # define array, then add multi-dimensional elements
  my @array;
  $array[0][0] = 'X '; # first by first element
  $array[5][7] = 'X ' if (5 <= $y and 7 <= $x); # sixth by eighth element, if the max size is big enough
  $array[12][15] = 'X ' if (12 <= $y and 15 <= $x); # thirteeth by sixteenth element, if the max size is big enough
  
  # loop through the elements expected to exist base on input, and display the elements contents in a grid
  foreach my $dy (0 .. $y){
    foreach my $dx (0 .. $x){
      (defined $array[$dy][$dx]) ? (print $array[$dy][$dx]) : (print '. ');
    }
    print "\n";
  }
}

Pop11

vars itemrep;
incharitem(charin) -> itemrep;
;;; Read sizes
vars n1 = itemrep(), n2= itemrep();
;;; Create 0 based array
vars ar = newarray([0 ^(n1 - 1) 0 ^(n2 - 1)], 0);
;;; Set element value
15 -> ar(0, 0);
;;; Print element value
ar(0,0) =>
;;; Make sure array is unreferenced
0 -> ar;

Pop11 is garbage colleted so there is no need to destroy array. However, the array is live as long as variable ar references it. The last assignment makes sure that we loose all our references to the array turning it into garbage.

Pop11 arrays may have arbitrary lower bounds, since we are given only size we create 0 based array.

Python

Interpreter: Python 2.5

 width = int(raw_input("Width of array: "))
 height = int(raw_input("Height of Array: "))
 array = [[0] * width for i in range(height)]
 array[0][0] = 3.5

Note: Some people may instinctively try to write array as [[0] * with] * height, but the * operator creates n references to [[0] * width]

IDL

The following is only for demonstration. No real program should just assume that the user input is valid, integer, large enough etc.

read, x, prompt='Enter x size:'
read, y, prompt='Enter y size:'
d = fltarr(x,y) 

d[3,4] = 5.6
print,d[3,4]
;==> outputs  5.6

delvar, d

Toka

Toka has no direct support for 2D arrays, but they can be created and operated on in a manner similar to normal arrays using the following functions.

[ ( x y -- address )
  cells malloc >r
  dup cells >r
  [ r> r> r> 2dup >r >r swap malloc swap i swap put-element >r ] iterate
r> r> nip
] is 2D-array
[ ( a b address -- value )
  get-element get-element
] is 2D-get-element
[ ( value a b address -- )
  get-element put-element
] is 2D-put-element

And a short test:

5 5 2D-array >r             #! Create an array and save the pointer to it
10 2 3 r@ 2D-put-element    #! Set element 2,3 to 10
2 3 r@ 2D-get-element       #! Get the element at 2,3
r> drop                     #! Discard the pointer to the array