I hope I have read your message correctly, because your question seems a bit odd to me (as your message comes from someone who knows the PIC architecture so well). So, I pray I haven't missed something that takes this from a beginning 'C' question to advanced syntax/semantics. When you initialize a structure, you must remember that strings are not a primitive type in 'C'. What you want to happen is for the strings to get copied from an element of the messages array to your struct members. Unfortunately, you can't do it without code in 'C'. A better construct is to have macro definitions for the strings and have the messages buffer elements AND the display_type_frames[] elements initialized from the macros. Like this: #define MY_MSG_SPLASH "Greenkeeper v" #define MY_MSG_ERR "Error" char **messages = { MY_MSG_SPLASH, MY_MSG_ERR }; SomeVarType_t display_type_frames[] = { { 0x81, MY_MSG_SPLASH, }, { 0x86, MY_MSG_ERR, } }; If the strings change dynamically, there is no substitute for a function that initializes your display_type_frames elements. What you were doing with this code: SomeVarType_t display_type_frames[] = { { 0x81, *messages[splash], } } is equivalent to putting a character in the second member, just as you discovered. This is because of how the pointers work. You have to use the operators in prececence. The messages variable is of type "char **", which is a list of pointers. Each pointer points to a list of characters. First precedence is the [] operator. That takes "char **" and goes to "char *" (getting some element of an array pointed to by the "char **" array). The index in the your first example is "splash" which I'm not sure is a constant or a variable (I didn't read the prior messages, oops!). The "*" operator comes next, and it does the same thing but it evaluates to the first element pointed to by the pointer. So, you go from "char *" to "char". Brian -----Original Message----- I've discovered that I have some form of 'pointing 'problem, if I replace the struct like so - everything works display_type frames[3]={ { 0x81, //*messages[splash] "Greenkeeper v" }, { 0x86, //*messages[err] "Error" }, { 0xC0, //*messages[set] "Time" } }; If I replace the actual strings back to the *messages[x] then what I get is only the first character of the string, and no amount of persuading seems to alter this, even if I try and copy the sub array into a temporary buffer and then use that to copy into the display buffer - which also seems a very long winded and inelegant way to accomplish this. The main calling code is now { strcpy(DisplayBuffer+1,&frames[index].display_no[0]); DisplayBuffer[0]=frames[index].position[0]; display(DisplayBuffer); } Where index decides which frame within the frames array is to be used. The hard coded zero is so that each part of the array starts at the first character. I also found that to get this to work I had to change the first struct to struct display_type { unsigned char position[1]; unsigned char display_no[14]; //THIS CHANGED FOR LEN OF MAX SIZE in *messages[]. } So I'm almost there, I could compromise and just use the code as it stands, but I hate being defeated with problems, and the whole idea was to make the menu code more portable between projects and easier to maintain. And before anyone points out that DisplayBuffer is not how I've written the other labels, this is because this label was produced by the Renesas project generator, and I just haven't changed it to my style. Colin -- cdb, bodgy1@optusnet.com.au on 29.11.2003 -- http://www.piclist.com hint: The list server can filter out subtopics (like ads or off topics) for you. See http://www.piclist.com/#topics -- http://www.piclist.com hint: The list server can filter out subtopics (like ads or off topics) for you. See http://www.piclist.com/#topics