[vox] things that really suck about C!

Kevin Schultz schultkl at ieee.org
Sun Feb 28 20:03:14 PST 2010


Hi Brian,

Sounds like you are the path to a true religious experience! ;D

mod_array() also receives a pass-by-value argument. ;) C copies the pointer.
Variable int b[CAP] is really syntactic sugar for int * b. And so is
mod_array()'s formal parameter int a[], which is the same as int * a. So the
actual and formal parameters match up. And since you are changing what the
pointer points to, all is well when the function returns.

However, if you pass an array (say, int a[]) into a function, and then
attempt to change what variable a points to, it will last only as long as
you are in the function, because a is a copy of the original pointer. For
example, a = calloc(4, sizeof(char));. When the function ends, variable a is
deleted, control returns to main(), and pointer b still points to its
original contents. To get around this, you need to pass a pointer to a
pointer into the function (int **b). :P

I am likely proving your point about C being a detriment to the field! ;D
Let us know if/when you have a true Lisp epiphany. :) I hear it is quite a
revolution in thinking!



On Sun, Feb 28, 2010 at 6:35 PM, Brian Lavender <brian at brie.com> wrote:

> I think if anything, C has been a certain detriment to the field of
> computer science!
>
> One calls a function and the arguments are passed by value. Call a
> function with an array as an argument, and feel free to modify its
> contents!
>
> Certainly, C++ added the idea of reference, but I think Pascal
> simplifies these concepts much better. Yet, Pascal seems to be relegated
> to the status as a legacy language!
>
> brian
>
>
> #include <stdio.h>
>
> #define CAP 10
>
> void mod_array(int a[])
> {
>  a[2] = 5;
> }
>
> void trychange(int a)
> {
>  a = 2;
> }
>
> void reallychange(int *a)
> {
>  *a = 2;
> }
>
> int main() {
>  int b[CAP];
>  int c;
>  int i;
>
>  printf("Load array and change a value\n");
>  for (i=0; i < CAP; i++)
>    b[i] = i + 20;
>
>
>  mod_array(b);
>
>  for (i=0; i < CAP; i++)
>    printf("b[%d] has value of %d\n",i,b[i]);
>
>  c = 10;
>
>  printf("c has a value of %d\n",c);
>  trychange(c);
>
>  printf("c has a value of %d after trychange(c)\n",c);
>
>  reallychange(&c);
>
>  printf("c has a value of %d after reallychange(&c)\n",c);
>
>
> }
>
> --
> Brian Lavender
> http://www.brie.com/brian/
>
> "There are two ways of constructing a software design. One way is to
> make it so simple that there are obviously no deficiencies. And the other
> way is to make it so complicated that there are no obvious deficiencies."
>
> Professor C. A. R. Hoare
> The 1980 Turing award lecture
> _______________________________________________
> vox mailing list
> vox at lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: http://lists.lugod.org/pipermail/vox/attachments/20100228/7d8c220d/attachment.htm 


More information about the vox mailing list