Quantcast

example in FFI manual not worked

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
5 messages Options
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

example in FFI manual not worked

Yuriy Babah
Hello everyone,

I'm new to Pharo and have tried do example with structure in Unified FFI manual.

FFIExternalStructure subclass: #MyStructure
instanceVariableNames: ''
classVariableNames: ''
package: 'FFIDemo'

MyStructure class>>#fieldsDesc
^ #(
uint8 id;
char * struct_name;
uint name_length;
)

MyStructure rebuildFieldAccessors . -> DoIt -> MessageNotUnderstood

What's i do wrong?
I do it in
Pharo5 and 6, widows and os x.
Sorry for my english, it's not my native language.

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: example in FFI manual not worked

Ben Coman
Hi Yuriy,

Hope I can help.  I tried your example in build 60463 and its works fine.  So lets break it down.

On Wed, Apr 19, 2017 at 8:46 PM, Yuriy Babah <[hidden email]> wrote:
Hello everyone,

I'm new to Pharo and have tried do example with structure in Unified FFI manual.

FFIExternalStructure subclass: #MyStructure
instanceVariableNames: ''
classVariableNames: ''
package: 'FFIDemo'

You opened a System Browser and entered and accepted the above first on its own, 
such that the new package & class were added and the new class selected.

Then you clicked on the <Class> button, such that the "no messages" text in the third pane changed from 
normal font to bold font.  Then clicked on "no messages" to display the method template....
    messageSelectorAndArgumentNames
"comment stating purpose of message"
  | temporary variable names |
  statements
 
And replaced that text with the text below from "fieldsDesc" onwards, 
the Accepted that.


MyStructure class>>#fieldsDesc
^ #(
uint8 id;
char * struct_name;
uint name_length;
)


Then separately you evaluated(doIt) the following...
 
MyStructure rebuildFieldAccessors

 
. -> DoIt -> MessageNotUnderstood
What's i do wrong?

Does a debug window appear?  What is the exact text of the title bar, 
which details which message is not understood by which class.
This provides an important hint to what is wrong.

Further help might need a live chat. I'll be in discord for a couple of hours, but ask anyone there...

 cheers -ben

I do it in
Pharo5 and 6, widows and os x.
Sorry for my english, it's not my native language.


Your english is not too bad :)  

cheers -ben 
Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: example in FFI manual not worked

Yuriy Babah
I have recorded screencast abaut this my operations with Pharo.

https://drive.google.com/open?id=0B_0p5J9SNPlBOHduQlIxdHI0bk0

But sometimes I'm moved forvard to operations:

MyStructure rebuildFieldAccessors. -> DoIt -> Ok

myStruct := MyStructure externalNew. -> DoIt -> Ok

myStruct := id: 42. -> MessageDoesUnderstood.

I'm doesn't understand in which cases i got to this moment.

I'm associete that with that what i have a several copy's Pharo.
And somebody affect to other.

2017-04-19 18:46 GMT+04:00 Ben Coman <[hidden email]>:
Hi Yuriy,

Hope I can help.  I tried your example in build 60463 and its works fine.  So lets break it down.

On Wed, Apr 19, 2017 at 8:46 PM, Yuriy Babah <[hidden email]> wrote:
Hello everyone,

I'm new to Pharo and have tried do example with structure in Unified FFI manual.

FFIExternalStructure subclass: #MyStructure
instanceVariableNames: ''
classVariableNames: ''
package: 'FFIDemo'

You opened a System Browser and entered and accepted the above first on its own, 
such that the new package & class were added and the new class selected.

Then you clicked on the <Class> button, such that the "no messages" text in the third pane changed from 
normal font to bold font.  Then clicked on "no messages" to display the method template....
    messageSelectorAndArgumentNames
"comment stating purpose of message"
  | temporary variable names |
  statements
 
And replaced that text with the text below from "fieldsDesc" onwards, 
the Accepted that.


MyStructure class>>#fieldsDesc
^ #(
uint8 id;
char * struct_name;
uint name_length;
)


Then separately you evaluated(doIt) the following...
 
MyStructure rebuildFieldAccessors

 
. -> DoIt -> MessageNotUnderstood
What's i do wrong?

Does a debug window appear?  What is the exact text of the title bar, 
which details which message is not understood by which class.
This provides an important hint to what is wrong.

Further help might need a live chat. I'll be in discord for a couple of hours, but ask anyone there...

 cheers -ben

I do it in
Pharo5 and 6, widows and os x.
Sorry for my english, it's not my native language.


Your english is not too bad :)  

cheers -ben 

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: example in FFI manual not worked

Ben Coman
Okay that helps a lot.  You've done two things wrong.

1. You actually did....
        ExternalStructure subclass: #MyStructure
not
       FFIExternalStructure subclass: #MyStructure

