Author Topic: Compile error  (Read 18053 times)

sethjackson

  • Guest
Compile error
« on: February 05, 2006, 10:22:34 pm »
Hi I get this error

error: incompatible types in assignment of `int' to `unsigned char*[((unsigned int)((int)imageSize))]'

with this code......

Code: cpp
if (image.HasAlpha())
{
        unsigned long imageSize = image.GetWidth() * image.GetHeight() * 4;
        unsigned char* imageData = image.GetData();
        unsigned char* imageAlpha = image.GetAlpha();
        unsigned char* data[imageSize];

        for (unsigned long index = 0; index < imageSize; index += 4)
        {
            memcpy(data, imageData, 3);

            imageData += 3;

            memcpy(data + 3, imageAlpha, 1);

            imageAlpha++;

            data += 4;
        }

        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.GetWidth(), image.GetHeight(),
                          GL_RGB, GL_UNSIGNED_BYTE, data);
}


Help me please...... Sorry for the beginner question? I just don't get it I used to do stuff like increaseing the ptr with += all the time.....

EDIT:

Let me say that it fails on the line

Code: cpp
data += 4;

 :P
« Last Edit: February 05, 2006, 10:27:33 pm by sethjackson »

sethjackson

  • Guest
Re: Compile error
« Reply #1 on: February 05, 2006, 10:35:42 pm »
Ok I fixed it now could someone tell me why this works???

Code: cpp
*(data) += 4;

Offline polygon7

  • Multiple posting newcomer
  • *
  • Posts: 104
    • Home site
Re: Compile error
« Reply #2 on: February 05, 2006, 10:38:49 pm »
Hi,
this should work
Code
if (image.HasAlpha())
{
        unsigned long imageSize = (image.GetWidth() * image.GetHeight())  << 2;
        unsigned char* imageData = image.GetData();
        unsigned char* imageAlpha = image.GetAlpha();
        unsigned char* data[imageSize];
 
        for (unsigned long index = 0; index < imageSize; index += 4)
        {
            memcpy(data, imageData, 3);
 
            imageData += 3;
 
            memcpy(data + 3, imageAlpha, 1);
 
            ++imageAlpha;
 
           (*data) += 4;
        }
 
        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.GetWidth(), image.GetHeight(),
                          GL_RGB, GL_UNSIGNED_BYTE, data);
}
// Edit: Ah, you're faster :P
Code
char* array[size]
is the same as
Code
char** array
« Last Edit: February 05, 2006, 10:41:15 pm by polygon7 »
best regards,
p7
 Free open source UML modeling tool: ArgoUML

sethjackson

  • Guest
Re: Compile error
« Reply #3 on: February 05, 2006, 10:40:22 pm »
 :lol: :lol: Read my post above. Exactly why does it work though? Thanks.  :D

Offline Michael

  • Lives here!
  • ****
  • Posts: 1608
Re: Compile error
« Reply #4 on: February 05, 2006, 10:49:43 pm »
:lol: :lol: Read my post above. Exactly why does it work though? Thanks.  :D

You tried to assign an int to an unsigned char*. This does not work for sure. What do did is to de-reference the pointer. Then it works.

Why you cast before int and then unsigned int?

Anyway, do not use C-cast style. This is not a good idea in C++. You should use C++ cast style or better no cast at all (if possible).

Best wishes,
Michael

sethjackson

  • Guest
Re: Compile error
« Reply #5 on: February 05, 2006, 10:55:55 pm »
@polygon7

Why the
Code: cpp
<< 2
instead of
Code: cpp
 * 4
?

This line

Code: cpp
unsigned long imageSize = (image.GetWidth() * image.GetHeight())  << 2;

@Michael How to use a C++ style cast in this case??? Yes I know static_cast, dynamic_cast etc. How to use it here???

Offline polygon7

  • Multiple posting newcomer
  • *
  • Posts: 104
    • Home site
Re: Compile error
« Reply #6 on: February 05, 2006, 11:01:47 pm »
@polygon7

Why the
Code: cpp
<< 2
instead of
Code: cpp
 * 4
?

This line

Code: cpp
unsigned long imageSize = (image.GetWidth() * image.GetHeight())  << 2;
"<<" is shifting bits operator (shift left, SHL in assembly). SHL can be used for multiply by power of two (SHR, shift right for dividing by power of two).

x*2 == x <<1, x*4 == x <<2 ...

