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 13 11956
"william" <wi**********@gmail.comwrote in message
news:11**********************@c51g2000cwc.googlegr oups.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
"william" <wi**********@gmail.comwrote in message
news:11**********************@c51g2000cwc.googlegr oups.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_cast 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_cast<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).
On Mar 7, 8:13 pm, "william" <william.m...@gmail.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.
On Mar 7, 11:32 am, "S S" <sarvesh.si...@gmail.comwrote:
On Mar 7, 8:13 pm, "william" <william.m...@gmail.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++ :-)
On Mar 7, 3:12 pm, "william" <william.m...@gmail.comwrote:
On Mar 7, 11:32 am, "S S" <sarvesh.si...@gmail.comwrote:
On Mar 7, 8:13 pm, "william" <william.m...@gmail.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
On Mar 7, 2:19 pm, "william" <william.m...@gmail.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.
On Mar 7, 5:01 pm, jlongstr...@gmail.com wrote:
On Mar 7, 2:19 pm, "william" <william.m...@gmail.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.
william wrote:
On Mar 7, 5:01 pm, jlongstr...@gmail.com wrote:
>>On Mar 7, 2:19 pm, "william" <william.m...@gmail.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
>
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
(Received in e-mail, replying in group so people can correct any mistakes I
make)
On Mar 7, 10:56 am, "Jim Langston" <tazmas...@rocketmail.comwrote:
"william" <william.m...@gmail.comwrote in message
news:11**********************@c51g2000cwc.googlegr oups.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_cast 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_cast<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_cast<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 = SomeFunctionReturningChar*( someparm );
int* IntData = reinterpret_cast<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_cast<int*>( Data );
would give me an int value.
std::cout << *reinterpret_cast<int*>( Data + 1 );
would give me the 2nd through 5th bytes as an int, as would
std::cout << *reinterpret_cast<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.
John Harrison <jo*************@hotmail.comwrote:
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
On Mar 13, 3:17 pm, ricec...@gehennom.invalid (Marcus Kwok) wrote:
John Harrison <john_androni...@hotmail.comwrote:
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.
On Mar 8, 5:37 am, "Jim Langston" <tazmas...@rocketmail.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...@rocketmail.comwrote:
"william" <william.m...@gmail.comwrote in message
news:11**********************@c51g2000cwc.googlegr oups.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_cast 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_cast<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_cast<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 = SomeFunctionReturningChar*( someparm );
int* IntData = reinterpret_cast<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_cast<int*>( Data );
would give me an int value.
std::cout << *reinterpret_cast<int*>( Data + 1 );
would give me the 2nd through 5th bytes as an int, as would
std::cout << *reinterpret_cast<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. This thread has been closed and replies have been disabled. Please start a new discussion. Similar topics |
by: Brian Stubblefield |
last post by:
Dear clc members,
I am rather new to the C programming language.
I have a rather large program that I am currently debugging.
Currently, the following snippet of code in the c program:
...
|
by: Chris Readle |
last post by:
Hi all,
Somewhat new to C and I'm getting the following error from my latest code.
Here's the warning I'm getting:
chris_readle_project3_assignment3.c: In function `main':...
|
by: Josh Wilson |
last post by:
Hey gang,
So I have my stdin which is user defined file, and am wanting to write
it to a temporary file (seems odd I know, but there is a sincere
reason), and then use that file as the stdin for...
|
by: PraZ |
last post by:
Hi all.
Here is a simple code, which when compiled with gcc results in the
warning "incompatible pointer type" for arg 1, as expected. But this is
just what I want to do, because it makes it...
|
by: gk245 |
last post by:
I have something like this:
#include <stdio.h>
main ()
{
struct line
{
char write;
char read;
| |
by: Michael |
last post by:
Hi all,
why do I get a message:
warning: passing arg 1 of `collectInput' from incompatible pointer type
In 'main' have:
char inputString;
collectInput(&inputString);
|
by: fei.liu |
last post by:
I have the following source code. It seems wierd to me why gca's value
cannot be reassigned. It's afterall a pointer and has a pointer value.
I am aware that the standard says it's not allowed. But...
|
by: wanglei0214 |
last post by:
I compiles a program in SLOS, but there is a warning i donot know how
to remove?
here is the framework of the code:
typedef struct device_tree
{
......
union
{
|
by: pyo2004 |
last post by:
Here's the definition of work_struct
struct work_struct {
unsigned long pending;
struct list_head entry;
void (*func)(void *);
void *data;
void *wq_data;
struct timer_list timer;
};
|
by: marktang |
last post by:
ONU (Optical Network Unit) is one of the key components for providing high-speed Internet services. Its primary function is to act as an endpoint device located at the user's premises. However,...
|
by: Hystou |
last post by:
Most computers default to English, but sometimes we require a different language, especially when relocating. Forgot to request a specific language before your computer shipped? No problem! You can...
| |
by: jinu1996 |
last post by:
In today's digital age, having a compelling online presence is paramount for businesses aiming to thrive in a competitive landscape. At the heart of this digital strategy lies an intricately woven...
|
by: Hystou |
last post by:
Overview:
Windows 11 and 10 have less user interface control over operating system update behaviour than previous versions of Windows. In Windows 11 and 10, there is no way to turn off the Windows...
|
by: agi2029 |
last post by:
Let's talk about the concept of autonomous AI software engineers and no-code agents. These AIs are designed to manage the entire lifecycle of a software development project—planning, coding, testing,...
|
by: isladogs |
last post by:
The next Access Europe User Group meeting will be on Wednesday 1 May 2024 starting at 18:00 UK time (6PM UTC+1) and finishing by 19:30 (7.30PM).
In this session, we are pleased to welcome a new...
|
by: adsilva |
last post by:
A Windows Forms form does not have the event Unload, like VB6. What one acts like?
|
by: 6302768590 |
last post by:
Hai team
i want code for transfer the data from one system to another through IP address by using C# our system has to for every 5mins then we have to update the data what the data is updated ...
| |
by: muto222 |
last post by:
How can i add a mobile payment intergratation into php mysql website.
| |