473,385 Members | 1,922 Online
Bytes | Software Development & Data Engineering Community
Post Job

Home Posts Topics Members FAQ

Join Bytes to post your question to a community of 473,385 software developers and data experts.

Re: How to retrieve data from array of pointers or from a struct?

Victor <vh*******@yahoo.comwrites:
I have 2 problems:

First, I want to grep one pattern at a time from the pattern group
below:

unsigned long long i;

unsigned long long *dataPatternPtr[] = {
0xa0a00000000000aaLL,
[...]
0xABCDEF0123456789LL,
};
You're declaring an array of pointers to unsigned long long, but
you're initializing the pointers with integer values. This is
actually a constraint violation, and your compiler should have warned
you about it. Your problem is either that you're invoking your
compiler in some non-standard mode that inhibits the warnings, or
getting warnings and not bothering to tell us about them.

What are you actually trying to do? Do you want an array of integers
or an array of pointers?

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Nov 9 '08 #1
3 3013
On Nov 9, 9:21*am, Keith Thompson <ks...@mib.orgwrote:
Victor <vhnguy...@yahoo.comwrites:
I have 2 problems:
First, I want to grep one pattern at a time from the pattern group
below:
unsigned long long i;
unsigned long long *dataPatternPtr[] = {
* * 0xa0a00000000000aaLL,
[...]
* * 0xABCDEF0123456789LL,
* };

You're declaring an array of pointers to unsigned long long, but
you're initializing the pointers with integer values. *This is
actually a constraint violation, and your compiler should have warned
you about it. *Your problem is either that you're invoking your
compiler in some non-standard mode that inhibits the warnings, or
getting warnings and not bothering to tell us about them.

What are you actually trying to do? *Do you want an array of integers
or an array of pointers?

--
Keith Thompson (The_Other_Keith) ks...@mib.org *<http://www.ghoti.net/~kst>
Nokia
"We must do something. *This is something. *Therefore, we must do this."
* * -- Antony Jay and Jonathan Lynn, "Yes Minister"
Hi,

I modified my script to use an array of longs instead of array of
pointers to longs:

unsigned long long dataPatternArray[] = {
0xa0a00000000000aaLL,
0xFFFFFFFFFFFFFFFFLL,
0x5555555555555555LL,
0xAAAAAAAAAAAAAAAALL,
0xCCCCCCCCCCCCCCCCLL,
0x3333333333333333LL,
0xEEEEEEEEEEEEEEEELL,
0x7777777777777777LL,
0x0000000000000001LL,
0xFFFFFFFFFFFFFFFELL,
0xABCDEF0123456789LL,
};

Again, I can successfully access my elements via:

dataPatternArray[0]
dataPatternArray[1]
dataPatternArray[2]
....
dataPatternArray[7]

and so on.

However if I use a variable "i" in a "for" loop to access each of
them:

for (i=0; i <= MAX; i++) {
printf("Pattern = %08x\n", (int *)dataPatternArray[i]);
}

