incompatible pointer type

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

    #1

    incompatible pointer type

    code segment:

    long int * size;
    char entry[4][16];
    .............
    size=&entry[row][col];

    *************** *************** *******
    Gcc reported 'assignment of incompatible pointer type'.

    MY QUESTION IS:
    I understand that pointer is just a memory unit that contains the
    address(or starting address)of other data object(i.e. int, float,
    array, struct, etc.). So it is just an address. How does C implement
    the pointer underlying? Why there can be different pointer types. If
    so, what is the difference between an integer pointer type and a float
    pointer type, for example?

    Thank you!

    Ji

  • Mike Wahler

    #2
    Re: incompatible pointer type


    "william" <william.maji@g mail.comwrote in message
    news:1173280380 .112241.119550@ c51g2000cwc.goo glegroups.com.. .
    code segment:
    >
    long int * size;
    char entry[4][16];
    ............
    size=&entry[row][col];
    >
    *************** *************** *******
    Gcc reported 'assignment of incompatible pointer type'.
    The report is correct.
    You should change 'size' to type 'char *'
    >
    MY QUESTION IS:
    I understand that pointer is just a memory unit that contains the
    address(or starting address)of other data object(i.e. int, float,
    array, struct, etc.). So it is just an address. How does C implement
    the pointer underlying?
    That's specific to the implementation.
    >Why there can be different pointer types.
    Because the language defines them as different.
    If
    so, what is the difference between an integer pointer type and a float
    pointer type, for example?
    The difference is that they're two different types.

    -Mike


    Comment

    • Jim Langston

      #3
      Re: incompatible pointer type

      "william" <william.maji@g mail.comwrote in message
      news:1173280380 .112241.119550@ c51g2000cwc.goo glegroups.com.. .
      code segment:
      >
      long int * size;
      char entry[4][16];
      ............
      size=&entry[row][col];
      >
      *************** *************** *******
      Gcc reported 'assignment of incompatible pointer type'.
      >
      MY QUESTION IS:
      I understand that pointer is just a memory unit that contains the
      address(or starting address)of other data object(i.e. int, float,
      array, struct, etc.). So it is just an address. How does C implement
      the pointer underlying? Why there can be different pointer types. If
      so, what is the difference between an integer pointer type and a float
      pointer type, for example?
      >
      Thank you!
      >
      Ji
      And int pointer type and a float pointer type point to different types of
      data. int* points to data that contains an integer. float* points to data
      that contains a float. There may be some circumstances where you may wish
      to convert between pointer types, but you better know what you're doing.

      In your example, you are making size a pointer to an int, but then trying to
      get it to point to a character. The compiler rightfully says, wait a second
      buddy, those are two different types. If you really wish to do this, the
      you could use reinterpret_cas t to change the type of the pointer. It would
      compile but depending on hwo you are use it could cause all kinds of
      problems at run time. I.E.

      size = reinterpret_cas t<int*>( &entry[row][col] );

      Again, this is very dangerous. Especially since a char is only 1 character
      and an interger is more (4 on my system, 8 on some, who knows how many on
      others).


      Comment

      • S S

        #4
        Re: incompatible pointer type

        On Mar 7, 8:13 pm, "william" <william.m...@g mail.comwrote:
        code segment:
        >
        long int * size;
        char entry[4][16];
        ............
        size=&entry[row][col];
        >
        *************** *************** *******
        Gcc reported 'assignment of incompatible pointer type'.
        >
        MY QUESTION IS:
        I understand that pointer is just a memory unit that contains the
        address(or starting address)of other data object(i.e. int, float,
        array, struct, etc.). So it is just an address. How does C implement
        the pointer underlying? Why there can be different pointer types. If
        so, what is the difference between an integer pointer type and a float
        pointer type, for example?
        >
        Thank you!
        >
        Ji
        Say, how would you increment the pointer then? You need to do several
        operations on pointer and if compiler does not know what type it is,
        you cannt do even p++. As simple as that.

        Comment

        • william

          #5
          Re: incompatible pointer type

          On Mar 7, 11:32 am, "S S" <sarvesh.si...@ gmail.comwrote:
          On Mar 7, 8:13 pm, "william" <william.m...@g mail.comwrote:
          >
          >
          >
          code segment:
          >
          long int * size;
          char entry[4][16];
          ............
          size=&entry[row][col];
          >
          *************** *************** *******
          Gcc reported 'assignment of incompatible pointer type'.
          >
          MY QUESTION IS:
          I understand that pointer is just a memory unit that contains the
          address(or starting address)of other data object(i.e. int, float,
          array, struct, etc.). So it is just an address. How does C implement
          the pointer underlying? Why there can be different pointer types. If
          so, what is the difference between an integer pointer type and a float
          pointer type, for example?
          >
          Thank you!
          >
          Ji
          >
          Say, how would you increment the pointer then? You need to do several
          operations on pointer and if compiler does not know what type it is,
          you cannt do even p++. As simple as that.
          I understand it. It makes a lot of sense. Pointer++ :-)

          Comment

          • william

            #6
            Re: incompatible pointer type

            On Mar 7, 3:12 pm, "william" <william.m...@g mail.comwrote:
            On Mar 7, 11:32 am, "S S" <sarvesh.si...@ gmail.comwrote:
            >
            >
            >
            On Mar 7, 8:13 pm, "william" <william.m...@g mail.comwrote:
            >
            code segment:
            >
            long int * size;
            char entry[4][16];
            ............
            size=&entry[row][col];
            >
            *************** *************** *******
            Gcc reported 'assignment of incompatible pointer type'.
            >
            MY QUESTION IS:
            I understand that pointer is just a memory unit that contains the
            address(or starting address)of other data object(i.e. int, float,
            array, struct, etc.). So it is just an address. How does C implement
            the pointer underlying? Why there can be different pointer types. If
            so, what is the difference between an integer pointer type and a float
            pointer type, for example?
            >
            Thank you!
            >
            Ji
            >
            Say, how would you increment the pointer then? You need to do several
            operations on pointer and if compiler does not know what type it is,
            you cannt do even p++. As simple as that.
            >
            I understand it. It makes a lot of sense. Pointer++ :-)
            *************** *************** ****
            My original intention was to use any bytes to comprise an int. So I
            used two ways to do that:

            1.the function atoi():

            However, I still get some problems here:
            char c[]="ABCD";
            int i;

            i=atoi(&c[0]);// I expected to get 65: A's ascii value

            the result of the line of code above is ZERO, which confuse me a lot.

            2.conversion:

            i=(int)c[0];

            this case it worked. However, if c[0]is arbitery. 'i' always get
            negative value, how come?

            Thanks


            Comment

            • jlongstreet@gmail.com

              #7
              Re: incompatible pointer type

              On Mar 7, 2:19 pm, "william" <william.m...@g mail.comwrote:
              My original intention was to use any bytes to comprise an int. So I
              used two ways to do that:
              >
              1.the function atoi():
              >
              However, I still get some problems here:
              char c[]="ABCD";
              int i;
              >
              i=atoi(&c[0]);// I expected to get 65: A's ascii value
              >
              the result of the line of code above is ZERO, which confuse me a lot.
              I think you are misinterpreting the meaning of atoi().

              atoi() assumes that the string is an ASCII representation of an
              integer.

              char *c = "1234";
              i = atoi(c); // i == 1234

              When the string is not an ASCII representation of an integer (like
              "ABCD"), it returns zero.

              char *c = "ABCD";
              i = atoi(c); // i == 0
              >
              2.conversion:
              >
              i=(int)c[0];
              >
              this case it worked. However, if c[0]is arbitery. 'i' always get
              negative value, how come?
              What do you mean by arbitrary?

              Think of it this way -- the integral types in C/C++ are just that:
              integers.
              On most 32-bit architectures, a char is one byte, and an int is 4.
              It's still a one-byte integer, though.

              Comment

              • william

                #8
                Re: incompatible pointer type

                On Mar 7, 5:01 pm, jlongstr...@gma il.com wrote:
                On Mar 7, 2:19 pm, "william" <william.m...@g mail.comwrote:
                >
                My original intention was to use any bytes to comprise an int. So I
                used two ways to do that:
                >
                1.the function atoi():
                >
                However, I still get some problems here:
                char c[]="ABCD";
                int i;
                >
                i=atoi(&c[0]);// I expected to get 65: A's ascii value
                >
                the result of the line of code above is ZERO, which confuse me a lot.
                >
                I think you are misinterpreting the meaning of atoi().
                >
                atoi() assumes that the string is an ASCII representation of an
                integer.
                >
                char *c = "1234";
                i = atoi(c); // i == 1234
                >
                When the string is not an ASCII representation of an integer (like
                "ABCD"), it returns zero.
                >
                char *c = "ABCD";
                i = atoi(c); // i == 0
                >
                >
                >
                2.conversion:
                >
                i=(int)c[0];
                >
                this case it worked. However, if c[0]is arbitery. 'i' always get
                negative value, how come?
                >
                What do you mean by arbitrary?
                >
                By arbitrary, I mean if c[0] contains any possible valued raning from
                0x00~0xff. Then sometimes, (int)any_char returns negative value.

                I got a solution now: if I specify "any_char" as an unsigned char, the
                results of conversion is always postive.

                Again, does any one has better solution to creat an int using 4
                individual bytes(or a 4 byte array).

                Thanks
                Think of it this way -- the integral types in C/C++ are just that:
                integers.
                On most 32-bit architectures, a char is one byte, and an int is 4.
                It's still a one-byte integer, though.

                Comment

                • John Harrison

                  #9
                  Re: incompatible pointer type

                  william wrote:
                  On Mar 7, 5:01 pm, jlongstr...@gma il.com wrote:
                  >
                  >>On Mar 7, 2:19 pm, "william" <william.m...@g mail.comwrote:
                  >>
                  >>
                  >>>My original intention was to use any bytes to comprise an int. So I
                  >>>used two ways to do that:
                  >>
                  >>>1.the function atoi():
                  >>
                  >>>However, I still get some problems here:
                  >>>char c[]="ABCD";
                  >>>int i;
                  >>
                  >>>i=atoi(&c[0]);// I expected to get 65: A's ascii value
                  >>
                  >>>the result of the line of code above is ZERO, which confuse me a lot.
                  >>
                  >>I think you are misinterpreting the meaning of atoi().
                  >>
                  >>atoi() assumes that the string is an ASCII representation of an
                  >>integer.
                  >>
                  >>char *c = "1234";
                  >>i = atoi(c); // i == 1234
                  >>
                  >>When the string is not an ASCII representation of an integer (like
                  >>"ABCD"), it returns zero.
                  >>
                  >>char *c = "ABCD";
                  >>i = atoi(c); // i == 0
                  >>
                  >>
                  >>
                  >>
                  >>>2.conversion :
                  >>
                  >>>i=(int)c[0];
                  >>
                  >>>this case it worked. However, if c[0]is arbitery. 'i' always get
                  >>>negative value, how come?
                  >>
                  >>What do you mean by arbitrary?
                  >>
                  >
                  By arbitrary, I mean if c[0] contains any possible valued raning from
                  0x00~0xff. Then sometimes, (int)any_char returns negative value.
                  >
                  I got a solution now: if I specify "any_char" as an unsigned char, the
                  results of conversion is always postive.
                  >
                  Again, does any one has better solution to creat an int using 4
                  individual bytes(or a 4 byte array).
                  >
                  Thanks
                  >
                  >>Think of it this way -- the integral types in C/C++ are just that:
                  >>integers.
                  >>On most 32-bit architectures, a char is one byte, and an int is 4.
                  >>It's still a one-byte integer, though.
                  >
                  >
                  >
                  A union is one possiblilty

                  union S
                  {
                  char a[4];
                  int i;
                  };

                  S s;
                  s.a[0] = 'A';
                  s.a[1] = 'B';
                  s.a[2] = 'C';
                  s.a[3] = 'D';
                  cout << s.i;

                  Of course the are all sorts of platform dependencies here, this is not
                  portable code.

                  john

                  Comment

                  • John Harrison

                    #10
                    Re: incompatible pointer type

                    >
                    A union is one possiblilty
                    >
                    union S
                    {
                    char a[4];
                    int i;
                    };
                    >
                    S s;
                    s.a[0] = 'A';
                    s.a[1] = 'B';
                    s.a[2] = 'C';
                    s.a[3] = 'D';
                    cout << s.i;
                    >
                    Of course the are all sorts of platform dependencies here, this is not
                    portable code.
                    >
                    john
                    BTW i'm not trying to suggest the any sort of conversion from hex is
                    going on here (not sure if that is what you want or not).

                    john

                    Comment

                    • Jim Langston

                      #11
                      Re: incompatible pointer type

                      (Received in e-mail, replying in group so people can correct any mistakes I
                      make)

                      On Mar 7, 10:56 am, "Jim Langston" <tazmas...@rock etmail.comwrote :
                      "william" <william.m...@g mail.comwrote in message
                      >
                      news:1173280380 .112241.119550@ c51g2000cwc.goo glegroups.com.. .
                      >
                      >
                      >
                      code segment:
                      >
                      long int * size;
                      char entry[4][16];
                      ............
                      size=&entry[row][col];
                      >
                      *************** *************** *******
                      Gcc reported 'assignment of incompatible pointer type'.
                      >
                      MY QUESTION IS:
                      I understand that pointer is just a memory unit that contains the
                      address(or starting address)of other data object(i.e. int, float,
                      array, struct, etc.). So it is just an address. How does C implement
                      the pointer underlying? Why there can be different pointer types. If
                      so, what is the difference between an integer pointer type and a float
                      pointer type, for example?
                      >
                      Thank you!
                      >
                      Ji
                      >
                      And int pointer type and a float pointer type point to different types of
                      data. int* points to data that contains an integer. float* points to
                      data
                      that contains a float. There may be some circumstances where you may wish
                      to convert between pointer types, but you better know what you're doing.
                      >
                      In your example, you are making size a pointer to an int, but then trying
                      to
                      get it to point to a character. The compiler rightfully says, wait a
                      second
                      buddy, those are two different types. If you really wish to do this, the
                      you could use reinterpret_cas t to change the type of the pointer. It
                      would
                      compile but depending on hwo you are use it could cause all kinds of
                      problems at run time. I.E.
                      >
                      size = reinterpret_cas t<int*>( &entry[row][col] );
                      >
                      Again, this is very dangerous. Especially since a char is only 1
                      character
                      and an interger is more (4 on my system, 8 on some, who knows how many on
                      others).

                      - Thank you, Jim. What I really plan to do is to assign 4 arbitery bytes
                      - to an int. I was actually manipulating the bytes in MBR entry, I want
                      - to read the 4 bytes start from any address I specified(here I use the
                      - char[] to specify the address).
                      -
                      - So how could I get any 4 bytes in the MBR entry and convert it as an
                      - integer? Thank you again.
                      -
                      - Sincerely Ji

                      size = reinterpret_cas t<int*>( somecharpointer );
                      *may* work for you, or it may not It depends on a lot on the architecture
                      you plan on running this on.

                      Some CPUs have problems reading integers that are not aligned on specific
                      byte boundaries, some do not. I believe (but could be mistaken) that AMD
                      and Intel are okay with this.

                      So, say, you had some char pointer pointing to arbitrary data that you can
                      read. If you are not worried about cross platform compatability, then I
                      would just point the int pointer to the start of where you think the array
                      is.

                      char* Data = SomeFunctionRet urningChar*( someparm );
                      int* IntData = reinterpret_cas t<int*>( Data );
                      At this point, if your architecture isn't too restrictive, you should be
                      able to read the contents of IntData as an integer, I.E.
                      std::cout << *IntData;
                      Should give you some int value, as long as the pointer points to memory you
                      have rights to read.
                      Notice, however, that incrementing your int pointer will increment it 4
                      bytes, not 1, because the compiler thinks it's int data you're pointing to.

                      ++IntData;
                      will make IntData point to 4 bytes later, not one. Just as
                      IntData[1];
                      will look at the 5th through 8th bytes in the data.

                      Now, there are other ways to do it. There've been times I wanted to look at
                      data and didn't care to store it, so
                      std::cout << *reinterpret_ca st<int*>( Data );
                      would give me an int value.
                      std::cout << *reinterpret_ca st<int*>( Data + 1 );
                      would give me the 2nd through 5th bytes as an int, as would
                      std::cout << *reinterpret_ca st<int*>( &Data[1] );

                      It really depends on what you are trying to accomplish how you would do it.
                      Looking and displaying the data the worst that usually can happen is you can
                      crash your program, reading data you don't own, etc.. Changing the data can
                      get you in trouble if you're not careful at what your'e pointing at, but
                      that's pretty much the same for all pointers.


                      Comment

                      • Marcus Kwok

                        #12
                        Re: incompatible pointer type

                        John Harrison <john_andronicu s@hotmail.comwr ote:
                        A union is one possiblilty
                        >
                        union S
                        {
                        char a[4];
                        int i;
                        };
                        >
                        S s;
                        s.a[0] = 'A';
                        s.a[1] = 'B';
                        s.a[2] = 'C';
                        s.a[3] = 'D';
                        cout << s.i;
                        Technically it is undefined behavior to store something in a union and
                        then to try to read a different member of the union.
                        Of course the are all sorts of platform dependencies here, this is not
                        portable code.
                        Right, it *may* work on the OP's implementation.

                        --
                        Marcus Kwok
                        Replace 'invalid' with 'net' to reply

                        Comment

                        • william

                          #13
                          Re: incompatible pointer type

                          On Mar 13, 3:17 pm, ricec...@gehenn om.invalid (Marcus Kwok) wrote:
                          John Harrison <john_androni.. .@hotmail.comwr ote:
                          A union is one possiblilty
                          >
                          union S
                          {
                          char a[4];
                          int i;
                          };
                          >
                          S s;
                          s.a[0] = 'A';
                          s.a[1] = 'B';
                          s.a[2] = 'C';
                          s.a[3] = 'D';
                          cout << s.i;
                          >
                          Technically it is undefined behavior to store something in a union and
                          then to try to read a different member of the union.
                          >
                          Of course the are all sorts of platform dependencies here, this is not
                          portable code.
                          >
                          Right, it *may* work on the OP's implementation.
                          >
                          --
                          Marcus Kwok
                          Replace 'invalid' with 'net' to reply
                          Thank you for all the replies and the effort.

                          Comment

                          • william

                            #14
                            Re: incompatible pointer type

                            On Mar 8, 5:37 am, "Jim Langston" <tazmas...@rock etmail.comwrote :
                            (Received in e-mail, replying in group so people can correct any mistakes I
                            make)
                            >
                            On Mar 7, 10:56 am, "Jim Langston" <tazmas...@rock etmail.comwrote :
                            >
                            >
                            >
                            "william" <william.m...@g mail.comwrote in message
                            >
                            news:1173280380 .112241.119550@ c51g2000cwc.goo glegroups.com.. .
                            >
                            code segment:
                            >
                            long int * size;
                            char entry[4][16];
                            ............
                            size=&entry[row][col];
                            >
                            *************** *************** *******
                            Gcc reported 'assignment of incompatible pointer type'.
                            >
                            MY QUESTION IS:
                            I understand that pointer is just a memory unit that contains the
                            address(or starting address)of other data object(i.e. int, float,
                            array, struct, etc.). So it is just an address. How does C implement
                            the pointer underlying? Why there can be different pointer types. If
                            so, what is the difference between an integer pointer type and a float
                            pointer type, for example?
                            >
                            Thank you!
                            >
                            Ji
                            >
                            And int pointer type and a float pointer type point to different types of
                            data. int* points to data that contains an integer. float* points to
                            data
                            that contains a float. There may be some circumstances where you may wish
                            to convert between pointer types, but you better know what you're doing.
                            >
                            In your example, you are making size a pointer to an int, but then trying
                            to
                            get it to point to a character. The compiler rightfully says, wait a
                            second
                            buddy, those are two different types. If you really wish to do this, the
                            you could use reinterpret_cas t to change the type of the pointer. It
                            would
                            compile but depending on hwo you are use it could cause all kinds of
                            problems at run time. I.E.
                            >
                            size = reinterpret_cas t<int*>( &entry[row][col] );
                            >
                            Again, this is very dangerous. Especially since a char is only 1
                            character
                            and an interger is more (4 on my system, 8 on some, who knows how many on
                            others).
                            >
                            - Thank you, Jim. What I really plan to do is to assign 4 arbitery bytes
                            - to an int. I was actually manipulating the bytes in MBR entry, I want
                            - to read the 4 bytes start from any address I specified(here I use the
                            - char[] to specify the address).
                            -
                            - So how could I get any 4 bytes in the MBR entry and convert it as an
                            - integer? Thank you again.
                            -
                            - Sincerely Ji
                            >
                            size = reinterpret_cas t<int*>( somecharpointer );
                            *may* work for you, or it may not It depends on a lot on the architecture
                            you plan on running this on.
                            >
                            Some CPUs have problems reading integers that are not aligned on specific
                            byte boundaries, some do not. I believe (but could be mistaken) that AMD
                            and Intel are okay with this.
                            >
                            So, say, you had some char pointer pointing to arbitrary data that you can
                            read. If you are not worried about cross platform compatability, then I
                            would just point the int pointer to the start of where you think the array
                            is.
                            >
                            char* Data = SomeFunctionRet urningChar*( someparm );
                            int* IntData = reinterpret_cas t<int*>( Data );
                            At this point, if your architecture isn't too restrictive, you should be
                            able to read the contents of IntData as an integer, I.E.
                            std::cout << *IntData;
                            Should give you some int value, as long as the pointer points to memory you
                            have rights to read.
                            Notice, however, that incrementing your int pointer will increment it 4
                            bytes, not 1, because the compiler thinks it's int data you're pointing to.
                            >
                            ++IntData;
                            will make IntData point to 4 bytes later, not one. Just as
                            IntData[1];
                            will look at the 5th through 8th bytes in the data.
                            >
                            Now, there are other ways to do it. There've been times I wanted to look at
                            data and didn't care to store it, so
                            std::cout << *reinterpret_ca st<int*>( Data );
                            would give me an int value.
                            std::cout << *reinterpret_ca st<int*>( Data + 1 );
                            would give me the 2nd through 5th bytes as an int, as would
                            std::cout << *reinterpret_ca st<int*>( &Data[1] );
                            >
                            It really depends on what you are trying to accomplish how you would do it.
                            Looking and displaying the data the worst that usually can happen is you can
                            crash your program, reading data you don't own, etc.. Changing the data can
                            get you in trouble if you're not careful at what your'e pointing at, but
                            that's pretty much the same for all pointers.
                            Thank you very much for the detailed reply and abundant background
                            stated above.

                            Comment

                            Working...