Author Topic: Compile error  (Read 12311 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: C++
  1. if (image.HasAlpha())
  2. {
  3.         unsigned long imageSize = image.GetWidth() * image.GetHeight() * 4;
  4.         unsigned char* imageData = image.GetData();
  5.         unsigned char* imageAlpha = image.GetAlpha();
  6.         unsigned char* data[imageSize];
  7.  
  8.         for (unsigned long index = 0; index < imageSize; index += 4)
  9.         {
  10.             memcpy(data, imageData, 3);
  11.  
  12.             imageData += 3;
  13.  
  14.             memcpy(data + 3, imageAlpha, 1);
  15.  
  16.             imageAlpha++;
  17.  
  18.             data += 4;
  19.         }
  20.  
  21.         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.GetWidth(), image.GetHeight(),
  22.                           GL_RGB, GL_UNSIGNED_BYTE, data);
  23. }
  24.  


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: C++
  1. data += 4;
  2.  

 :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: C++
  1. *(data) += 4;
  2.  

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: [Select]
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: [Select]
char* array[size] is the same as
Code: [Select]
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: C++
  1. << 2
instead of
Code: C++
  1.  * 4
?

This line

Code: C++
  1. unsigned long imageSize = (image.GetWidth() * image.GetHeight())  << 2;
  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: C++
  1. << 2
instead of
Code: C++
  1.  * 4
?

This line

Code: C++
  1. unsigned long imageSize = (image.GetWidth() * image.GetHeight())  << 2;
  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: [Select]
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: C++
  1. static_cast<unsigned char* []>(data) += 4;
  2.  

and it didn't work.

Code: [Select]
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: C++
  1. if (image.HasAlpha())
  2. {
  3.         unsigned long imageSize = image.GetWidth() * image.GetHeight() * 4;
  4.         unsigned char* imageData = image.GetData();
  5.         unsigned char* imageAlpha = image.GetAlpha();
  6.         unsigned char* data = new unsigned char[imageSize];
  7.  
  8.         for (unsigned long index = 0; index < imageSize; index += 4)
  9.         {
  10.             memcpy(data, imageData, 3);
  11.  
  12.             imageData += 3;
  13.  
  14.             memcpy(data + 3, imageAlpha, 1);
  15.  
  16.             ++imageAlpha;
  17.  
  18.             data += 4;
  19.         }
  20.  
  21.         gluBuild2DMipmaps(GL_TEXTURE_2D, GL_RGBA, image.GetWidth(), image.GetHeight(),
  22.                           GL_RGB, GL_UNSIGNED_BYTE, data);
  23.  
  24.         delete[] data;
  25. }
  26.  

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: 5193
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 ;-)