|
|
View previous topic :: View next topic |
Author |
Message |
ibg
Joined: 19 Nov 2003 Posts: 22
|
Initialisation array problem |
Posted: Mon May 17, 2004 11:41 am |
|
|
Hi,
I have a problem when I try to initiliase the 'time' field (it's a string) of a struct that belongs to an array.
The problem I got is that when I print 'time' just garbage appear.
The code is the following:
Code: |
#include <18F452.h> // The device (PIC 18F452) include file
#device *=16 ADC=10
#include <string.h>
#define MAX_FISH_DISPLAYED 3 // The Maximum number of fish entries displayed
#use delay(clock=19660800) // Sets the speed for the PIC (itīs meausured in cycles per second)
#use fast_io(A) // Fast method of doing Input/Output
#use fast_io(B) // The direction register will be set later with the "set_tris_X()" instruction
#use fast_io(C)
#use fast_io(D)
// I/O ports are mapped in memory (Have a look to the Special Function Register (SFR) of PIC18F452)
#byte PORTA = 0xF80
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#byte PORTD = 0xF83
#byte PORTE = 0xF84
// Peripheral Interrupt Request (for TIMER1)
#byte PIR1 = 0xF9E
#use rs232(baud=38400, xmit=PIN_C0, stream=DEBUG)
struct data_fish{
char time[10];
unsigned int32 frequency;
unsigned int pulses;
unsigned long signal_strength;
unsigned int32 time_unit;
};
char table[3][5]= {'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L','M', 'N', 'O'};
struct data_fish data_fish_array[MAX_FISH_DISPLAYED];
//-----------------------------------------------------------------------------------
// Functions used by the main program
void init();
void init_data_fish_array(struct data_fish a_data_fish_array[]);
//----------------------------------------------------------------------------------
// Main program
void main(void)
{
int i, j, k= 0;
int ascii_A= 65;
int ascii_B= 66;
int ascii_C= 67;
int ascii_D= 68;
int ascii_E= 69;
int ascii_to_add= 0;
init();
init_data_fish_array(data_fish_array);
fprintf(DEBUG, "Starting ...\n\r");
for (i= 0; i < MAX_FISH_DISPLAYED; i++)
{
fprintf(DEBUG, "%s\n", data_fish_array[i].time);
fprintf(DEBUG, "%lu\n", data_fish_array[i].frequency);
fprintf(DEBUG, "%d\n", data_fish_array[i].pulses);
fprintf(DEBUG, "%lu\n", data_fish_array[i].signal_strength);
fprintf(DEBUG, "%lu\n", data_fish_array[i].time_unit);
}
}
//----------------------------------------------------------------------------------
// Initialisation routine
void init()
{
// SET_TRIS is necessary when using fast_io (in order to establish the pin direction)
// Remember:
// 1 -> in
// 0 -> out
set_tris_a(0x00); // 0000 0000
set_tris_b(0x00); // 0000 0000
set_tris_c(0x00); // 0000 0000
set_tris_d(0x00); // 0000 0000
}
// Initialise the array that contains fish data
void init_data_fish_array(struct data_fish a_data_fish_array[])
{
char the_time[10]= "--:--:--";
int i;
for (i= 0; i < MAX_FISH_DISPLAYED; i++)
{
strcpy(a_data_fish_array[i].time, the_time);
a_data_fish_array[i].frequency= 0;
a_data_fish_array[i].pulses= 0;
a_data_fish_array[i].signal_strength= 0;
a_data_fish_array[i].time_unit= 0;
}
}
//----------------------------------------------------------------------------------
Thanks for your help,
ibg |
|
|
|
PCM programmer
Joined: 06 Sep 2003 Posts: 21708
|
|
Posted: Mon May 17, 2004 12:17 pm |
|
|
Quote: | The problem I got is that when I print 'time' just garbage appear.
strcpy(a_data_fish_array[i].time, the_time); |
Change the function name to "strcopy", and it should work.
strcopy(a_data_fish_array[i].time, the_time);
CCS uses strcopy() to do ram-to-ram copying.
They use strcpy() to copy from ROM-to-ram.
Since your source and destination strings are both in ram,
you must use strcopy. |
|
|
ibg
Joined: 19 Nov 2003 Posts: 22
|
'strcopy' doesn't work either |
Posted: Mon May 17, 2004 12:48 pm |
|
|
Sorry, but the function 'strcopy' doesn't work either. Any other suggestion?
Thanks,
ibg |
|
|
Hans Wedemeyer
Joined: 15 Sep 2003 Posts: 226
|
try this |
Posted: Mon May 17, 2004 3:06 pm |
|
|
#include <18F452.h> // The device (PIC 18F452) include file
#device *=16 ADC=10
#include <string.h>
#define MAX_FISH_DISPLAYED 3 // The Maximum number of fish entries displayed
#use delay(clock=19660800) // Sets the speed for the PIC (itīs meausured in cycles per second)
#use fast_io(A) // Fast method of doing Input/Output
#use fast_io(B) // The direction register will be set later with the "set_tris_X()" instruction
#use fast_io(C)
#use fast_io(D)
// I/O ports are mapped in memory (Have a look to the Special Function Register (SFR) of PIC18F452)
#byte PORTA = 0xF80
#byte PORTB = 0xF81
#byte PORTC = 0xF82
#byte PORTD = 0xF83
#byte PORTE = 0xF84
// Peripheral Interrupt Request (for TIMER1)
#byte PIR1 = 0xF9E
#use rs232(baud=38400, xmit=PIN_C0, stream=DEBUG)
typedef struct {
char time[10];
unsigned int32 frequency;
unsigned int pulses;
unsigned long signal_strength;
unsigned int32 time_unit;
}data_fish;
char table[3][5]= {'A', 'B', 'C','D', 'E', 'F','G', 'H', 'I','J', 'K', 'L','M', 'N', 'O'};
data_fish data_fish_array[MAX_FISH_DISPLAYED];
//-----------------------------------------------------------------------------------
// Functions used by the main program
void init();
// Initialise the array that contains fish data
void init_data_fish_array(data_fish a[])
{
char the_time[]={"--:--:--"};
int i;
for (i= 0; i < MAX_FISH_DISPLAYED; i++)
{
strcpy(a[i].time, the_time);
a[i].frequency= 0;
a[i].pulses= 0;
a[i].signal_strength= 0;
a[i].time_unit= 0;
}
}
//----------------------------------------------------------------------------------
// Main program
void main(void)
{
int i, j, k= 0;
int ascii_A= 65;
int ascii_B= 66;
int ascii_C= 67;
int ascii_D= 68;
int ascii_E= 69;
int ascii_to_add= 0;
init();
init_data_fish_array(data_fish_array);
fprintf(DEBUG, "Starting ...\n\r");
for (i= 0; i < MAX_FISH_DISPLAYED; i++)
{
fprintf(DEBUG, "%s\n", data_fish_array[i].time);
fprintf(DEBUG, "%lu\n", data_fish_array[i].frequency);
fprintf(DEBUG, "%d\n", data_fish_array[i].pulses);
fprintf(DEBUG, "%lu\n", data_fish_array[i].signal_strength);
fprintf(DEBUG, "%lu\n", data_fish_array[i].time_unit);
}
}
//----------------------------------------------------------------------------------
// Initialisation routine
void init()
{
// SET_TRIS is necessary when using fast_io (in order to establish the pin direction)
// Remember:
// 1 -> in
// 0 -> out
set_tris_a(0x00); // 0000 0000
set_tris_b(0x00); // 0000 0000
set_tris_c(0x00); // 0000 0000
set_tris_d(0x00); // 0000 0000
}
//---------------------------------------------------------------------------------- |
|
|
Guest
|
I still get garbage :( |
Posted: Tue May 18, 2004 3:38 pm |
|
|
Hi,
I have compiled and run the above code and I still get garbage when the time field is printed. Any suggestion about how to fix it?
Thanks,
ibg |
|
|
Hans Wedemeyer
Joined: 15 Sep 2003 Posts: 226
|
Re: I still get garbage :( |
Posted: Tue May 18, 2004 6:04 pm |
|
|
Anonymous wrote: | Hi,
I have compiled and run the above code and I still get garbage when the time field is printed. Any suggestion about how to fix it?
Thanks,
ibg |
try printing the array as it is initialized, and dump that strcpy:-
void init_data_fish_array(data_fish a[])
{
char the_time[]={"--:--:--"};
int i,j;
for (i= 0; i < MAX_FISH_DISPLAYED; i++)
{
for (j=0; j<strlen(the_time) ; j++)
{
a[i].time[j] = the_time[j];
puts(a[i].time[j]);
}
a[i].frequency= 0;
a[i].pulses= 0;
a[i].signal_strength= 0;
a[i].time_unit= 0;
}
}
If it prints OK then look for a problem elsewhere. |
|
|
Guest
|
It's working |
Posted: Wed May 19, 2004 11:33 am |
|
|
Hej again,
I don't know yet but the 'strcpy' has a weird behaviour and it doesn't work.
Anyway, I copy the string as suggested (going through the different elements of the string) and is working well.
Thanks,
ibg |
|
|
|
|
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
|