[Python-Dev] Baffled by PyArg_ParseTupleAndKeywords modification (original) (raw)
Bengt Richter bokr at oz.net
Fri Feb 10 21:36:15 CET 2006
- Previous message: [Python-Dev] Baffled by PyArg_ParseTupleAndKeywords modification
- Next message: [Python-Dev] Baffled by PyArg_ParseTupleAndKeywords modification
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
On Fri, 10 Feb 2006 18:02:03 +0100, =?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?= <martin at v.loewis.de> wrote:
Jeremy Hylton wrote:
I admit that I'm also puzzled by Jack's specific question. I don't understand why an array passed to PyArgParseTupleAndKeywords() would need to be declared as const. I observed the problem in my initial changes but didn't think very hard about the cause of the problem. Perhaps someone with better C/C++ standards chops can explain. Please take a look at this code: void foo(const char** x, const char*s) { x[0] = s; } void bar() { char *kwds[] = {0}; const char *s = "Text"; foo(kwds, s); kwds[0][0] = 't'; } If it was correct, you would be able to modify the const char array in the string literal, without any compiler errors. The assignment x[0] = s; is kosher, because you are putting a const char* into a const char* array, and the assigment kwds[0][0] = 't'; is ok, because you are modifying a char array. So the place where it has to fail is the passing of the pointer-pointer. Will a typedef help?
----< martin.c >------------------------------------------- #include typedef const char *ptext; void foo(ptext *kw) { const char *s = "Text"; ptext *p; for(p=kw;*p;p++){ printf("foo:%s\n", *p);} kw[0] = s; for(p=kw;*p;p++){ printf("foo2:%s\n", p);} kw[0][0] = 't'; / comment this out and it compiles and runs */ for(p=kw;*p;p++){ printf("foo3:%s\n", *p);} }
int main() { char *kwds[] = {"Foo","Bar",0}; char **p; for(p=kwds;*p;p++){ printf("%s\n", *p);} foo(kwds); for(p=kwds;*p;p++){ printf("%s\n", *p);} }
[12:32] C:\pywk\pydev>cl martin.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
martin.c martin.c(10) : error C2166: l-value specifies const object
But after commenting out:
[12:32] C:\pywk\pydev>cl martin.c Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8168 for 80x86 Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
martin.c Microsoft (R) Incremental Linker Version 6.00.8168 Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:martin.exe martin.obj
[12:34] C:\pywk\pydev>martin Foo Bar foo:Foo foo:Bar foo2:Text foo2:Bar foo3:Text foo3:Bar Text Bar
Regards, Bengt Richter
- Previous message: [Python-Dev] Baffled by PyArg_ParseTupleAndKeywords modification
- Next message: [Python-Dev] Baffled by PyArg_ParseTupleAndKeywords modification
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]