Then the above WON'T WORK because of compile error: undefined
reference to `memcpy
However if I simply hardcode value for "i" like in the following, then
it works. Any idea?

for (i=0; i <= MAX; i++) {
i = 7;
printf("Pattern = %08x\n", (int *)dataPatternArray[i]);
}

Bottom line is I need to CYCLE THRU all patterns to retrieve them.
Why doesn't it work?

Thanks,
Victor
Nov 9 '08 #2
Victor <vh*******@yahoo.comwrites:
On Nov 9, 9:21*am, Keith Thompson <ks...@mib.orgwrote:
>Victor <vhnguy...@yahoo.comwrites:
I have 2 problems:
First, I want to grep one pattern at a time from the pattern group
below:
unsigned long long i;
unsigned long long *dataPatternPtr[] = {
* * 0xa0a00000000000aaLL,
[...]
* * 0xABCDEF0123456789LL,
* };

You're declaring an array of pointers to unsigned long long, but
you're initializing the pointers with integer values. *This is
actually a constraint violation, and your compiler should have warned
you about it. *Your problem is either that you're invoking your
compiler in some non-standard mode that inhibits the warnings, or
getting warnings and not bothering to tell us about them.

What are you actually trying to do? *Do you want an array of integers
or an array of pointers?
Please don't quote signatures.
I modified my script to use an array of longs instead of array of
pointers to longs:
It's a program, not a script.
unsigned long long dataPatternArray[] = {
0xa0a00000000000aaLL,
0xFFFFFFFFFFFFFFFFLL,
0x5555555555555555LL,
0xAAAAAAAAAAAAAAAALL,
0xCCCCCCCCCCCCCCCCLL,
0x3333333333333333LL,
0xEEEEEEEEEEEEEEEELL,
0x7777777777777777LL,
0x0000000000000001LL,
0xFFFFFFFFFFFFFFFELL,
0xABCDEF0123456789LL,
};
Ok.
Again, I can successfully access my elements via:

dataPatternArray[0]
dataPatternArray[1]
dataPatternArray[2]
...
dataPatternArray[7]

and so on.

However if I use a variable "i" in a "for" loop to access each of
them:

for (i=0; i <= MAX; i++) {
printf("Pattern = %08x\n", (int *)dataPatternArray[i]);
}
You're taking dataPatternArray[i], a value of type unsigned long long,
and converting it to int* (pointer to int). This makes no sense.
You're then printing this pointer value using a "%08x" format; "%x" or
"%08x" is for printing a value of type unsigned int, not int*. (And
you're specifying at least 8 digits, but your values are 16 digits.)

Previously, you showed a declaration of i as an unsigned long long.
This isn't wrong, but since i is an index into the array, which has
only a few elements, it would make more sense to declare it as an int.

You're looping from 0 to MAX. What is MAX? If it's the number of
elements in the array, then you're going past the end of the array.
(That's not related to the symptoms you're describing.)

The way to print a value of type unsigned long long in hexadecimal is:

for (i = 0; i < MAX; i++) {
printf("Pattern = %016llx\n", dataPatternArray[i]);
}
Then the above WON'T WORK because of compile error: undefined
reference to `memcpy
You're not explicitly calling memcpy, but it's possible that your
compiler is implicitly calling memcpy to copy the value, perhaps
because the CPU doesn't have a native instruction to copy a 64-bit
value. memcpy is part of the standard library, and most
implementations will link it automatically, so you don't have to do
anything special to make memcpy available -- but apparently either
your implementation doesn't do that, or you're invoking it
incorrectly, or it's configured incorrectly. I don't think you've
told us what compiler you're using, but you should be able to find a
forum that discusses it. Write a complete self-contained program that
illustrates your problem (not the code fragments you've been posting
here) and post it either here or in a support form for your compiler.
We need something we can compile and run ourselves; if you don't know
what the problem is, you don't know what you can safely leave out. We
can help you with any C language issues, but we can't help you with
any problems you're having with your compiler.

[...]

--
Keith Thompson (The_Other_Keith) ks***@mib.org <http://www.ghoti.net/~kst>
Nokia
"We must do something. This is something. Therefore, we must do this."
-- Antony Jay and Jonathan Lynn, "Yes Minister"
Nov 9 '08 #3
Victor wrote:
However if I use a variable "i" in a "for" loop to access each of
them:

for (i=0; i <= MAX; i++) {
printf("Pattern = %08x\n", (int *)dataPatternArray[i]);
}

