On Fri, 10 Feb 2006 18:02:03 +0100, =?ISO-8859-1?Q?=22Martin_v=2E_L=F6wis=22?= <[EMAIL PROTECTED]> 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 PyArg_ParseTupleAndKeywords() 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 <cstdio> 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 _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com