pointer to two-dimensional array as argument

Collapse
This topic is closed.
X
X
 
  • Time
  • Show
Clear All
new posts
  • ThomasW

    pointer to two-dimensional array as argument

    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.a lgorithms 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[i][1]<=y) && (y<p[j][1])) ||
    ((p[j][1]<=y) && (y<p[i][1]))) &&
    (x < (p[j][0] - p[i][0]) * (y - p[i][1]) / (p[j][1] - p[i][1])
    + p[i][0]))
    c = !c;
    }
    return c;
    }

    int main()
    {
    long int path[4][2]={{0,0},{100,0} ,{100,100},{0,1 00}};
    //what do I have to write instead of path[0]
    //to get the correct pointer type?
    printf("%d\n",p npoly(4,path[0],50,50));
    return 0;
    }
  • monkeyflip

    #2
    Re: pointer to two-dimensional array as argument

    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[i][1]<=y) && (y<p[j][1])) ||
    ((p[j][1]<=y) && (y<p[i][1]))) &&
    (x < (p[j][0] - p[i][0]) * (y - p[i][1]) / (p[j][1] - p[i][1])
    + p[i][0]))
    c = !c;
    }
    return c;

    }

    int main()
    {
    long int path[SIZE1][SIZE2]={{0,0},{100,0} ,{100,100},{0,1 00}};
    //what do I have to write instead of path[0]
    //to get the correct pointer type?
    printf("%d\n",p npoly(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.a lgorithms 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[i][1]<=y) && (y<p[j][1])) ||
    ((p[j][1]<=y) && (y<p[i][1]))) &&
    (x < (p[j][0] - p[i][0]) * (y - p[i][1]) / (p[j][1] - p[i][1])
    + p[i][0]))
    c = !c;
    }
    return c;
    }
    >
    int main()
    {
    long int path[4][2]={{0,0},{100,0} ,{100,100},{0,1 00}};
    //what do I have to write instead of path[0]
    //to get the correct pointer type?
    printf("%d\n",p npoly(4,path[0],50,50));
    return 0;
    }

    Comment

    • Default User

      #3
      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 >

      Comment

      • ThomasW

        #4
        Re: pointer to two-dimensional array as argument

        Thanks a lot! That does it!

        Comment

        • John Bode

          #5
          Re: pointer to two-dimensional array as argument

          On Feb 14, 12:32 pm, ThomasW <x.zupf...@web. dewrote:
          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.a lgorithms FAQ athttp://www.cgafaq.info/wiki/Point_in_polygo n).
          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[i][1]<=y) && (y<p[j][1])) ||
          ((p[j][1]<=y) && (y<p[i][1]))) &&
          (x < (p[j][0] - p[i][0]) * (y - p[i][1]) / (p[j][1] - p[i][1])
          + p[i][0]))
          c = !c;
          }
          return c;
          >
          }
          >
          int main()
          {
          long int path[4][2]={{0,0},{100,0} ,{100,100},{0,1 00}};
          //what do I have to write instead of path[0]
          //to get the correct pointer type?
          printf("%d\n",p npoly(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.

          Comment

          • Antoninus Twink

            #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>

            Comment

            • ThomasW

              #7
              Re: pointer to two-dimensional array as argument

              On 14 Feb., 22:01, John Bode <john_b...@my-deja.comwrote:
              >
              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.

              Comment

              Working...