Compound data type: Difference between revisions

From Rosetta Code
Content added Content deleted
(Inline::Struct, Class:Struct)
Line 114: Line 114:
'''Interpeter:''' [[Perl]]
'''Interpeter:''' [[Perl]]


# Please verify the code above...

# Using Class::Struct
use Class::Struct;
struct Point => [ x => '$', y => '$' ];
my $point = new Point( x => 1, y => 2 );

# Using Inline::Struct with C code embedded
use Inline C;
my $point = new Inline::Struct::Point(1,2);
__C__
typedef struct Point
{
int x;
int y;
};

# Using Inline C, Struct
use Inline C => <<'END', ENABLE => 'STRUCTS';
struct Point {
int x;
int y;
};
END
my $point = Inline::Struct::Point->new(1,2);
print $point->x, $point->y, "\n";

# Using bytes packed data with pack/unpack
my $point = pack("ii", 1, 2);
my ($x, $y) = unpack("ii", $point);

# Using a hash for storage
my %point = ( x => 1, y => 2);

# Using Win32::API::Struct
use Win32::API;
Win32::API::Struct->typedef( 'Point', qw(
int x;
int y;
));

# Declarative
my $point = new Win32::API::Struct->new( 'Point' );
$point->{x} = 1;
$point->{y} = 2;

# Tie
tie %point, 'Win32::API::Struct', 'Point';
$point{x} = 1;
$point{y} = 2;


# Using C::DynaLib::Struct
use C::DynaLib::Struct;


==[[PHP|PHP TODO]]==
==[[PHP|PHP TODO]]==

Revision as of 18:54, 25 February 2007

Task
Compound data type
You are encouraged to solve this task according to the task description, using any language you may know.

Create a structure Point(x,y)

Ada

Tagged Type

Ada tagged types are extensible through inheritance. The reserved word tagged causes the compiler to create a tag for the type. The tag identifies the position of the type in an inheritance hierarchy.

type Point is tagged record
   X : Integer := 0;
   Y : Integer := 0;
end record;

Record Type

Ada record types are not extensible through inheritance. Without the reserved word tagged the record does not belong to an inheritance hierarchy.

type Point is record
   X : Integer := 0;
   Y : Integer := 0;
end record;

Parameterized Types

An Ada record type can contain a discriminant. The discriminant is used to choose between internal structural representations. Parameterized types were introduced to Ada before tagged types. Inheritance is generally a cleaner solution to multiple representations than is a parameterized type.

type Person (Gender : Gender_Type) is record
   Name   : Name_String;
   Age    : Natural;
   Weight : Float;
   Case Gender is
      when Male =>
         Beard_Length : Float;
      when Female =>
         null;
   end case;
end record;

In this case every person will have the attributes of gender, name, age, and weight. A person with a Male gender will also have a beard length.

BASIC

Interpeter: QuickBasic 4.5, PB 7.1

TYPE Point
  x AS INTEGER
  y AS INTEGER
END TYPE

C

Compiler: GCC, MSVC, BCC, Watcom

Libraries: Standard

 typedef struct Point
 {
   int x;
   int y;
 } Point;

C++

Compiler: GCC, Visual C++, BCC, Watcom

 struct Point
 {
   int x;
   int y;
 };

C#

 struct Point
 {
   public int x, y;
   public Point(int x, int y) {
     this.x = x;
     this.y = y;
   }
 }

D TODO

Compiler: DMD,GDC

Forth TODO

Fortran TODO

IDL

point = {x: 6 , y: 0 } 
point.y = 7
print, point
;=> {       6       7}

Java

class Point
{
  public int x, y;
  public Point() { this(0); }
  public Point(int x0) { this(x0,0); }
  public Point(int x0, int y0) { x = x0; y = y0; }
}

JavaScript TODO


Perl TODO

Interpeter: Perl

 # Please verify the code above...
 # Using Class::Struct
 use Class::Struct;
 struct Point => [ x => '$', y => '$' ];
 my $point = new Point( x => 1, y => 2 );


 # Using Inline::Struct with C code embedded
 use Inline C;
 my $point = new Inline::Struct::Point(1,2);
 
 __C__
 typedef struct Point 
 {
   int x;
   int y;
 };
 # Using Inline C, Struct
 use Inline C => <<'END', ENABLE => 'STRUCTS';
 struct Point {
   int x;
   int y;
 };
 END

 my $point = Inline::Struct::Point->new(1,2);
 print $point->x, $point->y, "\n";
 # Using bytes packed data with pack/unpack
 my $point = pack("ii", 1, 2);
 my ($x, $y) = unpack("ii", $point);
 # Using a hash for storage
 my %point = ( x => 1, y => 2);
 # Using Win32::API::Struct
 use Win32::API;
 Win32::API::Struct->typedef( 'Point', qw(
   int x;
   int y;
 ));
 # Declarative
 my $point = new Win32::API::Struct->new( 'Point' );
 $point->{x} = 1;
 $point->{y} = 2;
 # Tie
 tie %point, 'Win32::API::Struct', 'Point';
 $point{x} = 1;
 $point{y} = 2;


 # Using C::DynaLib::Struct
 use C::DynaLib::Struct;

PHP TODO

Tcl

This appears to be a sub-functionality of a proper associative array:

 array set point {x 4 y 5}
 set point(y) 7
 puts "Point is {$point(x),$point(y)}"
 # => Point is {4,7}

OCaml TODO

 type json point = < x: int; y: int >