incompatible types in assignment

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

    incompatible types in assignment

    Whats wrong with the code in line no. 7?!

    #cat test3.c
    #include <stdio.h>

    int main(int argc, char *argv[])
    {
    int ia1[10] = {0, 1, 2};
    int ia2[10];
    ia2 = ia1;

    printf("%d\n", ia2[2]);

    return 0;
    }
    #gcc test3.c
    test3.c: In function `main':
    test3.c:7: incompatible types in assignment
    #

  • Richard Heathfield

    #2
    Re: incompatible types in assignment

    v4vijayakumar said:
    [color=blue]
    > Whats wrong with the code in line no. 7?!
    >
    > #cat test3.c
    > #include <stdio.h>
    >
    > int main(int argc, char *argv[])
    > {
    > int ia1[10] = {0, 1, 2};
    > int ia2[10];
    > ia2 = ia1;
    >
    > printf("%d\n", ia2[2]);
    >
    > return 0;
    > }
    > #gcc test3.c
    > test3.c: In function `main':
    > test3.c:7: incompatible types in assignment[/color]

    You can't assign to arrays in C. They are lvalues, but not "modifiable
    lvalues".

    Fix:

    #include <string.h>

    and then, provided the two arrays are of the same size and type, you can
    replace your assignment attempt with this::

    memcpy(ia2, ia1, sizeof ia2);

    --
    Richard Heathfield
    "Usenet is a strange place" - dmr 29/7/1999

    email: rjh at above domain (but drop the www, obviously)

    Comment

    • maurice.gray@gmail.com

      #3
      Re: incompatible types in assignment

      Also.

      int main(int argc, char *argv[])
      {
      int ia1[10] = {0, 1, 2};
      int *ia2;
      ia2 = ia1;

      printf("%d\n",* ia2+2);

      return 0;

      }

      v4vijayakumar wrote:[color=blue]
      > Whats wrong with the code in line no. 7?!
      >
      > #cat test3.c
      > #include <stdio.h>
      >
      > int main(int argc, char *argv[])
      > {
      > int ia1[10] = {0, 1, 2};
      > int ia2[10];
      > ia2 = ia1;
      >
      > printf("%d\n", ia2[2]);
      >
      > return 0;
      > }
      > #gcc test3.c
      > test3.c: In function `main':
      > test3.c:7: incompatible types in assignment
      > #[/color]

      Comment

      • maurice.gray@gmail.com

        #4
        Re: incompatible types in assignment

        #include <stdio.h>

        int main(int argc, char *argv[])
        {
        int ia1[10] = {0, 1, 2};
        int *ia2;
        ia2 = ia1;

        printf("%d\n",* (ia2+2));

        return 0;

        }



        v4vijayakumar wrote:[color=blue]
        > Whats wrong with the code in line no. 7?!
        >
        > #cat test3.c
        > #include <stdio.h>
        >
        > int main(int argc, char *argv[])
        > {
        > int ia1[10] = {0, 1, 2};
        > int ia2[10];
        > ia2 = ia1;
        >
        > printf("%d\n", ia2[2]);
        >
        > return 0;
        > }
        > #gcc test3.c
        > test3.c: In function `main':
        > test3.c:7: incompatible types in assignment
        > #[/color]

        Comment

        • Haider

          #5
          Re: incompatible types in assignment


          v4vijayakumar wrote:[color=blue]
          > Whats wrong with the code in line no. 7?!
          >
          > #cat test3.c
          > #include <stdio.h>
          >
          > int main(int argc, char *argv[])
          > {
          > int ia1[10] = {0, 1, 2};
          > int ia2[10];
          > ia2 = ia1;
          >
          > printf("%d\n", ia2[2]);
          >
          > return 0;
          > }
          > #gcc test3.c
          > test3.c: In function `main':
          > test3.c:7: incompatible types in assignment
          > #[/color]
          array name is not a varaiable so you can't assign i.e. ia2=ia1; or
          perform ia2++. refer to K&R (2nd) section 5.3.
          above code will work with following fix
          in place of int ia2[10]; use int *ia2.
          rest is fine.

          Comment

          • Nelu

            #6
            Re: incompatible types in assignment

            On 2006-06-05, Haider <hmminto@yahoo. com> wrote:[color=blue]
            >
            > v4vijayakumar wrote:[color=green]
            >> <snip>
            >> int ia1[10] = {0, 1, 2};
            >> int ia2[10];
            >> ia2 = ia1;
            >> <snip>[/color]
            > in place of int ia2[10]; use int *ia2.
            > rest is fine.[/color]
            It depends what he wants to do.
            This doesn't copy the elements so, a change to ia2
            will reflect in ia1. If he wants to change values in
            ia2 and keep the ia1 unchanged he should either follow
            Richard Heathfield's example, or copy the values one by
            one in a for loop.

            --
            Ioan - Ciprian Tandau
            tandau _at_ freeshell _dot_ org (hope it's not too late)
            (... and that it still works...)

            Comment

            • CBFalconer

              #7
              Re: incompatible types in assignment

              v4vijayakumar wrote:[color=blue]
              >
              > Whats wrong with the code in line no. 7?!
              >
              > #cat test3.c
              > #include <stdio.h>
              >
              > int main(int argc, char *argv[])
              > {
              > int ia1[10] = {0, 1, 2};
              > int ia2[10];
              > ia2 = ia1;
              >
              > printf("%d\n", ia2[2]);
              >
              > return 0;
              > }
              > #gcc test3.c
              > test3.c: In function `main':
              > test3.c:7: incompatible types in assignment
              > #[/color]

              Arrays are not fundamental objects, and cannot be bodily assigned
              in C. You could write:

              for (i = 0; i < 10; i++) ia1[i] = ia2[i];

              after declaring i, or use such routines as memcpy. These copy the
              elements one by one.

              --
              "Our enemies are innovative and resourceful, and so are we.
              They never stop thinking about new ways to harm our country
              and our people, and neither do we." -- G. W. Bush.
              "The people can always be brought to the bidding of the
              leaders. All you have to do is tell them they are being
              attacked and denounce the pacifists for lack of patriotism
              and exposing the country to danger. It works the same way
              in any country." --Hermann Goering.


              Comment

              • whyglinux

                #8
                Re: incompatible types in assignment

                v4vijayakumar wrote:[color=blue]
                > Whats wrong with the code in line no. 7?!
                >
                > #cat test3.c
                > #include <stdio.h>
                >
                > int main(int argc, char *argv[])
                > {
                > int ia1[10] = {0, 1, 2};
                > int ia2[10];
                > ia2 = ia1;
                >
                > printf("%d\n", ia2[2]);
                >
                > return 0;
                > }
                > #gcc test3.c
                > test3.c: In function `main':
                > test3.c:7: incompatible types in assignment
                > #[/color]

                ia1, which is used as an rvalue, is converted to type int*. On the
                other hand, ia2, as an lvalue, is of type int[10]. Since int* can never
                be converted to int[10] (while int[10] to int* conversion is defined),
                the compiler complains.

                Comment

                • whyglinux

                  #9
                  Re: incompatible types in assignment

                  CBFalconer wrote:
                  [color=blue]
                  > Arrays are not fundamental objects, and cannot be bodily assigned
                  > in C.[/color]

                  Pointers, structs and unions, as well as arrays, are all derived (not
                  fundamental) types, but they are assignable while arrays are not.

                  Comment

                  • whyglinux

                    #10
                    Re: incompatible types in assignment


                    Haider wrote:
                    [color=blue]
                    > array name is not a varaiable so you can't assign i.e. ia2=ia1; or
                    > perform ia2++. refer to K&R (2nd) section 5.3.
                    > above code will work with following fix
                    > in place of int ia2[10]; use int *ia2.
                    > rest is fine.[/color]

                    The defination of variable is not given and seldom used in the
                    standard because of its ambiguity. At least, variable can refer to one
                    of the following 3 meanings:

                    1. Named objects that can only be modifiable.
                    2. Named objects (modifiable and non-modifiable)
                    3. Objects (both named and unamed).

                    So I can not say you and K&R are wrong when saying "array name is not a
                    variable" as it can be interpreted as "array name is not modifiable".
                    However, I prefer that array names are variables (if we do not care
                    whether they can be changed or not) as that also said in K&R (2nd).
                    Yes, I am sure you can find such descriptions in the book.

                    These indicate that the meaning of variable used in K&R (2nd) is
                    inconsistent.

                    As to why ia2=ia1 is invalid, follow what Richard Heathfield have said.

                    Comment

                    • CBFalconer

                      #11
                      Re: incompatible types in assignment

                      whyglinux wrote:[color=blue]
                      > CBFalconer wrote:
                      >[color=green]
                      >> Arrays are not fundamental objects, and cannot be bodily assigned
                      >> in C.[/color]
                      >
                      > Pointers, structs and unions, as well as arrays, are all derived (not
                      > fundamental) types, but they are assignable while arrays are not.[/color]

                      Alright, if you insist, go ahead and make assignments to arrays. I
                      predict they won't work in C. Note that a struct or union actually
                      defines a new type, an array only defines an aggregate of an old
                      type.

                      --
                      "Our enemies are innovative and resourceful, and so are we.
                      They never stop thinking about new ways to harm our country
                      and our people, and neither do we." -- G. W. Bush.
                      "The people can always be brought to the bidding of the
                      leaders. All you have to do is tell them they are being
                      attacked and denounce the pacifists for lack of patriotism
                      and exposing the country to danger. It works the same way
                      in any country." --Hermann Goering.


                      Comment

                      • William J. Leary Jr.

                        #12
                        Re: incompatible types in assignment

                        "CBFalconer " <cbfalconer@yah oo.com> wrote in message
                        news:4484A213.2 78D8583@yahoo.c om...[color=blue]
                        > whyglinux wrote:[color=green]
                        > > CBFalconer wrote:
                        > >[color=darkred]
                        > >> Arrays are not fundamental objects, and cannot be bodily assigned
                        > >> in C.[/color]
                        > >
                        > > Pointers, structs and unions, as well as arrays, are all derived (not
                        > > fundamental) types, but they are assignable while arrays are not.[/color]
                        >
                        > Alright, if you insist, go ahead and make assignments to arrays. I
                        > predict they won't work in C.[/color]

                        I think you misread "...while arrays are not."

                        - Bill


                        Comment

                        • Keith Thompson

                          #13
                          Re: incompatible types in assignment

                          CBFalconer <cbfalconer@yah oo.com> writes:[color=blue]
                          > whyglinux wrote:[color=green]
                          >> CBFalconer wrote:
                          >>[color=darkred]
                          >>> Arrays are not fundamental objects, and cannot be bodily assigned
                          >>> in C.[/color]
                          >>
                          >> Pointers, structs and unions, as well as arrays, are all derived (not
                          >> fundamental) types, but they are assignable while arrays are not.[/color]
                          >
                          > Alright, if you insist, go ahead and make assignments to arrays. I
                          > predict they won't work in C.[/color]

                          He knows that; he specifically acknowledged that arrays are not
                          assignable.
                          [color=blue]
                          > Note that a struct or union actually
                          > defines a new type, an array only defines an aggregate of an old
                          > type.[/color]

                          Structs, unions, and arrays are all aggregates defined in terms of
                          existing types. The standard referss to struct, union, array, and
                          function types as "derived types" in C99 6.2.5.

                          An array type is certainly a type. It's probably not a "first-class"
                          or "fundamenta l" type, because, among other things, it doesn't support
                          assignment or comparison, but C doesn't talk about "first-class" or
                          "fundamenta l" types. Structures can be assigned and arrays can't, but
                          C doesn't make any strong fundamental distinction between them on that
                          basis; they just happen to support different sets of operations.

                          C99 6.2.5p21:

                          Arithmetic types and pointer types are collectively called _scalar
                          types_. Array and structure types are collectively called
                          _aggregate types_.

                          and a footnote:

                          Note that aggregate type does not include union type because an
                          object with union type can only contain one member at a time.

                          (So can a single-element structure, but that's not a big deal; most
                          references in the standard to "aggregate types" talk about "aggregate
                          or union" types.)

                          --
                          Keith Thompson (The_Other_Keit h) kst-u@mib.org <http://www.ghoti.net/~kst>
                          San Diego Supercomputer Center <*> <http://users.sdsc.edu/~kst>
                          We must do something. This is something. Therefore, we must do this.

                          Comment

                          • Jack Klein

                            #14
                            Re: incompatible types in assignment

                            On 5 Jun 2006 09:00:33 -0700, "whyglinux" <whyglinux@gmai l.com> wrote
                            in comp.lang.c:
                            [color=blue]
                            > CBFalconer wrote:
                            >[color=green]
                            > > Arrays are not fundamental objects, and cannot be bodily assigned
                            > > in C.[/color]
                            >
                            > Pointers, structs and unions, as well as arrays, are all derived (not
                            > fundamental) types, but they are assignable while arrays are not.[/color]

                            You are completely incorrect about pointers. They are not derived
                            types at all, they are fundamental scalar types in C. If you believe
                            differently, kindly cite the section from the C standard that supports
                            your position.

                            --
                            Jack Klein
                            Home: http://JK-Technology.Com
                            FAQs for
                            comp.lang.c http://c-faq.com/
                            comp.lang.c++ http://www.parashift.com/c++-faq-lite/
                            alt.comp.lang.l earn.c-c++

                            Comment

                            • pete

                              #15
                              Re: incompatible types in assignment

                              Jack Klein wrote:[color=blue]
                              >
                              > On 5 Jun 2006 09:00:33 -0700, "whyglinux" <whyglinux@gmai l.com> wrote
                              > in comp.lang.c:
                              >[color=green]
                              > > CBFalconer wrote:
                              > >[color=darkred]
                              > > > Arrays are not fundamental objects, and cannot be bodily assigned
                              > > > in C.[/color]
                              > >
                              > > Pointers, structs and unions,
                              > > as well as arrays, are all derived (not
                              > > fundamental) types, but they are assignable while arrays are not.[/color]
                              >
                              > You are completely incorrect about pointers. They are not derived
                              > types at all, they are fundamental scalar types in C. If you believe
                              > differently, kindly cite the section from the C standard that supports
                              > your position.[/color]

                              N869
                              6.2.5 Types

                              [#19] Any number of derived types can be constructed from
                              the object, function, and incomplete types, as follows:

                              -- A pointer type may be derived from a function type, an
                              object type, or an incomplete type, called the
                              referenced type.

                              --
                              pete

                              Comment

                              Working...