Bit shifting usually is faster then normal multiply.
« Last Edit: February 05, 2006, 11:07:12 pm by polygon7 »
best regards,
p7
 Free open source UML modeling tool: ArgoUML

Offline Michael

  • Lives here!
  • ****
  • Posts: 1608
Re: Compile error
« Reply #7 on: February 05, 2006, 11:17:09 pm »
@Michael How to use a C++ style cast in this case??? Yes I know static_cast, dynamic_cast etc. How to use it here???

In your case and if I am not wrong, I would use the static_cast Operator:

Quote
static_cast<T> (expr)
To convert the expression expr to type T. Such conversions rely on static (compile-time) type information.

Anyway, I am not an expert in C++ cast as usually I used C cast until I discovered that are not so good (cast is already ugly, but C-cast is uglier). You can get some useful info here:


You can also have a look at this topic.

Michael

sethjackson

  • Guest
Re: Compile error
« Reply #8 on: February 06, 2006, 12:01:07 am »
Ok guys thanks. I learnt something today. :)

@Michael yeah I always use C++ casts instead of C casts. I couldn't figure out how to get it to work here. What type do I need to static_cast to?? I tried static_cast, but I couldn't figure out which type to cast to.  :P

Offline Michael

  • Lives here!
  • ****
  • Posts: 1608
Re: Compile error
« Reply #9 on: February 06, 2006, 12:14:44 am »
@Michael yeah I always use C++ casts instead of C casts. I couldn't figure out how to get it to work here. What type do I need to static_cast to?? I tried static_cast, but I couldn't figure out which type to cast to.  :P

For example, you can use it to cast a double to an int:

Code
double myDouble = 3.0;
int myInt = static_cast<int>(myDouble);

Anyway, be careful because static casts could be dangerous.

Have a look at the links I have suggested. There is a lot of examples and useful bla bla :).

Michael

sethjackson

  • Guest
Re: Compile error
« Reply #10 on: February 06, 2006, 03:05:57 am »
Ok I'll check it out tomorrow hopefully.  :lol:

sethjackson

  • Guest
Re: Compile error
« Reply #11 on: February 06, 2006, 07:18:09 pm »
I tried

Code: cpp
static_cast<unsigned char* []>(data) += 4;

and it didn't work.

Code
error: invalid static_cast from type `unsigned char*[((unsigned int)((int)imageSize))]' to type `unsigned char*[]'

What type (int, char, etc.) do I need to cast to???
« Last Edit: February 06, 2006, 07:20:02 pm by sethjackson »

sethjackson

  • Guest
Re: Compile error
« Reply #12 on: February 06, 2006, 07:23:17 pm »
Nevermind. This works, and better too I think. :)

Code: cpp
if (image.HasAlpha())
{
        unsigned long imageSize = image.GetWidth() * image.GetHeight() * 4;
        unsigned char* imageData = image.GetData();
        unsigned char* imageAlpha = image.GetAlpha();
        unsigned char* data = new unsigned char[imageSize];

        for (unsigned long index = 0; index < imageSize; index += 4)
        {
            memcpy(data, imageData, 3);

            imageData += 3;

            memcpy(data + 3, imageAlpha, 1);

            ++imageAlpha;

            data += 4;
        }

        gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.GetWidth(), image.GetHeight(),
                          GL_RGB, GL_UNSIGNED_BYTE, data);

        delete[] data;
}

Offline Michael

  • Lives here!
  • ****
  • Posts: 1608
Re: Compile error
« Reply #13 on: February 07, 2006, 10:42:10 am »
Hello,

When you use new you should check if the memory has been reserved or not. If I remember correctly the new sends a bad_allocation exception if it fails. Another version of new just a null pointer (which could or not be a better alternative :)).

Best wishes,
Michael

Offline killerbot

  • Administrator
  • Lives here!
  • *****
  • Posts: 5490
Re: Compile error
« Reply #14 on: February 07, 2006, 11:13:51 am »
Hello,

When you use new you should check if the memory has been reserved or not. If I remember correctly the new sends a bad_allocation exception if it fails. Another version of new just a null pointer (which could or not be a better alternative :)).

Best wishes,
Michael


Normally when new fails, it throws -> catch it.
There exist a no_throw new. I think it is not portable, the gurus (Sutter, ..) give the advice not to use it. So just forget you ever heard about it ;-)