On Aug 4, 9:47 am, Philip Semanchuk <phi...@semanchuk.com> wrote:
> On Aug 4, 2009, at 11:25 AM, Sparky wrote:
>
>
>
>
>
> > On Aug 3, 3:29 pm, Sparky <samnspa...@gmail.com> wrote:
> >> Hello! I am using cTypes on Windows to interface with a dll and I  
> >> keep
> >> getting an error when I execute this method:
>
> >> def eDigitalIn(self, channel, idNum = None, demo = 0, readD=0):
> >>         """
> >>         Name: U12.eAnalogIn(channel, idNum = None, demo = 0, readD=0)
> >>         Args: See section 4.4 of the User's Guide
> >>         Desc: This is a simplified version of Counter. Reads & resets
> >> the counter (CNT).
> >>         """
>
> >>         if idNum is None:
> >>             idNum = self.id
>
> >>         ljid = ctypes.c_long(idNum)
> >>         state = ctypes.c_long(999)
>
> >>         ecode = staticLib.ECount(ctypes.byref(ljid), demo, channel,
> >> readD, ctypes.byref(state))
>
> >>         if ecode != 0: raise LabJackException(ecode)
> >>         if ljid == -1: raise LabJackException(-1, "LabJack not
> >> found.")
>
> >>         return {"idnum":ljid.value, "state":state.value}
>
> >> Here is the error message:
> >> Traceback (most recent call last):
> >>   File "<pyshell#4>", line 1, in <module>
> >>     device.eDigitalIn(0)
> >>   File "C:\Documents and Settings\All Users\Documents\Python
> >> \LabJackPython_new\u12.py", line 118, in eDigitalIn
> >>     ecode = staticLib.ECount(ctypes.byref(ljid), demo, channel,  
> >> readD,
> >> ctypes.byref(state))
> >> WindowsError: exception: access violation writing 0x00000000
>
> >> Here is the signature of the method (which is known to work with C++
> >> programs):
>
> >> long _stdcall EDigitalIn(long *idnum,
> >>                                            long demo,
> >>                                            long channel,
> >>                                            long readD,
> >>                                            long *state);
>
> >> staticLib is declared with staticLib = ctypes.windll.LoadLibrary
> >> ("ljackuw").
>
> >> Any ideas?
>
> >> Thanks,
> >> Sam
>
> > One more thing, I seem to be getting back incorrect values for doubles
> > passed by reference. Any suggestions? I am on a 64-bit machine but I
> > should think that should not make a difference.
>
> Hi Sam,
> ctypes is pretty straightforward, and I wouldn't expect it to break on  
> something simple. I looked over your code (warning -- I am a ctypes  
> novice) and it looks OK to me. If you're getting null pointer writes  
> I'd suspect that the call signature isn't what you think it is,  
> perhaps due to a lack of an extern "C" declaration or something like  
> that. In short, I don't think this is a problem in your Python code or  
> in ctypes.
>
> But since your Python code is the easiest to change, why not do a  
> quick test of a minimal example?
>
> def eDigitalIn_test_version(self, channel, idNum = None, demo = 0,  
> readD=0):
>          ljid = ctypes.c_long(42)
>          state = ctypes.c_long(999)
>
>          ecode = staticLib.ECount(ctypes.byref(ljid), 0, 0, 0,  
> ctypes.byref(state))
>
>          print ecode
>
> Does that work any better?
>
> You could also try replacing the byref() calls with pointers created  
> by ctypes.pointer(). But I suspect that all this will do is give you  
> confidence that it isn't your Python code that's wrong.
>
> You might want to write a minimal C program that invokes ECount. That  
> would help you to prove whether or not you have a working C (not C++!)  
> interface for your function.
>
> HTH
> Philip

Hey Philip,

Thank you for your response. It turns out I was calling a function
that I was not intending on calling, so it was not a Python problem.

Thanks,
Sam
-- 
http://mail.python.org/mailman/listinfo/python-list

Reply via email to