[plt-scheme] off (plt) topic (short koan in .c language and a question)

From: Vladimir Konrad (vladimir at ok2home.net)
Date: Fri May 7 15:11:46 EDT 2010

> On Fri, May 7, 2010 at 10:01 AM, vladimir<vladimir at ok2home.net>  wrote:
>>> even without pointers, allocation or dubious-looking type casts:
>>
>> but none of that type casts should give any warning in decent .c
>> compiler (on arch where size of integer equals the size of float in
>> bits).
>
> If I understand the spec properly (which is not clear....) then your
> program was illegal, but the revision was okay, since the spec (I
> think) says that you cannot point to the same address with two
> different types unless one of the types is void*.

I think the program is valid, one can _read_ void* any way
one likes. The program is kinda like this:

  print 4 bytes below as float
    |
    |
[XXXX]  (initialised 4 bytes - the chunk* - the actual bits,
    |     not the variable)
    |
  print the 4 bytes above as integer



I have commented the code and at the very end there is simplification...

(a comment above a line is about this line)

#-------------------------

#include <stdlib.h>
#include <stdio.h>

int main(int argc, char **argv) {
   /* one wants a pointer to a raw ram - blank "piece of paper" */
   void* chunk;

   / * make a particular bit pattern - our (old fashioned) "stamp"

     http://cache.gawker.com/assets/images/gizmodo/2009/03/01.stamp.jpg

   this "stamp" has a name "number"

   */
   const int number = 1234567890;

   /* integer "paper" (used later to hold the bit pattern above,
    as float
    */
   int i;

   /* float "paper" (used later to hold the same bit pattern,
      but as integer
   */
   float f;

   /* allocate untyped chunk of memory -
      create a "blank piece of paper" */
   chunk = calloc(sizeof(int), 1);

   if( chunk == NULL ) {
     printf("cannot allocate\n");
     return 1;
   }
   else {
     /* initialise the blank memory (to particular bit pattern) using
     our "stamp" */
     /* means: initialise (i.e. set bits) in "chunk" as if it
        was integer, using "number" (which is an integer) */
     *(int *) chunk = number;

     /* transfer the bit pattern (from "paper") as if it was float,
        to "paper" f (which is a float */
     f = *(float *) chunk;

     /* transfer the same bit pattern (from "paper") as if it was
        integer, to "paper" i (which is an integer) */
     i = *(int *) chunk;

     /* display 2 different interpretations of the same bit pattern */
     printf("%i\t%f\n", i, f);
   }

   return 0;

}

/* eof */

by the way, in the above, one could just write:

     printf("%i\t%f\n", *(int *) chunk, *(float *) chunk);

(kinda denser, but maybe clearer)

It basicaly means: deallocate chunk as int pointer, deallocate chunk as 
float pointer, print each as proper "type" (i.e. using particular 
interpretation of bits in memory)...


Kind regards,

Vladimir

-- 

Just because you have intelligence like a hammer,
you do not have to treat everyone else like a nail...

     -- Principia Discordia (one of the versions)


Posted on the users mailing list.