This is what caused the error, since if you compare
the class-side methods (by clicking the <Class> button)
of ExternalStructure and FFIExternalStructure
you'll see only the latter has method #rebuildFieldAccessors.


2. You didn't click the <Class> button before adding method #fieldsDesc.
This would trip you up after you fix the above.
"MyStructure rebuildFieldAccessors" would no longer produce an error
but *nothing* would happen when you evaluate it.
When you add #fieldsDesc to the class-side, switch back to the instance-side
to observe what happens when you evaluate "MyStructure rebuildFieldAccessors".

You'll know you are looking at the class-side when you see the class's
class-side definition
     MyStructure class
         instanceVariableNames: ''

rather than the class's instance-side definition...
    FFIExternalStructure subclass: #MyStructure
        instanceVariableNames: ''
        classVariableNames: ''
        package: 'FFIDemo'

Pay attention that the documentation says
    MyStructure class>>#fieldsDesc
rather than
    MyStructure>>#fieldsDesc

The former is a method on the class-side
and the latter is   a method on the instance-side.

A weak analogy is that you can think of class-side methods
as the methods of MyStructure factory that produces the the Mystructure objects.

Actually I can see how "MyStructure class>>#fieldsDesc" can be
ambiguous to newcomers.
Your mind has not yet been conditioned to catch on that detail and and
glosses over it unconsciously thinking "yes, I know MyStructure is a
class. I'm adding a method to it".
This is something that often catches newcomers.  I remember getting
caught on it myself.

Makes me wonder if documentation instead using   "MyStructure
classside>>#fieldsDesc"
is more intention revealing, and making the browser button match this
as  <Class Side>
would make working with instance/class-side more obvious to newcomers.

cheers -ben

On Thu, Apr 20, 2017 at 1:52 PM, Yuriy Babah <[hidden email]> wrote:

>
> I have recorded screencast abaut this my operations with Pharo.
>
> https://drive.google.com/open?id=0B_0p5J9SNPlBOHduQlIxdHI0bk0
>
> But sometimes I'm moved forvard to operations:
>
> MyStructure rebuildFieldAccessors. -> DoIt -> Ok
>
> myStruct := MyStructure externalNew. -> DoIt -> Ok
>
> myStruct := id: 42. -> MessageDoesUnderstood.
>
> I'm doesn't understand in which cases i got to this moment.
>
> I'm associete that with that what i have a several copy's Pharo.
> And somebody affect to other.
>
> 2017-04-19 18:46 GMT+04:00 Ben Coman <[hidden email]>:
>>
>> Hi Yuriy,
>>
>> Hope I can help.  I tried your example in build 60463 and its works fine.  So lets break it down.
>>
>> On Wed, Apr 19, 2017 at 8:46 PM, Yuriy Babah <[hidden email]> wrote:
>>>
>>> Hello everyone,
>>>
>>> I'm new to Pharo and have tried do example with structure in Unified FFI manual.
>>>
>>> FFIExternalStructure subclass: #MyStructure
>>> instanceVariableNames: ''
>>> classVariableNames: ''
>>> package: 'FFIDemo'
>>
>>
>> You opened a System Browser and entered and accepted the above first on its own,
>> such that the new package & class were added and the new class selected.
>>
>> Then you clicked on the <Class> button, such that the "no messages" text in the third pane changed from
>> normal font to bold font.  Then clicked on "no messages" to display the method template....
>>     messageSelectorAndArgumentNames
>> "comment stating purpose of message"
>>   | temporary variable names |
>>   statements
>>
>> And replaced that text with the text below from "fieldsDesc" onwards,
>> the Accepted that.
>>
>>>
>>> MyStructure class>>#fieldsDesc
>>> ^ #(
>>> uint8 id;
>>> char * struct_name;
>>> uint name_length;
>>> )
>>>
>>
>> Then separately you evaluated(doIt) the following...
>>
>>>
>>> MyStructure rebuildFieldAccessors
>>
>>
>>
>>>
>>> . -> DoIt -> MessageNotUnderstood
>>>
>>> What's i do wrong?
>>
>>
>> Does a debug window appear?  What is the exact text of the title bar,
>> which details which message is not understood by which class.
>> This provides an important hint to what is wrong.
>>
>> Further help might need a live chat. I'll be in discord for a couple of hours, but ask anyone there...
>> https://discord.gg/KCKQSSt
>>
>>  cheers -ben
>>
>>> I do it in
>>> Pharo5 and 6, widows and os x.
>>> Sorry for my english, it's not my native language.
>>>
>>
>> Your english is not too bad :)
>>
>> cheers -ben
>
>

Reply | Threaded
Open this post in threaded view
|  
Report Content as Inappropriate

Re: example in FFI manual not worked

Yuriy Babah
Thank Ben.

2017-04-20 12:49 GMT+04:00 Ben Coman <[hidden email]>:
Okay that helps a lot.  You've done two things wrong.

