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

array struct list

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



Joined: 27 Nov 2006
Posts: 13

View user's profile Send private message

array struct list
PostPosted: Tue Jun 18, 2019 8:49 pm     Reply with quote

Hello to everyone,
I'm having trouble reading an array of structures. I hope there's someone who can help.
Here's a very simplified version:

CCS version 5.081

Code:

#include <18F4620.h>
#device ADC=10

#CASE

// ***********************************************************************
// *     Types definitions
// ***********************************************************************
typedef unsigned  int1     bit_t;
typedef unsigned  int1     bool;
typedef unsigned  int8     uint8_t;
typedef signed    int8     int8_t;
typedef unsigned  int16    uint16_t;
typedef signed    int16    int16_t;
typedef unsigned  int32    uint32_t;
typedef signed    int32    int32_t;



#FUSES NOWDT                    //No Watch Dog Timer
#FUSES PUT                      //Power Up Timer
#FUSES NOPBADEN                 //PORTB pins are configured as digital I/O on RESET
#FUSES MCLR                     //Master Clear pin enabled
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)


#use delay(clock = 40MHz, crystal = 10MHz)




struct ButtonObj
{
  uint8_t             _but_id;            // ButtonID
  uint8_t             _scn_cid;               // Screen ID */
  uint8_t             _name[10];          // Button name */
  void                *_press_ptr;        // Button Press Callback Func
};



#define CreateButtonObj(obj, butid, scnid, name) \
                                                    obj._but_id = butid;              \
                                                    obj._scn_cid = scnid;               \
                                                    strcpy(obj._name, name)



struct ButtonObj but_Down, but_Up, but_Enter;     // Define Buttons


struct ButtonObj *button_list[] = {
    &but_Down,
    &but_Up,
    &but_Enter
    };



#define but_upScnID                    0
#define but_upID                       0

#define but_downScnID                  0
#define but_downID                     1

#define but_enterScnID                 0
#define but_enterID                    2




void Button_Checking(struct ButtonObj **list, uint8_t scnid, uint8_t butid, uint8_t ePress)
{
  struct ButtonObj *ob = NULL;
  uint8_t i = 0;
 
  if (list == 0) return;

  for (i = 0; list[i] != 0; i++)
  {
    ob = list[i];
    //
    //
    Lcd_GotoXY(1, 2+i);
    printf(Lcd_Putc, "%u: bid:%u scid:%u    ", i, ob->_but_id, ob->_scn_cid);
    //
    //
  }
}




void main()
{
  CreateButtonObj(but_Down,  but_downScnID,  but_downID,  "Down");
  CreateButtonObj(but_Up,    but_upScnID,    but_upID,    "Up");
  CreateButtonObj(but_Enter, but_enterScnID, but_enterID, "Enter");

  while(1)
  {
    Button_Checking(nex_listen_list, but_downScnID,  but_downID,  1);   // Print to LCD
    delay_ms(1000);  // for testing
    Button_Checking(nex_listen_list, but_enterScnID, but_enterID, 1);   // Not Print
  }
}

If I try a wide variety of methods, this is the way I can get data output even if there is only one line in the for loop. I couldn't figure out why the list didn't accept only one object and the other two. I think there is a problem, especially in the following lines:

Code:
struct ButtonObj *button_list[] = {
    &but_Down,
    &but_Up,
    &but_Enter
    };


Thanks in advance for your help.

Namik
Ttelmah



Joined: 11 Mar 2010
Posts: 19219

View user's profile Send private message

PostPosted: Wed Jun 19, 2019 2:38 am     Reply with quote

Use pointer offsets, not array indexes.

So:
ob = *(list+i);

If you use array accesses for a pointer to a pointer, CCS does't 'know' to
apply the size of a pointer to the arithmetic. So it'll be accessing the wrong
location when it accesses anything other than i=0.
With that change, you should find it'll work.
Cenatronics



Joined: 27 Nov 2006
Posts: 13

View user's profile Send private message

PostPosted: Wed Jun 19, 2019 5:34 am     Reply with quote

thank you very much.
Cenatronics



Joined: 27 Nov 2006
Posts: 13

View user's profile Send private message

PostPosted: Wed Jun 19, 2019 6:08 am     Reply with quote

How do we understand what CCS does and what it does. How do you obtain this information? These are not specified in the CCS manual.
I didn't read any more books on the markers (which I missed). And I'm not an expert on C.

Namik
Ttelmah



Joined: 11 Mar 2010
Posts: 19219

View user's profile Send private message

PostPosted: Wed Jun 19, 2019 6:28 am     Reply with quote

Just by trying.

I tried using an array of pointers a while ago, and preferred to use 'array'
notation as you are doing, and found it did not work. Was testing in a
debugger, and could see the offset was being incorrectly calculated, so
tried using the pointer notation instead, and much to my surprise found
this ran OK. Smile

That is the key to this forum. The dozens of 'old hands', who have at one time
or another tried almost everything possible on PIC's and the compiler, and
in doing so, have found solutions for this type of problem.
Cenatronics



Joined: 27 Nov 2006
Posts: 13

View user's profile Send private message

PostPosted: Wed Jun 19, 2019 6:55 am     Reply with quote

Thanks for this nice explanation. It was very useful.

Namik
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