Showing posts with label C. Show all posts
Showing posts with label C. Show all posts

Monday, June 3, 2013

ANSI C (2)

12. recursion
#include <stdio.h>

void binary_to_ascii( unsigned int value)

{

   unsigned int quotient;

   quotient=value/10;

   if(quotient!=0)

      binary_to_ascii(quotient);//recursion

   putchar(value%10+'0');



}



value=4267  quotient=?

value=4267  quotient=426

value=426  quotient=42

value=42  quotient=4

value=4  quotient=0

value=42  quotient=4

value=426 quotient=42

value=4267  quotient=426


13.variable parameter

#include <stdarg.h>

float average(int n_values,...)

{

  va_list var_arg;

  int count;

 float sum=0;



 var_start(var_arg,n_values);

for(count=0; count<n_values;count+=1)

{

   sum+=va_arg(var_arg, int);

}

va_end(var_arg);

return sum/n_values;

}


14. array
//(1)

int array[10];

2[array]  ==  *(2+(array)) ==array[2];



//(2)

int array[10], a;

for(a=0;a<10;a=a+1)

     array[a]=0;



int array[10], *ap;

for(ap=array; ap<array+10;ap++)  // more efficient here than array

   *ap=0;

// when   accessing the array elements by a fixed increment,  using pointer would more efficient than that of array index;



//(3)

#include <stdio.h>

#include <stdlib.h>

void my_parameter1(char string[]);

void my_parameter2(char *string);

int main()

{

    char arr[]="zhiguang";

    char *arr1="zhiguang";

    printf("%d\n",sizeof(arr));//9--array: 'z'  'h' ... 'g','\0'

    printf("%d\n",strlen(arr));//8--array:  'z'  'h' ... 'g'

    printf("%d\n",sizeof(arr1));//4--pointer size

    printf("%d\n",strlen(arr1));//8-- the content length the pointer points to

    my_parameter1(arr);//4--pointer size, it is not 9, because it only pass the array as pointer in fact

    my_parameter1(arr1);//4--pointer size

    my_parameter2(arr);//4--pointer size

    my_parameter2(arr1);//4--pointer size

    return 0;

}

void my_parameter1(char string[])

{

   printf("%d\n",sizeof(string));

}

void my_parameter2(char *string)

{

   printf("%d\n",sizeof(string));

}



//(4)

    char arr[]="zhiguang";

    char *arr1="zhiguang";//constant

    arr[2]='w';// ok

    arr1[2]='w';//error, because it is constant

    *(arr1+2)='w';//error, because it is constant



//(5)

int matrix[3][10];

matrix;//pointer, points to the first whole row, 10 elements

matrix+1;//pointer, points to the second whole row, 10 elements

*(matrix+1);// it is an array, also the points to the first element in second row;

*(matrix+1)+5;//pointer, points to matrix[1][5]

*(*(matrix+1)+5);//value, content of matrix[1][5]

*(matrix[1]+5);//value, content of matrix[1][5]

matrix[4,3]==matrix[3];//because of ','



//(6)

int vector[10], *vp=vector;//ok

int matrix[3][10], *mp=matrix;//error;

int (*p)[10]=matrix;//ok, p is a pointer first, points to an array with 10 elements;

int *pi=&matrix[0][0];//ok

int *pi=matrix[0];//ok



//(7)

// if the parameter mat is 2-D array, you can declare the function as:

void fun(int (*mat)[10]);//ok

void fun(mat[][10]);//ok

//however, the following is wrong

void func2(int **mat);//error



//(8)

char  *keyword[5];// an array, each element is a pointer;

char const *keyword[]={"do","for","while"};

// the best way to determine the length of this array is:

sizeof(keyword)/sizeof(keyword[0]);



//(9)
void function0(int);
void function1(int);
void function2(int);
int main(void)
{
   void (*f[3])(int) = {function0,function1,function2};
//f is first an array, each element is a pointer, pointing to a func with an int parameter
   return 0;
}


15. string
//strlen returns an unsigned in, so

if(strlen(x)>strlen(y)) //always right

if(strlen(x)-strlen(y)>=0) //sometimes, error

if(strlen(x)>=10)//always right

if(strlen(x)-10>=0) //sometimes, error


16. void *
//any type pointer could be converted to void*, and that is why

void  *memcpy(void *dst, void const *src, size_t length);

void  *memmove(void *dst, void const *src, size_t length);

void  *memcmp(void *a, void const *b, size_t length);

//...


17. structure
//(1)

struct{

   int a;

   int b;

}x;



struct SIMPLE{

   int a;

   int b;

};

struct SIMPLE x;



typedef struct {

   int a;

   int b;

} Simple;

Simple x;



//(2)

