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

Help with string parameters in functions

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



Joined: 16 Aug 2006
Posts: 19

View user's profile Send private message

Help with string parameters in functions
PostPosted: Fri Aug 18, 2006 2:19 pm     Reply with quote

Hi:

�I'm a little confused about string handling. I need to implement the next function: Given 2 16-bytes strings (a,b), generate a 3rd string(c), where
each element of c is the result of XORing the respective elements of a and b. Something like this:

Code:

int i;
char a[16],b[16],c[16];
strcpy(a,"ABCDEFGHIJKLMNOP");
strcpy(b,"abcdefghijklmnop"); 

for(i=0;i<=15;i++)
 c[i] = a[i] ^ b[i];


�This way it works OK. But I need to implement a function where a and b are entered as parameters. I've tried unsuccessfully to define this function (won't compile), so this is the code I wrote:

Code:

char XorBytes(char b1[16], char b2[16])
{
int aux,i;
char temp[16];
for(i=0;i<=15;i++)
 temp[i] = b1[i] ^ b2[i];
for(i=0;i<=15;i++)
 aux = temp[i];
return temp;
}
 
void main()      
{
int i,aux;
char a[16],b[16],c;
strcpy(a,"ABCDEFGHIJKLMNOP");
strcpy(b,"abcdefghijklmnop");
c = XorBytes(a,b);
sleep();
}


�As you see, it's not very functional; the aux variable is used to debug the value of each element of the string, using a breakpoint and the Watch window within MPLAB.

�It seems i'm not passing the arguments to the function the right way... If you can help me, i'll be grateful.

Best regards,

Fernando
PCM programmer



Joined: 06 Sep 2003
Posts: 21708

View user's profile Send private message

PostPosted: Fri Aug 18, 2006 2:28 pm     Reply with quote

Quote:
int i;
char a[16],b[16],c[16];
strcpy(a,"ABCDEFGHIJKLMNOP");
strcpy(b,"abcdefghijklmnop");

for(i=0;i<=15;i++)
c[i] = a[i] ^ b[i];

This way it works OK.

This is not OK. Your strings are 16 characters long, plus the string
terminator byte (0x00) at the end. This is 17 bytes total, but you
arrays are only declared as 16 bytes long. You need to increase
the array size to 17 bytes, minimum.
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Fri Aug 18, 2006 6:55 pm     Reply with quote

Another problem is that a function can not return a pointer to an automatic array. Your temp array is reserved on the stack in RAM, on returning from the function this RAM is given back to the system. You can not count on this memory still being available.

A possible solution is to pass your function an additional parameter with a pointer to a memory buffer for storing the result value.

Code:
void XorBytes(char b1[], char b2[], char c[])
{
  int aux,i;

  for(i=0;i<=15;i++)
    c[i] = b1[i] ^ b2[i];
  for(i=0;i<=15;i++)
    aux = c[i];
}
 
void main()     
{
  int i,aux;
  char a[17],b[17],c[17];   // Made c an array as well
  strcpy(a,"ABCDEFGHIJKLMNOP");
  strcpy(b,"abcdefghijklmnop");
  XorBytes(a,b,c);
  sleep();
}


Edit: Changed return type for function XorBytes to void.


Last edited by ckielstra on Sun Aug 20, 2006 7:07 am; edited 1 time in total
Guest








PostPosted: Sun Aug 20, 2006 3:36 am     Reply with quote

ckielstra wrote:

Code:
char XorBytes(char b1[], char b2[], char c[])
{
  ..........
}
 
void main()     
{
  int i,aux;
 .........
}


Yep, while this is a solution, I've found myself in one program with a serious problem. The String intended to be a result string has overwritten one of my main function variables destroying everything else. Go figure. How can this be possible? Maybe I have done something wrong but sure this is annoying.

In case the problem is not clearly explained, lets say that variable i declarated in main is 8. Then you call to XorBytes to obtain the desired result. Then, when you're back in main function, you take a look at i and it is anything else. Strange, isn't it?
Ttelmah
Guest







PostPosted: Sun Aug 20, 2006 5:04 am     Reply with quote

If you know the maximum length of the strings, then you can use:
Code:

char * XorBytes(char a[],char b[]) {
    static char target[17];
    int i=0;
    do
        target[i] = a[i]^b[i];
    while (i++<16);
    return(target);
}

void main()  {
    char a[17],b[17],*c;
    strcpy(a,"ABCDEFGHIJKLMNOP");
    strcpy(b,"abcdefghijklmnop");
    c = XorBytes(a,b);
    sleep();
}

For the really 'flashy' version, you can use the memory management functions, to allocate a dynamic memory block to hold the result.

Best Wishes
ckielstra



Joined: 18 Mar 2004
Posts: 3680
Location: The Netherlands

View user's profile Send private message

PostPosted: Sun Aug 20, 2006 7:19 am     Reply with quote

Quote:
Yep, while this is a solution, I've found myself in one program with a serious problem. The String intended to be a result string has overwritten one of my main function variables destroying everything else. Go figure. How can this be possible? Maybe I have done something wrong but sure this is annoying.
It sounds like you have an error in your program causing data to be overwritten. Your short demo program shows several of the common causes for these errors:
- Data buffers that are 1 character too short. When copying strings you also have to reserve memory for the terminating zero.
- Returning a string that was allocated on the local heap is a recipe for disaster.
- You are returning a string as a char data type instead of char * (see Ttelmahs code for the correct varible declarations).

Check all your code for the above error types.
Guest








PostPosted: Sun Aug 20, 2006 10:39 am     Reply with quote

ckielstra wrote:
It sounds like you have an error in your program causing data to be overwritten. Your short demo program shows several of the common causes for these errors:
- Data buffers that are 1 character too short. When copying strings you also have to reserve memory for the terminating zero.
- Returning a string that was allocated on the local heap is a recipe for disaster.
- You are returning a string as a char data type instead of char * (see Ttelmahs code for the correct varible declarations).

Check all your code for the above error types.


Hello Ckielstra. I'm sorry for what seems to be a confussion. I'm not the original poster of the thread. I was just adding a comment on something a "trippled" with a few days ago.

I had the char string or buffer declared with the "extra" byte in size into consideration.
On the second statement you had me lost and can't make a comment on it as I don't get what you mean.
And in returning the string I was returning it something like this way (it returned well, but overwrote a different variable declared in main function):

void MyFunction (int iData, char cData/*,...any other info it does need*/ char cResultString[])
{
Here I wrote on it with strcopy and/or with cResultString[i]=any char and added at the end the '\0'
}

Hope it clears things out and thanks so much for your help clarifying this strange happening to us.

Best wishes
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