[vox] things that really suck about C!
Brian Lavender
brian at brie.com
Sun Feb 28 21:00:10 PST 2010
I am ranting because of strange experiences like the following two
programs, simplearray2.c and simplearray4.c. They both do the same
thing! But look at the argument to load_arrays in version 2 vs 4.
You can compile them with the following (you have to have libglib-2.0
installed for Ubuntu at least).
gcc `pkg-config --libs --cflags glib-2.0` simplearray2.c -o simplearray2
Yes, you are correct, I am on a pilgrimage. Right now, it's for my
Master's Project!
brian
=== simplearray2.c ===
#include <glib.h>
#define NUM_ARYS 5
void load_arrays( GArray *garrays[NUM_ARYS] )
{
gint i,j, storevalue;
// put the load arrays stuff here.
for (j=0; j < NUM_ARYS; j++) {
garrays[j] = g_array_new (FALSE, FALSE, sizeof (gint));
g_printf("Load Array %d\n", j);
for (i = 0; i < 10; i++) {
storevalue = (i + 103) % ( (j +1) * 2 );
g_array_append_val ( garrays[j], storevalue );
g_print ("load idx %d value %d\n",
i, storevalue );
}
}
}
int main() {
GArray *garrays[NUM_ARYS];
gint i,j, storevalue;
// Change the following so that I call
// load_arrays(garrays);
// instead of the following
// start
load_arrays(garrays);
// end
for (j=0; j < NUM_ARYS; j++) {
g_printf("Array %d\n", j);
for (i = 0; i < 10; i++)
g_print ("index %d value %d\n",
i, g_array_index (garrays[j], gint, i));
}
for (j=0; j < NUM_ARYS; j++)
g_array_free (garrays[j], TRUE);
}
=== simplearray4.c ===
#include <glib.h>
#define NUM_ARYS 5
void load_array( GArray *(*garray)[NUM_ARYS] )
{
gint i,j, storevalue;
for (j=0; j < NUM_ARYS; j++) {
(*garray)[j] = g_array_new (FALSE, FALSE, sizeof (gint));
g_printf("Load Array %d\n", j);
for (i = 0; i < 10; i++) {
storevalue = (i + 103) % ( (j +1) * 2 );
g_array_append_val ( (*garray)[j], storevalue );
g_print ("load idx %d value %d\n",
i, storevalue );
}
}
}
int main() {
GArray *garray[NUM_ARYS];
gint i,j, storevalue;
/* We create a new array to store gint values.
We don't want it zero-terminated or cleared to 0's. */
load_array(&garray);
for (j=0; j < NUM_ARYS; j++) {
g_printf("Array %d\n", j);
for (i = 0; i < 10; i++)
g_print ("index %d value %d\n",
i, g_array_index (garray[j], gint, i));
}
for (j=0; j < NUM_ARYS; j++)
g_array_free (garray[j], TRUE);
}
On Sun, Feb 28, 2010 at 08:03:14PM -0800, Kevin Schultz wrote:
> 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 <[1]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
> [2]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
> [3]vox at lists.lugod.org
> [4]http://lists.lugod.org/mailman/listinfo/vox
>
> References
>
> 1. mailto:brian at brie.com
> 2. http://www.brie.com/brian/
> 3. mailto:vox at lists.lugod.org
> 4. http://lists.lugod.org/mailman/listinfo/vox
> _______________________________________________
> vox mailing list
> vox at lists.lugod.org
> http://lists.lugod.org/mailman/listinfo/vox
--
Brian Lavender
http://www.brie.com/brian/
"About 3 million computers get sold every year in China, but people don't
pay for the software. Someday they will, though. As long as they are going
to steal it, we want them to steal ours. They'll get sort of addicted, and
then we'll somehow figure out how to collect sometime in the next decade."
-- Bill Gates (Microsoft) 1998
More information about the vox
mailing list