www.digitalmars.com         C & C++   DMDScript  

digitalmars.D - converting a char[][] to a char**

reply glen <glen_member pathlink.com> writes:
Hi All,
This seemingly simple thing is causing me alot of trouble.  Can someone show me
how I can convert an array of char[][] to a char**.  

Here is the pseudo code...

void runWithArgs( char[][] args ) {
char** execArgs;

// convert args to execArgs

execv( toStringz( "myprog" ), execArgs );

}


thanks,
Glen
Apr 20 2006
next sibling parent Derek Parnell <derek psych.ward> writes:
On Fri, 21 Apr 2006 02:07:17 +0000 (UTC), glen wrote:

 Hi All,
 This seemingly simple thing is causing me alot of trouble.  Can someone show me
 how I can convert an array of char[][] to a char**.  
 
 Here is the pseudo code...
 
 void runWithArgs( char[][] args ) {
 char** execArgs;
 
 // convert args to execArgs
 
 execv( toStringz( "myprog" ), execArgs );
 
 }
 

On the assumption that 'char**' points to an array of 'char*' and that array is terminated with a null pointer, then this might be what you are looking for ... ----------------- import std.string; char** toArgList(char[][] pOrig) { char*[] lTemp; lTemp.length = pOrig.length + 1; foreach(int i, char[] pc; pOrig) { lTemp[i] = toStringz(pc); } lTemp[$-1] = null; return lTemp.ptr; } void main(char[][] pArgs) { char** lOldStyle; lOldStyle = toArgList(pArgs); // Use the counted method of accessing them. for(int i = 0; i < pArgs.length; i++) { printf("%d '%s'\n", i, *(lOldStyle+i)); } // Use the terminating null method of accessing them. int j; char* cp; while(true) { cp = *(lOldStyle+j); if (cp == null) break; printf("%d '%s'\n", j, cp); j++; } } ----------------- -- Derek (skype: derek.j.parnell) Melbourne, Australia "Down with mediocracy!" 21/04/2006 1:07:07 PM
Apr 20 2006
prev sibling parent reply BCS <BCS_member pathlink.com> writes:
In article <e29eol$5sa$1 digitaldaemon.com>, glen says...
Hi All,
This seemingly simple thing is causing me alot of trouble.  Can someone show me
how I can convert an array of char[][] to a char**.  

Here is the pseudo code...

void runWithArgs( char[][] args ) {
char** execArgs;

// convert args to execArgs

execv( toStringz( "myprog" ), execArgs );

}


thanks,
Glen

this is quick and dirty but should work char[][] src; // what to convert alias char* cahr_p; // alias b/c I can't remember the syntax for a array of ptrs char_p[] res = new char_p[src.length+1]; foreach(int i, char[] st, src) res[i] = st.ptr; res[$-1] = null; // now use res.ptr
Apr 21 2006
parent Daniel Keep <daniel.keep.lists gmail.com> writes:
[snip]
 
 alias char* cahr_p;   
 // alias b/c I can't remember the syntax for a array of ptrs
 

Read it right-to-left. char*[] <-- array of pointers to chars If that doesn't help, you can always make an alias, and *then* expand it. alias char* char_p; char_p[] --> (char*)[] --> char*[] At least, that's how I work it out :) -- Daniel -- v1sw5+8Yhw5ln4+5pr6OFma8u6+7Lw4Tm6+7l6+7D a2Xs3MSr2e4/6+7t4TNSMb6HTOp5en5g6RAHCP http://hackerkey.com/
Apr 21 2006