[futurebasic] CFDictionary with embedded a CFArray with a key @"results"

Message: < previous - next > : Reply : Subscribe : Cleanse
Home   : August 2011 : Group Archive : Group : All Groups

From: Ken Shmidheiser <kshmidheiser@...>
Date: Sat, 6 Aug 2011 18:34:02 -0400
Thomas asked:

>  Everything is working as expected.
>
>rows = (CFMutableArrayRef) CFDictionaryGetValue(query,
>resultsArrayNameRef);
>
>
>When I add another CFArray to my dictionary with a different CFString key
>@"selectcols", my code compiles, but the application quits unexpectedly.
>I can not tell what is causing this to fail;  Is there a way to debug this?

Thomas,

If you drop this convention of predefining your keys:

dim as CFStringRef   resultsArrayNameRef  :  resultsArrayNameRef  =  @"results"

....

fn CFDictionaryAddValue( queryDictionaryRef,  resultsArrayNameRef, 
resultsArrayRef    )


and  use the key pointer directly as a CFString:


fn CFDictionaryAddValue( queryDictionaryRef,  @"results", 
resultsArrayRef   )


your code works. Here's a little demo to try both ways and see the difference.

Ken



include "ConsoleWindow"

local fn ConsoleCFPrint( typeRef as CFTypeRef )
'~'1
dim as CFStringRef   oldText, newText

oldText = fn HIViewCopyText( sConsoleHITextView )
newText = fn CFStringCreateWithFormat( _kCFAllocatorDefault, #0, 
@"%@%@\r", oldText, typeRef )
CFRelease( oldText )
fn HIViewSetText( sConsoleHITextView, newText )
CFRelease( newText )
end fn


dim as CFMutableDictionaryRef  queryDictionaryRef : queryDictionaryRef = 0
dim as CFTypeRef  resultsDictionaryValue, selectcolsDictionaryValue  
dim as CFindex    i, elementsInArray

// dim as CFStringRef   resultsArrayNameRef    : resultsArrayNameRef 
= @"results"
// dim as CFStringRef   selectcolsArrayNameRef : 
selectcolsArrayNameRef = @"selectcols"
dim as CFStringRef   result

dim as CFMutableArrayRef resultsArrayRef    : resultsArrayRef = 0
dim as CFMutableArrayRef selectcolsArrayRef : selectcolsArrayRef = 0

queryDictionaryRef = fn CFDictionaryCreateMutable( 
_kCFAllocatorDefault, 0, @kCFCopyStringDictionaryKeyCallBacks, 
@kCFTypeDictionaryValueCallBacks )

/*  Setup the Dictionary with an empty results array */
resultsArrayRef    = fn CFArrayCreateMutable( _kCFAllocatorDefault, 
0, @kCFTypeArrayCallBacks )
selectcolsArrayRef = fn CFArrayCreateMutable( _kCFAllocatorDefault, 
0, @kCFTypeArrayCallBacks )

CFArrayAppendValue( resultsArrayRef, @"Results 0" )
CFArrayAppendValue( resultsArrayRef, @"Results 1" )
CFArrayAppendValue( resultsArrayRef, @"Results 2" )

fn ConsoleCFPrint( @"Elements in resultsArrayRef:" )
elementsInArray = fn CFArrayGetCount( resultsArrayRef )
for i = 0 to elementsInArray -1
result = fn CFArrayGetValueAtIndex( resultsArrayRef, i )
fn ConsoleCFPrint( result )
next

CFArrayAppendValue( selectcolsArrayRef, @"Column 0" )
CFArrayAppendValue( selectcolsArrayRef, @"Column 1" )
CFArrayAppendValue( selectcolsArrayRef, @"Column 2" )

fn ConsoleCFPrint( @"\rElements in selectcolsArrayRef:" )
elementsInArray = fn CFArrayGetCount( selectcolsArrayRef )
for i = 0 to elementsInArray -1
result = fn CFArrayGetValueAtIndex( selectcolsArrayRef, i )
fn ConsoleCFPrint( result )
next

fn CFDictionaryAddValue( queryDictionaryRef, @"results", 
resultsArrayRef    )
fn CFDictionaryAddValue( queryDictionaryRef, @"selectcols", 
selectcolsArrayRef )

resultsDictionaryValue    = fn CFDictionaryGetValue( 
queryDictionaryRef, @"results"    )
selectcolsDictionaryValue = fn CFDictionaryGetValue( 
queryDictionaryRef, @"selectcols" )

elementsInArray = fn CFArrayGetCount( ( CFArrayRef )resultsDictionaryValue )

fn ConsoleCFPrint( @"\r\rResults from resultsArrayRef stored in dictionary:" )

for i = 0 to elementsInArray - 1
result = fn CFArrayGetValueAtIndex( ( CFArrayRef )resultsDictionaryValue, i )
fn ConsoleCFPrint( result )
next


elementsInArray = fn CFArrayGetCount( ( CFArrayRef )selectcolsDictionaryValue )

fn ConsoleCFPrint( @"\rResults from selectcolsArrayRef stored in dictionary" )
for i = 0 to elementsInArray - 1
result = fn CFArrayGetValueAtIndex( ( CFArrayRef 
)selectcolsDictionaryValue, i )
fn ConsoleCFPrint( result )
next