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 CCS Technical Support

Returning a string from a function

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



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

Returning a string from a function
PostPosted: Tue Aug 16, 2011 7:54 am     Reply with quote

Hello all,

I am passing a string to a function and doing some operation on that string. Basically I am stripping out strings within the original string. Using a comma separation, I pass the string and the field number that I want to the function.
The function correctly separates the string and I have a char array with the string that I want in it.
But I cannot seem to return that result to the main program. I can return the first byte but cannot return the whole string.

Any ideas?

Thanks
FvM



Joined: 27 Aug 2008
Posts: 2337
Location: Germany

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 8:15 am     Reply with quote

Quote:
Any ideas?

How about showing some code?
ezflyr



Joined: 25 Oct 2010
Posts: 1019
Location: Tewksbury, MA

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 8:16 am     Reply with quote

Hi,

It's hard to tell without seeing your actual code, so why not just post the function for us to look at?

Thanks,

John
sjharris



Joined: 11 May 2006
Posts: 78

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 8:53 am     Reply with quote

Hopefully this will help??

Code:

/********************************************************************
*
*
*********************************************************************
*  Scope:-        Test SD Card read functions
*********************************************************************
*
*  Changes:-
*
*********************************************************************
*
*  To Do:-
*
*********************************************************************
*
*
********************************************************************/

/*
SD Card        PIC
-------        ---
CS             RB3
CLK            RC3
DO             RC4
DI             RC5
*/

/*
SD Card address

Address           Description
Pg File  Address
0x38     0x7000   First file - Settings
0x3C     0x7800   Second file- Data / Logging from PIC
0x18     0x3000   File counter
*/



//*******************************************************************
// Includes
//*******************************************************************
#define MMC_CLK   PIN_C3
#define MMC_DI    PIN_C4
#define MMC_DO    PIN_C5
#define MMC_CS    PIN_B3

#include "D:\Tests\test.h"
#include "D:\Tests\flexLCD.c"
#include <mmc_spi.c>
#include <string.h>
#include <stdlib.h>
//*******************************************************************
// Global Variables
//*******************************************************************
int8   data0[512];
int8  commands[512];
int16 timer1_counter = 0;

#BIT           rcsta_cren = 0xFAB.4
#BYTE          rcsta = 0xFAB

volatile unsigned char string_len = 0;

#define        MAX_STRING_LEN (32)
char           input_string[MAX_STRING_LEN+1];

volatile       boolean string_flag;
//*******************************************************************
// Interrupt Routines
//*******************************************************************
#int_RDA
void RDA_isr()
{
   char c;
   if(rcsta & 6)
   {
      rcsta_cren=0;
      rcsta_cren=1;
      c = getc();
   }
   else
   {
      c = getc();
      input_string[string_len++]=c;
      if(string_len==MAX_STRING_LEN || c==10)
      {
         input_string[string_len++]=0;
         string_len = 0;
         string_flag = TRUE;
      }
   }
}



#int_TIMER1
TIMER1_isr()
{
   timer1_counter++;
}


//*******************************************************************
// Functions
//*******************************************************************


separate_message(char *input, int field_num)
{
   char output[32];
   int *out;
   int i,counter,start_pos;

   puts(input);
   counter = 0;
   for(i=0; i< strlen(input); i++)
   {
      if(input[i]==',')
      {
         counter++;
         if(counter == field_num)
         {
            start_pos = i;
         }
      }
   }
   start_pos++;
   i=0;
   while(input[i+start_pos] != ',')
   {
      output[i] = input[i+start_pos];
      i++;
   }
   out=output[0];
   output[i]=0;
   printf("Output %s\n\r", output);
   return out;
}


//*******************************************************************
// CCS PIC Init
//*******************************************************************
void CCS_Init()
{
   setup_adc_ports(NO_ANALOGS|VSS_VDD);
   setup_adc(ADC_OFF|ADC_TAD_MUL_0);
   setup_psp(PSP_DISABLED);
   setup_spi(FALSE);
   setup_spi2(FALSE);
   setup_wdt(WDT_OFF);
   
   setup_timer_0(RTCC_INTERNAL);
   
   setup_timer_1(T1_INTERNAL|T1_DIV_BY_4);

   setup_timer_2(T2_DISABLED,0,1);
   setup_timer_3(T3_DISABLED|T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   setup_low_volt_detect(FALSE);
}

//*******************************************************************
// Other Init
//*******************************************************************

//*******************************************************************
// Main
//*******************************************************************


void main()
{
   int response;
   int attempt;
   int16 count, i;
   int *ptra;                                                        //Pointer used in
   int program_counter;                                              //Counter used to count number of commands
   int counter;                                                      //General purpose counter, do not use to store data
   int number_of_commands;
   char command[32];
   int tens, unit;
   char message[32];
   char reply[32];
   char timeout[3];
   int8 retry_time;

   int *messages;

   ptra = (data0[0]);

   count =0;
   attempt = 48;

   response = 0;

   CCS_Init();                                                       //Initialise PIC

   lcd_init();                                                       //Initialise LCD

   response = 18;

   lcd_putc("SD Read test");                                        //Write on lcd
   lcd_gotoxy(1,2);
   lcd_putc("Init");                                        //Write on lcd

   output_high(PIN_F0);

   while (response !=0)
   {
      response = mmc_init();
      lcd_gotoxy(6,2);
      lcd_putc("Error ");
      lcd_putc(response + 48);
      delay_ms(1000);
   }

   lcd_gotoxy(1,2);
   lcd_putc("Init OK      ");                                        //Write on lcd



    messages = separate_message(command,2);
    printf("Message :- %s\n\r", messages);


}



command has contents:- M,test1,test2,1,

output is:-
Output test2
Messages rubbish characters

Cheers
Ttelmah



Joined: 11 Mar 2010
Posts: 19535

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 9:19 am     Reply with quote

Some comments:
If you just add the keyword 'ERRORS' to your #use RS232 declaration, the compiler will automatically clear the UART error condition for you, allowing about half your INT_RDA, and setup code to disappear.....

First big problem though is you have not declared your 'separate_message' function as returning anything. By default a function will be treated as returning an integer in this case. An integer in CCS C, is an 8bit value. You need it to return a int/char pointer, which is larger than this. Get your function type declaration sorted...
Second problem is variable scope. A local variable only exists while it is being used. You return 'out' as a pointer to the char array 'output', but this array ceases to exist, when you leave the function (bits of it may well still exist in memory, but this is not guaranteed). You need to declare 'output' as _static_, so that it is retained when you leave the function.
Then there is a size problem in some cases. If the input buffer is full, it can contain 33 characters including the '\0'. You only have space for 32 in output. The same applies to command in the main code.
Then you have the problem of running off the end. In CCS, there is no operating system for the code to return to. If you run off the end of the code, things just stop. The last few characters of 'messages', will be unsent at this point.

Best Wishes
dyeatman



Joined: 06 Sep 2003
Posts: 1934
Location: Norman, OK

View user's profile Send private message

PostPosted: Tue Aug 16, 2011 11:03 am     Reply with quote

Here is an excellent discussion of returning an array (string) in C.

http://c-faq.com/~scs/cclass/int/sx5.html
_________________
Google and Forum Search are some of your best tools!!!!
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