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

array size change after parameter sending (SOLVED)

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



Joined: 05 Oct 2016
Posts: 120

View user's profile Send private message

array size change after parameter sending (SOLVED)
PostPosted: Wed Mar 08, 2017 2:35 am     Reply with quote

Hello everyone

I wrote a code play a melody. It works successfully. I want to use the 3 arrays (dizi, bosluk, notauzunluk) as parameter to notacal() function. The problem is, after sending the array to function its size changes and decreases to 2. I use 18f2550.

These are the codes.
This one is working good:
Code:
#include <18F2550.h>
#DEVICE ADC=10
#fuses INTRC_IO,HS, NOWDT, NOLVP, HSPLL,NOMCLR,NOPROTECT,NODEBUG,NOBROWNOUT,USBDIV,PLL5,CPUDIV1,VREGEN,NOPUT
#use delay(clock=8000000)

#define voice PIN_A1
#include <math.h>

int16 A=568;    //1
int16 Ad=536;   //2
int16 B=506;    //3
int16 C=955;    //4
int16 Cd=901;   //5
int16 D=851;    //6
int16 Dd=804;   //7
int16 E=758;    //8
int16 F=715;    //9
int16 Fd=675;   //10
int16 G=634;    //11
int16 Gd=602;   //12
int16 A4=1136;  //13
int16 Ad4=1072; //14
int16 B4=1012;  //15
int16 C4=1911;  //16
int16 Cd4=1803; //17
int16 D4=1702;  //18
int16 Dd4=1607; //19
int16 E4=1516;  //20
int16 F4=1431;  //21
int16 Fd4=1351; //22
int16 G4=1275;  //23
int16 Gd4=1203; //24


//!int8 dizi[]= {15,14,13,24};    //fail melody 15,14,13,24
//!int16 bosluk[]= {0,0,0,0};    //notalar arasındaki bekleme süresi
//!int16 notauzunluk[]= {500,500,500,2000};   //notaların çalınma süresi
//!

int8 dizi[]= {11,4,7,9,11,4,7,9,6,9,14,7,6,9,14,7,6,4};    //fail melody 15,14,13,24
int16 bosluk[]= {50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50,50};    //notalar arasındaki bekleme süresi
int16 notauzunluk[]= {2000,2000,200,200,1000,1000,200,200,4000,2000,2000,200,200,1000,1000,200,200,4000};   //notaların çalınma süresi

//!

int vurus=1;
int16 k;
int16 i;
int16 duration=0;
float nota=0;
float temp=0;
//notalar

void pausesong()
{
output_low(voice);
delay_us(vurus);
}

void playnote(long note)   
{                         
output_high(voice);
delay_us(note);   
output_low(voice);
delay_us(note);
}


void main(){

   setup_oscillator(OSC_8MHz);
   
      while(1){
      delay_ms(1000);
         for (k=0; k<=sizeof(dizi)-1; k++)
         {                                         
               switch(dizi[k])
               {
                  case 0:  pausesong(); break;
                  case 1:  nota=A; break;
                  case 2:  nota=Ad; break;
                  case 3:  nota=B; break;
                  case 4:  nota=C; break;
                  case 5:  nota=Cd; break;
                  case 6:  nota=D; break;
                  case 7:  nota=Dd; break;
                  case 8:  nota=E; break;
                  case 9:  nota=F; break;
                  case 10: nota=Fd; break;
                  case 11: nota=G; break;
                  case 12: nota=Gd; break;
                  case 13: nota=A4; break;
                  case 14: nota=Ad4; break;
                  case 15: nota=B4; break;
                  case 16: nota=C4; break;
                  case 17: nota=Cd4; break;
                  case 18: nota=D4; break;
                  case 19: nota=Dd4; break;
                  case 20: nota=E4; break;
                  case 21: nota=F4; break;
                  case 22: nota=Fd4; break;
                  case 23: nota=G4; break;
                  case 24: nota=Gd4; break;
               }
               temp=nota/1000;
               duration=notauzunluk[k]/(temp*2);
                                                           
               for(i=0;i<(duration/2);i++)
               {
                  playnote(nota);
               } 
                                 
               delay_ms(bosluk[k]);
        }
    }
}


So i wrote this code. I tried to send the arrays as parameters. I want to be able to choose a melody without commenting and uncommenting dizi, bosluk, notavurus arrays Smile
Code:

#include <18F2550.h>
#fuses  INTRC_IO,NOWDT, PUT,NOMCLR,NOPROTECT,NOLVP,NODEBUG,NOBROWNOUT,CPUDIV1,VREGEN 
#device ADC=10
#use delay(clock=8000000)
#use rs232(baud=9600,xmit=PIN_B7,rcv=PIN_B6)

#define voice PIN_A1
#include <math.h>

int16 A=568;    //1
int16 Ad=536;   //2
int16 B=506;    //3
int16 C=955;    //4
int16 Cd=901;   //5
int16 D=851;    //6
int16 Dd=804;   //7
int16 E=758;    //8
int16 F=715;    //9
int16 Fd=675;   //10
int16 G=634;    //11
int16 Gd=602;   //12
int16 A4=1136;  //13
int16 Ad4=1072; //14
int16 B4=1012;  //15
int16 C4=1911;  //16
int16 Cd4=1803; //17
int16 D4=1702;  //18
int16 Dd4=1607; //19
int16 E4=1516;  //20
int16 F4=1431;  //21
int16 Fd4=1351; //22
int16 G4=1275;  //23
int16 Gd4=1203; //24

