Variable size/Set: Difference between revisions
Line 41: | Line 41: | ||
For compatibility with the calling conventions of external C functions, the [http://docs.python.org/library/ctypes.html?highlight=ctypes#module-ctypes ctypes module] has functions that map data types and sizes between Python and C: |
For compatibility with the calling conventions of external C functions, the [http://docs.python.org/library/ctypes.html?highlight=ctypes#module-ctypes ctypes module] has functions that map data types and sizes between Python and C: |
||
<table class="docutils" border="1"> |
<table class="docutils" border="1"> |
||
<tr> |
|||
<th class="head">ctypes type</th> |
<th class="head">ctypes type</th> |
||
<th class="head">C type</th> |
<th class="head">C type</th> |
||
Line 103: | Line 103: | ||
<tr> |
<tr> |
||
<td>c_ulonglong</td> |
<td>c_ulonglong</td> |
||
<td>unsigned __int64 or</ |
<td>unsigned __int64 or unsigned long long</td> |
||
<td>int/long</td> |
|||
<lang python> <td>int/long</td> |
|||
</tr> |
</tr> |
||
<tr> |
<tr> |
||
Line 136: | Line 135: | ||
<td>void *</td> |
<td>void *</td> |
||
<td>int/long or None</td> |
<td>int/long or None</td> |
||
</tr |
</tr> |
||
</table> |
</table> |
||
Revision as of 05:03, 8 February 2010
You are encouraged to solve this task according to the task description, using any language you may know.
Demonstrate how to specify the minimum size of a variable or a data type.
Ada
<lang ada>type Response is (Yes, No); -- Definition of an enumeration type with two values for Response'Size use 1; -- Setting the size of Response to 1 bit, rather than the default single byte size</lang>
C
<lang c>#include <stdint.h>
int_least32_t foo;</lang>
Here foo is a signed integer with at least 32 bits. stdint.h also defines minimum-width types for at least 8, 16, 32, and 64 bits, as well as unsigned integer types.
D
In D, any variables of static array of zero length has a size of zero. But such data is useless, as no base type element can be accessed.
<lang d>typedef long[0] zeroLength ;
writefln(zeroLength.sizeof) ; // print 0</lang>
NOTE: a dynamic array variable's size is always 8 bytes, 4(32-bit) for length and 4 for a reference pointer of the actual storage somewhere in runtime memory.
The proper candidates of minimum size variable are empty structure, 1-byte size data type variable (include byte, ubyte, char and bool), and void, they all occupy 1 byte.
<lang d>byte b ;
ubyte ub ;
char c ;
bool t ;</lang>
bool is logically 1-bit size, but it actually occupy 1 byte.
void can't be declared alone, but void.sizeof gives 1.
An empty structure is logically zero size, but still occupy 1 byte.
<lang d>struct Empty { }
writefln(Empty.sizeof) ; // print 1</lang>
Modula-3
<lang modula3>TYPE UByte = BITS 8 FOR [0..255];</lang> Note that this only works for records, arrays, and objects. Also note that the size in bits must be large enough to hold the entire range (in this case, 8 bits is the correct amount for the range 0 to 255) or the compiler will error.
Perl
I suppose you could use vec() or similar to twiddle a single bit. The thing is, as soon as you store this in a variable, the SV (the underlying C implementation of the most simple data type) already takes a couple dozen of bytes.
In Perl, memory is readily and happily traded for expressiveness and ease of use.
Python
For compatibility with the calling conventions of external C functions, the ctypes module has functions that map data types and sizes between Python and C:
ctypes type | C type | Python type |
---|---|---|
c_char | char | 1-character string |
c_wchar | wchar_t | 1-character unicode string |
c_byte | char | int/long |
c_ubyte | unsigned char | int/long |
c_short | short | int/long |
c_ushort | unsigned short | int/long |
c_int | int | int/long |
c_uint | unsigned int | int/long |
c_long | long | int/long |
c_ulong | unsigned long | int/long |
c_longlong | __int64 or long long | int/long |
c_ulonglong | unsigned __int64 or unsigned long long | int/long |
c_float | float | float |
c_double | double | float |
c_longdouble | long double | float |
c_char_p | char * (NUL terminated) | string or None |
c_wchar_p | wchar_t * (NUL terminated) | unicode or None |
c_void_p | void * | int/long or None |
Tcl
In Tcl, most values are (Unicode) strings. Their size is measured in characters, and the minimum size of a string is of course 0. However, one can arrange, via write traces, that the value of a variable is reformatted to bigger size. Examples, from an interactive tclsh session: <lang Tcl>% proc format_trace {fmt _var el op} {upvar 1 $_var v; set v [format $fmt $v]}
% trace var foo w {format_trace %10s} % puts "/[set foo bar]/" / bar/
% trace var grill w {format_trace %-10s} % puts "/[set grill bar]/" /bar /</lang> ..or limit its size to a certain length: <lang Tcl>% proc range_trace {n _var el op} {upvar 1 $_var v; set v [string range $v 0 [incr n -1]]}
% trace var baz w {range_trace 2} % set baz Frankfurt Fr</lang>