1. You actually did....
        ExternalStructure subclass: #MyStructure
not
       FFIExternalStructure subclass: #MyStructure

This is what caused the error, since if you compare
the class-side methods (by clicking the <Class> button)
of ExternalStructure and FFIExternalStructure
you'll see only the latter has method #rebuildFieldAccessors.


2. You didn't click the <Class> button before adding method #fieldsDesc.
This would trip you up after you fix the above.
"MyStructure rebuildFieldAccessors" would no longer produce an error
but *nothing* would happen when you evaluate it.
When you add #fieldsDesc to the class-side, switch back to the instance-side
to observe what happens when you evaluate "MyStructure rebuildFieldAccessors".

You'll know you are looking at the class-side when you see the class's
class-side definition
     MyStructure class
         instanceVariableNames: ''

rather than the class's instance-side definition...
    FFIExternalStructure subclass: #MyStructure
        instanceVariableNames: ''
        classVariableNames: ''
        package: 'FFIDemo'

Pay attention that the documentation says
    MyStructure class>>#fieldsDesc
rather than
    MyStructure>>#fieldsDesc

The former is a method on the class-side
and the latter is   a method on the instance-side.

A weak analogy is that you can think of class-side methods
as the methods of MyStructure factory that produces the the Mystructure objects.

Actually I can see how "MyStructure class>>#fieldsDesc" can be
ambiguous to newcomers.
Your mind has not yet been conditioned to catch on that detail and and
glosses over it unconsciously thinking "yes, I know MyStructure is a
class. I'm adding a method to it".
This is something that often catches newcomers.  I remember getting
caught on it myself.

Makes me wonder if documentation instead using   "MyStructure
classside>>#fieldsDesc"
is more intention revealing, and making the browser button match this
as  <Class Side>
would make working with instance/class-side more obvious to newcomers.

cheers -ben

On Thu, Apr 20, 2017 at 1:52 PM, Yuriy Babah <[hidden email]> wrote:
>
> I have recorded screencast abaut this my operations with Pharo.
>
> https://drive.google.com/open?id=0B_0p5J9SNPlBOHduQlIxdHI0bk0
>
> But sometimes I'm moved forvard to operations:
>
> MyStructure rebuildFieldAccessors. -> DoIt -> Ok
>
> myStruct := MyStructure externalNew. -> DoIt -> Ok
>
> myStruct := id: 42. -> MessageDoesUnderstood.
>
> I'm doesn't understand in which cases i got to this moment.
>
> I'm associete that with that what i have a several copy's Pharo.
> And somebody affect to other.
>
> 2017-04-19 18:46 GMT+04:00 Ben Coman <[hidden email]>:
>>
>> Hi Yuriy,
>>
>> Hope I can help.  I tried your example in build 60463 and its works fine.  So lets break it down.
>>
>> On Wed, Apr 19, 2017 at 8:46 PM, Yuriy Babah <[hidden email]> wrote:
>>>
>>> Hello everyone,
>>>
>>> I'm new to Pharo and have tried do example with structure in Unified FFI manual.
>>>
>>> FFIExternalStructure subclass: #MyStructure
>>> instanceVariableNames: ''
>>> classVariableNames: ''
>>> package: 'FFIDemo'
>>
>>
>> You opened a System Browser and entered and accepted the above first on its own,
>> such that the new package & class were added and the new class selected.
>>
>> Then you clicked on the <Class> button, such that the "no messages" text in the third pane changed from
>> normal font to bold font.  Then clicked on "no messages" to display the method template....
>>     messageSelectorAndArgumentNames
>> "comment stating purpose of message"
>>   | temporary variable names |
>>   statements
>>
>> And replaced that text with the text below from "fieldsDesc" onwards,
>> the Accepted that.
>>
>>>
>>> MyStructure class>>#fieldsDesc
>>> ^ #(
>>> uint8 id;
>>> char * struct_name;
>>> uint name_length;
>>> )
>>>
>>
>> Then separately you evaluated(doIt) the following...
>>
>>>
>>> MyStructure rebuildFieldAccessors
>>
>>
>>
>>>
>>> . -> DoIt -> MessageNotUnderstood
>>>
>>> What's i do wrong?
>>
>>
>> Does a debug window appear?  What is the exact text of the title bar,
>> which details which message is not understood by which class.
>> This provides an important hint to what is wrong.
>>
>> Further help might need a live chat. I'll be in discord for a couple of hours, but ask anyone there...
>> https://discord.gg/KCKQSSt
>>
>>  cheers -ben
>>
>>> I do it in
>>> Pharo5 and 6, widows and os x.
>>> Sorry for my english, it's not my native language.
>>>
>>
>> Your english is not too bad :)
>>
>> cheers -ben
>
>


Loading...