int8 dizi1[]= {15,14,13,24};    //fail melody 15,14,13,24
int16 bosluk1[]= {0,0,0,0};    //notalar arasındaki bekleme süresi
int16 notauzunluk1[]= {500,500,500,2000};   //notaların çalınma süresi
int8 dizi2[] = {24,21,3,12};    //başarı müziği
int16 bosluk2[]= {0,0,0,0};    //notalar arasındaki bekleme süresi
int16 notauzunluk2[]= {300,600,400,300};   //notaların çalınma süresi

int vurus=1;
int16 k;
int16 i;
int16 duration=0;
float nota=0;
float temp=0;

void pausesong();
void playnote(long);
void notacal(int8 dizi[],int16 bosluk[],int16 notauzunluk[]);

void main()
{
   SETUP_OSCILLATOR(OSC_8MHZ);
   while(TRUE)
   {
      notacal(dizi2,bosluk2,notauzunluk2);  //size of dizi2 is 4
   }
}

void pausesong()
{
   output_low(voice);
   delay_us(vurus);
}

void playnote(long note)   
{                         
   output_high(voice);
   delay_us(note);   
   output_low(voice);
   delay_us(note);
}


void notacal(int dizi[], int16 bosluk[], int16 notauzunluk[])
{
   for (k=0; k<=sizeof(dizi)-1; k++)
      {         
      printf("dizi = %d ",sizeof(dizi));  // i print the size of array and it is 2
      switch(dizi[k])
      {
         case 0:  pausesong(); break;
         case 1:  nota=A; break;
         case 2:  nota=Ad; break;
         case 3:  nota=B; break;
         case 4:  nota=C; break;
         case 5:  nota=Cd; break;
         case 6:  nota=D; break;
         case 7:  nota=Dd; break;
         case 8:  nota=E; break;
         case 9:  nota=F; break;
         case 10: nota=Fd; break;
         case 11: nota=G; break;
         case 12: nota=Gd; break;
         case 13: nota=A4; break;
         case 14: nota=Ad4; break;
         case 15: nota=B4; break;
         case 16: nota=C4; break;
         case 17: nota=Cd4; break;
         case 18: nota=D4; break;
         case 19: nota=Dd4; break;
         case 20: nota=E4; break;
         case 21: nota=F4; break;
         case 22: nota=Fd4; break;
         case 23: nota=G4; break;
         case 24: nota=Gd4; break;
      }
         temp=nota/1000;
         duration=notauzunluk[k]/(temp*2);                         
            for(i=0;i<(duration/2);i++)
            {
               playnote(nota);
            }                                           
         delay_ms(bosluk[k]);
      }
}

The size of dizi2 is 4 but after sending it to the notacal function it becomes 2.
I thought i am making a mistake at sending the array to function but it says here i am doing it right.
https://www.tutorialspoint.com/cprogramming/c_passing_arrays_to_functions.html
What am i missing?
Thank you so much.
Best wishes

Doguhan


Last edited by doguhanpala on Wed Mar 08, 2017 2:57 am; edited 1 time in total
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Wed Mar 08, 2017 2:44 am     Reply with quote

size....

An array passed to a function _does not have a size_. What is passed is a 'pointer', which no longer 'knows' the size of the array. Sizeof this pointer, returns the size of the pointer, _not_ the array. Note in the code you point to, how they pass the 'size' of the array to the function as well.
You need to do the same. So:

Code:

notacal(dizi2,sizeof(dizi2), bosluk2,notauzunluk2);  //size of dizi2 is 4

//then in the function:

void notacal(int dizi[],int16 size, int16 bosluk[],int16 notauzunluk[])
{
   for (k=0; k<=size-1; k++)
      {         
      printf("dizi = %d ",size);
doguhanpala



Joined: 05 Oct 2016
Posts: 120

View user's profile Send private message

PostPosted: Wed Mar 08, 2017 2:56 am     Reply with quote

Ttelmah wrote:
size....

An array passed to a function _does not have a size_. What is passed is a 'pointer', which no longer 'knows' the size of the array. Sizeof this pointer, returns the size of the pointer, _not_ the array. Note in the code you point to, how they pass the 'size' of the array to the function as well.
You need to do the same. So:

Code:

notacal(dizi2,sizeof(dizi2), bosluk2,notauzunluk2);  //size of dizi2 is 4

//then in the function:

void notacal(int dizi[],int16 size, int16 bosluk[],int16 notauzunluk[])
{
   for (k=0; k<=size-1; k++)
      {         
      printf("dizi = %d ",size);


Thank you so much Ttelmah!
Ttelmah



Joined: 11 Mar 2010
Posts: 19520

View user's profile Send private message

PostPosted: Wed Mar 08, 2017 3:05 am     Reply with quote

Thanks. Smile

It's a 'get your head round' difference in C. Many languages now have an 'array' as a type, and when an array is passed, what is passed, includes the 'size' information. C doesn't do this, so problems like yours appear....

Well done, on writing code to try to see 'what was happening'. Adding the print to see what size was reported etc..
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