Compound data type: Difference between revisions
No edit summary |
Added more detailed description |
||
Line 6: | Line 6: | ||
- For instance, by using pack/unpack internally on some scripting language. |
- For instance, by using pack/unpack internally on some scripting language. |
||
- For a given object point with x=1 and y=2, the byte stream should be on x86 32-bit machines: |
- For a given object point with x=1 and y=2, the byte stream should be on x86 32-bit machines: |
||
[0x01 0x00 0x00 0x00 |0x02 0x00 0x00 0x00] |
[0x01 0x00 0x00 0x00 | 0x02 0x00 0x00 0x00] |
||
</div> |
</div> |
||
Revision as of 19:26, 25 February 2007
![Task](http://static.miraheze.org/rosettacodewiki/thumb/b/ba/Rcode-button-task-crushed.png/64px-Rcode-button-task-crushed.png)
You are encouraged to solve this task according to the task description, using any language you may know.
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
Forth TODO
Fortran TODO
IDL
point = {x: 6 , y: 0 } point.y = 7 print, point ;=> { 6 7}
Java TODO
// The byte structure format does not exist natively --> TODO. public 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; }
public static void main(String args[]) { Point point = new Point(1,2); System.out.println("x = " + point.x ); System.out.println("y = " + point.y ); } }
JavaScript TODO
var point = new Object(); point.x = 1; point.y = 2;
JSON TODO
var point = { x:1, y:2 };
Perl TODO
Interpeter: Perl
# Please verify the code above... (from CPAN docs, not tested)
# 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; Define C::DynaLib::Struct('Point', 'ii', [qw(x y)]);
# Using C::Include use C::Include qw(point.h -cache); my $point = $include->make_struct( 'Point' );
point.h: #ifdef __PERL__ // Anything that should be parsed by C::Include only #endif typedef struct Point { int x; int y; } Point;
PHP TODO
# Using pack/unpack $point = pack("ii", 1, 2);
$u = unpack("ix/iy", $point); echo $x; echo $y;
list($x,$y) = unpack("ii", $point); echo $x; echo $y;
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 >