pointer to two-dimensional array as argument

Discussion in 'C Programming' started by ThomasW, Feb 14, 2008.

  1. ThomasW

    ThomasW Guest

    Hi all,

    I'm not a very experienced C programmer and probably miss something
    very basic, so please forgive me.

    I modified a function that tests whether a point lies within a polygon
    (from the comp.graphics.algorithms FAQ at http://www.cgafaq.info/wiki/Point_in_polygon).
    Instead of two one-dimensional arrays I wanted to use one two-
    dimensional array as argument. But I can't figure out how to call it
    properly. Can someone help me?

    Thanks a lot, and here is the code:


    #include <stdio.h>

    int pnpoly(int npol, long int *p[2], long int x, long int y)
    {
    int i, j, c = 0;
    for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((p[1]<=y) && (y<p[j][1])) ||
    ((p[j][1]<=y) && (y<p[1]))) &&
    (x < (p[j][0] - p[0]) * (y - p[1]) / (p[j][1] - p[1])
    + p[0]))
    c = !c;
    }
    return c;
    }

    int main()
    {
    long int path[4][2]={{0,0},{100,0},{100,100},{0,100}};
    //what do I have to write instead of path[0]
    //to get the correct pointer type?
    printf("%d\n",pnpoly(4,path[0],50,50));
    return 0;
    }
    ThomasW, Feb 14, 2008
    #1
    1. Advertising

  2. ThomasW

    monkeyflip Guest

    Below are my edits...

    #include <stdio.h>

    #define SIZE1 4
    #define SIZE2 2

    int pnpoly(int npol, long int p[][SIZE2], long int x, long int y)
    {
    int i, j, c = 0;

    printf ("test = %d\n", p[2][1]);

    for (i = 0, j = npol-1; i < npol; j = i++) {
    if ((((p[1]<=y) && (y<p[j][1])) ||
    ((p[j][1]<=y) && (y<p[1]))) &&
    (x < (p[j][0] - p[0]) * (y - p[1]) / (p[j][1] - p[1])
    + p[0]))
    c = !c;
    }
    return c;

    }

    int main()
    {
    long int path[SIZE1][SIZE2]={{0,0},{100,0},{100,100},{0,100}};
    //what do I have to write instead of path[0]
    //to get the correct pointer type?
    printf("%d\n",pnpoly(4,path,50,50));
    return 0;
    }

    ThomasW wrote:
    > Hi all,
    >
    > I'm not a very experienced C programmer and probably miss something
    > very basic, so please forgive me.
    >
    > I modified a function that tests whether a point lies within a polygon
    > (from the comp.graphics.algorithms FAQ at http://www.cgafaq.info/wiki/Point_in_polygon).
    > Instead of two one-dimensional arrays I wanted to use one two-
    > dimensional array as argument. But I can't figure out how to call it
    > properly. Can someone help me?
    >
    > Thanks a lot, and here is the code:
    >
    >
    > #include <stdio.h>
    >
    > int pnpoly(int npol, long int *p[2], long int x, long int y)
    > {
    > int i, j, c = 0;
    > for (i = 0, j = npol-1; i < npol; j = i++) {
    > if ((((p[1]<=y) && (y<p[j][1])) ||
    > ((p[j][1]<=y) && (y<p[1]))) &&
    > (x < (p[j][0] - p[0]) * (y - p[1]) / (p[j][1] - p[1])
    > + p[0]))
    > c = !c;
    > }
    > return c;
    > }
    >
    > int main()
    > {
    > long int path[4][2]={{0,0},{100,0},{100,100},{0,100}};
    > //what do I have to write instead of path[0]
    > //to get the correct pointer type?
    > printf("%d\n",pnpoly(4,path[0],50,50));
    > return 0;
    > }
    monkeyflip, Feb 14, 2008
    #2
    1. Advertising

  3. ThomasW

    Default User Guest

    Re: pointer to two-dimensional array as argument - TPA

    monkeyflip wrote:

    > Below are my edits...


    Please don't top-post. Your replies belong following or interspersed
    with properly trimmed quotes. See the majority of other posts in the
    newsgroup, or:
    <http://www.caliburn.nl/topposting.html>
    Default User, Feb 14, 2008
    #3
  4. ThomasW

    ThomasW Guest

    Thanks a lot! That does it!
    ThomasW, Feb 14, 2008
    #4
  5. ThomasW

    John Bode Guest

    On Feb 14, 12:32 pm, ThomasW <> wrote:
    > Hi all,
    >
    > I'm not a very experienced C programmer and probably miss something
    > very basic, so please forgive me.
    >
    > I modified a function that tests whether a point lies within a polygon
    > (from the comp.graphics.algorithms FAQ athttp://www.cgafaq.info/wiki/Point_in_polygon).
    > Instead of two one-dimensional arrays I wanted to use one two-
    > dimensional array as argument. But I can't figure out how to call it
    > properly. Can someone help me?
    >
    > Thanks a lot, and here is the code:
    >
    > #include <stdio.h>
    >
    > int pnpoly(int npol, long int *p[2], long int x, long int y)


    int pnpoly(int npol, long int (*p)[2], long int x, long int y)

    T *p[X] -- X-element array of pointer to T
    T (*p)[X] -- pointer to X-element array of T

    > {
    > int i, j, c = 0;
    > for (i = 0, j = npol-1; i < npol; j = i++) {
    > if ((((p[1]<=y) && (y<p[j][1])) ||
    > ((p[j][1]<=y) && (y<p[1]))) &&
    > (x < (p[j][0] - p[0]) * (y - p[1]) / (p[j][1] - p[1])
    > + p[0]))
    > c = !c;
    > }
    > return c;
    >
    > }
    >
    > int main()
    > {
    > long int path[4][2]={{0,0},{100,0},{100,100},{0,100}};
    > //what do I have to write instead of path[0]
    > //to get the correct pointer type?
    > printf("%d\n",pnpoly(4,path[0],50,50));


    printf("%d\n", pnpoly(4, path, 50, 50));

    Remember that when an array identifier appears in most contexts, its
    type is converted from "array of T" to "pointer to T", and its value
    is set to point to the first element in the array.

    In the case of a 2-d array, T is another array type, so what you wind
    up with is a pointer to an array. So, given the definition

    int a[3][4];

    when the array identifier a appears in a context other than a sizeof
    or address-of(&) expression, its type will be converted from "3-
    element array of 4-element array of int" to "pointer to 4-element
    array of int", or int (*p)[4].

    > return 0;
    >
    > }


    Hope that helps.
    John Bode, Feb 14, 2008
    #5
  6. Re: pointer to two-dimensional array as argument - TPA

    On 14 Feb 2008 at 19:25, Default User wrote:
    > monkeyflip wrote:
    >
    >> Below are my edits...

    >
    > Please don't top-post. Your replies belong following or interspersed
    > with properly trimmed quotes. See the majority of other posts in the
    > newsgroup, or:
    ><http://www.caliburn.nl/topposting.html>


    Please get a life. Your replies belong in /dev/null. See
    <http://davidgerard.co.uk/fsckhead.html>
    Antoninus Twink, Feb 14, 2008
    #6
  7. ThomasW

    ThomasW Guest

    On 14 Feb., 22:01, John Bode <> wrote:
    >
    > T *p[X] -- X-element array of pointer to T
    > T (*p)[X] -- pointer to X-element array of T
    >



    Ah, that makes it clearer to me why it works the one way, but not the
    other. I'm still not really understanding what pointer points where
    with those arrays, but maybe it will become clear if I reread your
    post later after sleeping on it. Thanks a lot.


    >
    > Remember that when an array identifier appears in most contexts, its
    > type is converted from "array of T" to "pointer to T", and its value
    > is set to point to the first element in the array.
    >
    > In the case of a 2-d array, T is another array type, so what you wind
    > up with is a pointer to an array. So, given the definition
    >
    > int a[3][4];
    >
    > when the array identifier a appears in a context other than a sizeof
    > or address-of(&) expression, its type will be converted from "3-
    > element array of 4-element array of int" to "pointer to 4-element
    > array of int", or int (*p)[4].
    >
    > > return 0;

    >
    > > }

    >
    > Hope that helps.
    ThomasW, Feb 17, 2008
    #7
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. Alf P. Steinbach
    Replies:
    0
    Views:
    424
    Alf P. Steinbach
    Aug 18, 2003
  2. John Harrison
    Replies:
    4
    Views:
    6,915
    Default User
    Aug 19, 2003
  3. Icosahedron
    Replies:
    8
    Views:
    644
    Vivek
    Aug 21, 2003
  4. Venkat
    Replies:
    4
    Views:
    963
    Venkat
    Dec 5, 2003
  5. Olumide
    Replies:
    6
    Views:
    738
    John Bode
    May 17, 2010
Loading...

Share This Page