Thanks. John's answer fixes the crashing loop. I still have the access violation in 64-bit mode when populating the tree, though.

On 10/23/2012 7:16 PM, john skaller wrote:
On 24/10/2012, at 10:26 AM, Tim Margheim wrote:
Here's the code:
--------------------------
     Pvoid_t JudySLRoot = NULL;   // main JudySL array
     Pvoid_t  PValue = NULL;         // pointer to JudySL array value
     char *Strings[11] = {"zoo", "ark", "Zed", "Ate", "basdfahsdfkjashdflkjashdflkjahsljkhfeiuahslfkje", "model", 
"Man", "fire", "f.re", "quorum" };

     for (uint64_t I=0; I<10; I++) //map each string to its index in the 
Strings array
     {
         char *String_Key = Strings[I];
         JSLI(PValue, JudySLRoot, (uint8_t*)String_Key);
I think it best NOT to use the macros. It's too hard to figure out
what's going on. JSLI here expects PValue to be an lvalue.
I did start using the functions, but when I hit the access violation, I decided to try the macros. That didn't fix it, but I didn't get around to changing it back to functions.

At any rate, PValue /is/ an lvalue, isn't it? So I still need to figure out why it works properly in 32-bit, but hits an access violation in 64-bit. Or am I missing something?

Here is your bug. JSLF does NOT retrieve the first element
in the array.
[...]
So you have 5 search  operators:

        >= > == < <=

ALL of which require a valid input key. The names First,
Next, Get, Prev, Last, are a bit unconventional
(Ge, Gt, Eq, Lt, Le) would have been better. But they're just
names, the actual C interface is perfect.
Ah, thanks for clearing that up. So to find the first element, I should be passing in "" as the key, and it will end up being replaced by the first key value >= to "". Then to iterate through all the elements of the tree, I loop using the Next function/macro.

How large should I make the buffer? Is there a maximum size that Judy has for a key value--and I should use that? Or should I define my own maximum size for keys on my tree, and use that?

Anyway, I tried this, and the loop now works as I had intended:

    uint8_t Retrieved_String[100]={0}; //big enough for my test strings
    PValue = NULL;
JSLF(PValue, JudySLRoot, Retrieved_String); //start by looking up the first key that is >= ""
    while (PValue!=NULL) //Iterate through the table.
    {
        Retrieved = *((Word_t*)PValue);
        JSLN(PValue, JudySLRoot, Retrieved_String);
    }

Anyway, I was wrongly assuming that I was passing in a uint8_t* which would end up pointing to an already-existing buffer with the key value. But of course, Judy doesn't /store/ a buffer with the key value; also, if that was the way the function was designed, I would've had to pass in a /const /uint8_t* to prevent me from modifying the stored buffer. Also, the parameter would actually have to be either a const//uint8_t*&, or a const//uint8_t**, so that the function could change the pointer's value.

If I'd payed closer attention to the function parameters, I could have figured it out.


---
Tim Margheim
Neuric Technologies, LLC
------------------------------------------------------------------------------
Everyone hates slow websites. So do we.
Make your web apps faster with AppDynamics
Download AppDynamics Lite for free today:
http://p.sf.net/sfu/appdyn_sfd2d_oct
_______________________________________________
Judy-devel mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/judy-devel

Reply via email to