CCS C Software and Maintenance Offers
FAQFAQ   FAQForum Help   FAQOfficial CCS Support   SearchSearch  RegisterRegister 

ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

CCS does not monitor this forum on a regular basis.

Please do not post bug reports on this forum. Send them to support@ccsinfo.com

Running string loop with external pointer

 
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion
View previous topic :: View next topic  
Author Message
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

Running string loop with external pointer
PostPosted: Wed Feb 10, 2016 5:45 pm     Reply with quote

Hello All,

I have a function that takes advantage of the loop mode, it takes a direct string between quotes and sets up a loop to process the entire string.

but If I send it the pointer, it only processes the first character. Anyone know of a way around this?

Ultimately I want to use this function within a function, and pass the string pointer to it...

SEE CODE

Code:

    //global
     char txt[20];
   
     
     show_string("test");
     
     //processes entire string
     //1 character at a time
     //decodes bitmap -- sends to screen
     
     
     strcpy(txt, "test");
     show_string(*txt);
     
     //processes first character only

ultimately

 int1 show_option(char *txt){

       // show_string(txt);
       // wait for button press{}
       // button press = return true;
       // timeout = return false;
       // }

     


Thanks
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Wed Feb 10, 2016 5:52 pm     Reply with quote

Quote:

char txt[20];

show_string(*txt);

but If I send it the pointer

That's not how you pass the address of an array to a function.
Research it in a book on C or using the net.
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 8:38 am     Reply with quote

Thanks PCM Programmer.

Indeed the "address of" operator is used here:

Code:

char txt[20];

show_string(&txt);


What im ultimately trying to accomplish is
Code:

int8 get_menu(int8 level, char txt_ROM){
 
   char txt_RAM[15];
   
   strcpy(txt_RAM, txt_ROM);

   show_string(&txt_RAM);
   //wait for button press... etc
}

where the function call would be...
choice = get_menu(1, "option 1");



so I guess my next question is how to pass the string in ROM as a parameter?

I think I have to do a strcpy before each time I use the function.

Thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19436

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 9:43 am     Reply with quote

You don't need the &.

In C, the name of an array, without any index, _is_ it's address. So you can just use the array name.
The compiler (fortunately) is smart enough to know if you ask for the address of this address, it should just return the address, but on a few rare occasions, with complex types, this can fail. So safer to just use the name.

You have two choices on an array in ROM. The first is just to copy them to RAM as you do. The second is to use the compiler option PASS_STRINGS=IN_RAM
Using this, if you hand a pointer to a const string to a function, the compiler will automatically 'virtualise' it into RAM. It uses a small buffer to do this and the array is then treated as if it did exist in RAM.
Downside is this is fractionally less efficient, bringing a small (very small normally) time penalty compared to the single copy.
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 10:42 am     Reply with quote

After trying many ways, I don't think it is possible to activate the loop mode UNLESS the actual string is hardcoded into the function like this:

Code:

void str_function(char str);

str_function("hello world"){

// process 1 character at a time
}


Following will not work even though string is copied to RAM:
Code:


char string[15];

strcpy(string, "example");

str_function(&string);



no luck with
Code:

#device PASS_STRINGS=IN_RAM


either

Thanks
ronaldoklais



Joined: 18 Dec 2012
Posts: 13

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 10:52 am     Reply with quote

Try to see about rom pointers:

http://www.ccsinfo.com/content.php?page=flexconst
Ttelmah



Joined: 11 Mar 2010
Posts: 19436

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 11:12 am     Reply with quote

You could use ROM pointers, but your problem is with your C syntax:

void str_function(char str);

Is saying that str_function is receiving a _single character_. Not a pointer. This needs to be:

void str_function(char *str);

Or

void str_function(char str[]);

The 'hardcode' works, because in CCS, if you have a function that is written to accept a single character. and you call this with:

function("A const string")

Then the function is automatically called multiple times for each character in the string.

You are using &, and * in the wrong places, initially having the * in the call, not the declaration, and still having the & in the call.

You need to write your function, so that it is actually coded to receive a string. Get a basic C textbook, or look at some examples online (or read the examples)...
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 11:57 am     Reply with quote

Quote:

void str_function(char str);

Is saying that str_function is receiving a _single character_. Not a pointer. This needs to be:

void str_function(char *str);




Ttelmah thanks for your response.

The issue is if the * is added to str, the looping function no longer works.

in its original form, void str_function(char str);
when called via str_function("example");
will process "example" one char at a time,

However, void str_function(char *str); breaks the looping function.
So I don't see how to use the looping function via a pointer.

what I will end up doing is creating a function with switch case (menu option)

Code:


void menu_txt(int8 menu_option){

      switch(menu_option){

      case 1:  show_string("first option"); break;
      case 2:  show_string("second_option"); break;
      case 3:  ...

       //etc
       return;
       }



thanks
Ttelmah



Joined: 11 Mar 2010
Posts: 19436

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 1:50 pm     Reply with quote

This really is basic C. You need to get a C textbook.
With a pointer:
Code:

//Suitable processor header

void display_something(char str[])
{
    while (*(str) != '\0')
    {
        //at this point *str is a character in the source string
        //do what you want with it
        str++; //move to next character
    }
}

void main(void)
{
    char buffer[] = "Demo string";
    //generate the string any way you want
    display_something(buffer);

    while(TRUE)
       ;
}


You have to use the pointer to walk through the string till you see the string terminator (\0).
davidd



Joined: 30 Sep 2010
Posts: 38

View user's profile Send private message

PostPosted: Thu Feb 11, 2016 3:39 pm     Reply with quote

Ttelmah thanks for your response.

yes, I realize I could parse it too.
thanks for your help!
Display posts from previous:   
Post new topic   Reply to topic    CCS Forum Index -> General CCS C Discussion All times are GMT - 6 Hours
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2005 phpBB Group