typedef struct{

    int a;

    struct SELF_REF3 *b;//error, there is no SELF_REF3 yet;

    int c;

} SELF_REF3; 



typedef struct SELF_REF3_TAG{

    int a;

    struct SELF_REF3_TAG *b;//OK, there is SELF_REF3_TAG already;

    int c;

} SELF_REF3_TAG; 



//(3)

// the following is error

struct A{

struct B *partner;

};

struct B{

struct A *partner;

}

//the following is correct

struct B;// declare first, even if it is not complete

struct A{

struct B *partner;

};

struct B{

struct A *partner;


18. memory
//(1)

void *malloc(size_t size);

void free(void *pointer);

// if malloc failed, it would return an NULL



//(2)

int *pi;

pi=malloc(25*sizeof(int));

if(pi==NULL)

{

   printf("out of memory!\n");

   exit(1);

}



//(3)

// the pointer passed to free must be generated by malloc, calloc, or realloc, not others;



//(4)

// simplest way of memory leak

for(int i=0; i<10;i++)

    int *p=malloc(25*sizeof(int));

Sunday, June 2, 2013

ANSI C (1)

1. logically delete the command
# if 0

   statements

#endif

2. exit
exit(EXIT_SUCCESS);// stdlib.h

exit(EXIT_FAILURE);// stdlib.h

3.array variable as parameter
array variable, as function parameter, will pass the reference to the function, other kinds of variables will pass the values to the function
4.NUL  NULL
NUL=='\0' ;// the ASCII character 

NULL==0; // the pointer

5. read
#define MAX_INPUT 1000

char input[MAX_INPUT];

int ch;

while(gets(input)!=NULL)//read the line

{

}

while((ch=getchar())!=EOF&&ch!='\n')//read the character 

{

}

6. standard structure
#include <stdlib.h>

int main(void)

{

   return 0;

}

7.typedef  define
typedef char   *ptr_to_char;

define  p_ptr_to_char char*;

8 const pointer
int const *pci ; // you can modify pci, but not *pci

int *const pci;  // you can modify *pci, but not pci;

9 switch
switch(command)

{

  case 'A':

      add_entry();

      break;

  case 'B':

      delete_entry();

     // break;

  case 'C':

      edit_entry();

      break;

}

if command=='B', then delete_entry()  and  edit_entry() would be implemented, because there is no 'break' for case'B'. So pay attention to all the 'break'.
10 sizeof
it is an operator, not function
sizeof(int); // return the length by bytes

sizeof x;

11. pointer to string
//  string length

#include <stdlib.h>

size_t strlen(char *string)

{

   int length=0;

   while(*string++ !='\0')

          length+=1;

   return length;

}


// find the char in strings

#include <stdio.h>

#include<assert.h>

#define TRUE 1

#define FALSE 0

int find_char(char **strings, char value)

{

   assert(strings!=NULL)



   while(*strings !=NULL)

  {

       while(**strings!='\0') 

       {

            if(*(*strings)++==value)

                return TRUE;

       }

       strings++;

  }

   return FALSE;

}



Sunday, March 3, 2013

one 'interface' between C and matlab

One friend ask me how to realize the mixed coding using matlab and C, because, for one of his proj, he want to finish some task using C and after that he want to call matlab to do another task (related to matrix processing)as soon as possible, while the C code and matlab code should run all the time.

I do know there are many posts on how to implement the interface between C and matlab, it should configure something on matlab with many steps, sometimes it also depends on the version of matlab.
this way is feasible, but i do not like  the configuration job, so i have anothe idea

Considering his requirement is not so demanding, general situation is that:
repeat: task 1 on C--->task 2 on matlab
          task 1 on C-->task 2 on matlab...

so I come up with an solution: send a signal to matlab as long as task1 on C is finished.

For, C\C++, java, matlab, python, PHP ,C#,it is very easy to create one txt file  no matter whether this txt file already exists or not.

So, we can create one txt file with the same filename as long as the task on C is done, and we can also choose the way of generating this file, we just ovewrite this file instead create a new one if txt file already exist.

then, we can judge this file is a new one or old one through its date attribute which would lead to the task 2, on matlab, we can write this:

   time_old='0';
   time_new='0';
   while(1)
      filename=dir(['D:\Matlab_Code\','*.txt']); % 
       num_bmp=length(filename);%     
       if num_bmp==1% we suppose there are at most one 1 txt file at one time     
         time_new=filename.date;
            if ~strcmp(time_new,time_old)
             % add task 2 code here
               time_old=time_new;% do not forget this command;
            end
      end

   end
For simple task, I think this way could work well. For evry demanding task, you 'd better try to use only C, in fact, there are already many libraries developed using C for matrix processing, you can just download, configure and call them.