Then the above WON'T WORK because of compile error: undefined
reference to `memcpy
I don't believe you. And your code is random nonsense.
However if I simply hardcode value for "i" like in the following, then
it works. Any idea?

for (i=0; i <= MAX; i++) {
i = 7;
printf("Pattern = %08x\n", (int *)dataPatternArray[i]);
}

Bottom line is I need to CYCLE THRU all patterns to retrieve them.
Why doesn't it work?
Because you haven't bothered to learn even the most basic aspects of C.

/* mha: _Please_ post the real code. Your messages are really a mess.
* Your problem is not reproduceable, simply because you have hidden
* your error by snipping it away. Your description of your problem is
* absurd: by "diagnosing" it yourself, you have only fooled yourself.
* If the following compiles and runs, then you are completely wrong
* about what is happening. And your attempt at a printf statement
* looks like random typing. */

#include <stdio.h>

#define MAX (sizeof dataPatternArray/sizeof *dataPatternArray)

int main(void)
{
unsigned long long dataPatternArray[] = {
0xa0a00000000000aaLL,
0xFFFFFFFFFFFFFFFFLL,
0x5555555555555555LL,
0xAAAAAAAAAAAAAAAALL,
0xCCCCCCCCCCCCCCCCLL,
0x3333333333333333LL,
0xEEEEEEEEEEEEEEEELL,
0x7777777777777777LL,
0x0000000000000001LL,
0xFFFFFFFFFFFFFFFELL,
0xABCDEF0123456789LL,
};
size_t i;

/* mha: note that the following has "i < MAX" instead of your "i <=
MAX". Since you have refused to tell us your definition for MAX,
we can only guess. My definition is above.

Note also that the specifier for a unsigned long long in hex is
not "%08x", and (int *)dataPatternArray[i] is just nonsense. If
you really wanted a pointer to print, the specifier is "%p" and
the cast is to (void *) */
for (i = 0; i < MAX; i++)
printf("Address of Pattern = %p, "
"Pattern = %#08llx\n", (void *) &dataPatternArray[i],
dataPatternArray[i]);
return 0;
}

[output]
Address of Pattern = dff50, Pattern = 0xa0a00000000000aa
Address of Pattern = dff58, Pattern = 0xffffffffffffffff
Address of Pattern = dff60, Pattern = 0x5555555555555555
Address of Pattern = dff68, Pattern = 0xaaaaaaaaaaaaaaaa
Address of Pattern = dff70, Pattern = 0xcccccccccccccccc
Address of Pattern = dff78, Pattern = 0x3333333333333333
Address of Pattern = dff80, Pattern = 0xeeeeeeeeeeeeeeee
Address of Pattern = dff88, Pattern = 0x7777777777777777
Address of Pattern = dff90, Pattern = 0x000001
Address of Pattern = dff98, Pattern = 0xfffffffffffffffe
Address of Pattern = dffa0, Pattern = 0xabcdef0123456789
Nov 10 '08 #4

This thread has been closed and replies have been disabled. Please start a new discussion.

Similar topics

6
by: Sebastian Kemi | last post by:
How should a write a class to a file? Would this example work: object *myobject = 0; tfile.write(reinterpret_cast<char *>(myobject), sizeof(*object)); / sebek
2
by: forums_mp | last post by:
I've got an STL class (see below) with two functions to store and retrieve data - msg structs. The "Store" function when called will copy the received message (depending on which message) into...
20
by: fix | last post by:
Hi all, I feel unclear about what my code is doing, although it works but I am not sure if there is any possible bug, please help me to verify it. This is a trie node (just similar to tree nodes)...
10
by: Adam Warner | last post by:
Hi all, With this structure that records the length of an array of pointers as its first member: struct array { ptrdiff_t length; void *ptr; };
204
by: Alexei A. Frounze | last post by:
Hi all, I have a question regarding the gcc behavior (gcc version 3.3.4). On the following test program it emits a warning: #include <stdio.h> int aInt2 = {0,1,2,4,9,16}; int aInt3 =...
5
by: Stijn van Dongen | last post by:
A question about void*. I have a hash library where the hash create function accepts functions unsigned (*hash)(const void *a) int (*cmp) (const void *a, const void *b) The insert function...
15
by: Paminu | last post by:
Still having a few problems with malloc and pointers. I have made a struct. Now I would like to make a pointer an array with 4 pointers to this struct. #include <stdlib.h> #include <stdio.h>...
31
by: aarklon | last post by:
Hi all, this is a question which i saw in a book typedef struct mall_li_header_ { int refcnt; uchar pool; uchar flag; ushort magic_no; char data;
0
by: Pawel Dziepak | last post by:
-----BEGIN PGP SIGNED MESSAGE----- Hash: SHA1 Victor wrote: <snip> You are using an array of pointers not an array of long long values. Don't forget that sizeof(long long) != sizeof(long...
1
by: CloudSolutions | last post by:
Introduction: For many beginners and individual users, requiring a credit card and email registration may pose a barrier when starting to use cloud servers. However, some cloud server providers now...
0
by: Faith0G | last post by:
I am starting a new it consulting business and it's been a while since I setup a new website. Is wordpress still the best web based software for hosting a 5 page website? The webpages will be...
0
by: ryjfgjl | last post by:
In our work, we often need to import Excel data into databases (such as MySQL, SQL Server, Oracle) for data analysis and processing. Usually, we use database tools like Navicat or the Excel import...
0
by: taylorcarr | last post by:
A Canon printer is a smart device known for being advanced, efficient, and reliable. It is designed for home, office, and hybrid workspace use and can also be used for a variety of purposes. However,...
0
by: Charles Arthur | last post by:
How do i turn on java script on a villaon, callus and itel keypad mobile phone
0
by: aa123db | last post by:
Variable and constants Use var or let for variables and const fror constants. Var foo ='bar'; Let foo ='bar';const baz ='bar'; Functions function $name$ ($parameters$) { } ...
0
by: ryjfgjl | last post by:
In our work, we often receive Excel tables with data in the same format. If we want to analyze these data, it can be difficult to analyze them because the data is spread across multiple Excel files...
0
BarryA
by: BarryA | last post by:
What are the essential steps and strategies outlined in the Data Structures and Algorithms (DSA) roadmap for aspiring data scientists? How can individuals effectively utilize this roadmap to progress...
0
by: Hystou | last post by:
There are some requirements for setting up RAID: 1. The motherboard and BIOS support RAID configuration. 2. The motherboard has 2 or more available SATA protocol SSD/HDD slots (including MSATA, M.2...

By using Bytes.com and it's services, you agree to our Privacy Policy and Terms of Use.

To disable or enable advertisements and analytics tracking please visit the manage ads & tracking page.