2024年8月20日 星期二

二維陣列指標的表示方法

 




雙重指標

 #include <stdio.h>

#include <stdlib.h>


unsigned int x = 10;

unsigned int *ptr = &x;

unsigned int **pptr = &ptr;


const char *p[4] = {"PIC16", "PIC18", "PIC24", "DSPIC"};

const char **pp = &p[0]; // const char **pp = p;

void string_access(const char **str_ptr)

{

    unsigned char i = 0;

    unsigned char ch;


    do

    {

        ch = *(*str_ptr+i);

        printf("%c",ch);

        i++;

    }

    while(ch != '\0');

    printf("\n");

}


int main(void)

{

    printf("x value = %d\n", x);

    printf("x address = %p\n", &x);

    printf("ptr address = %p\n", &ptr);

    printf("ptr point to = %p\n", ptr);

    printf("ptr point value = %d\n", *ptr);

    printf("pptr address = %p\n", &pptr);

    printf("pptr point to %p\n", pptr);

    printf("*pptr point to %p\n", *pptr);

    printf("pptr point value = %d\n", **pptr);

    printf("---------------------------\n");

    string_access(&*pp);

    pp++;

    string_access(&*pp);

    pp++;

    string_access(&*pp);

    pp++;

    string_access(&*pp);


    system("pause");

    return 0;

}





2024年8月19日 星期一

使用C語言存取二維陣列,並計算陣列ROW與COLUMN的數量

 #include <stdio.h>

#include <stdlib.h>


int array[4][5] = {

    {'p', 'i', 'c', '1', '6'},

    {'p', 'i', 'c', '1', '8'},

    {'p', 'i', 'c', '2', '4'},

    {'d', 's', 'p', 'i', 'c'}

};


int len;

int rows, column;

int *begin = array;    // get the begin address of array

int *end = *(&array + 1);  // get the address after array last address

int x, y;

int main(void)

{

    len = end - begin;                  // calculate total len

    rows = *(&array+1)-array;           // get the total values of row

    column = *(&array[0]+1) - array[0]; // get the total values of column

    printf("begin = %p\n", begin);

    printf("end = %p\n", end);

    printf("len = %d\n", len);

    printf("rows = %d\n", rows);

    printf("column = %d\n", column);


    for(y = 0; y < rows; y++)

    {

        for(x = 0; x < column; x++)

        {

            printf("array[%d][%d] = %c\n", y, x, array[y][x]);

        }

        printf("\n");

    }


    system("pause");

    return 0;

}






2024年8月17日 星期六

C語言存取二維字元陣列的方法

 #include <stdio.h>

#include <stdlib.h>


#define ROW 4

#define LEN 5

char array[ROW][LEN] = {

    {'P', 'I', 'C', '1', '6'},

    {'P', 'I', 'C', '1', '8'},

    {'P', 'I', 'C', '2', '4'},

    {'D', 'S', 'P', 'I', 'C'}

};

char *ptr = &array;

unsigned char row, column;

int main(void)

{

    printf("access using array method\n");

    for(row = 0; row < 4; row++)

    {

        for(column = 0; column < 5; column++)

        {

            printf("%c", array[row][column]);

        }

        printf("\n");

    }

    printf("----------------------------------\n");

    printf("access using array method\n");

    for(row = 0; row < ROW; row++)

    {

        for(column = 0; column < LEN; column++)

        {

            printf("%c", *ptr++);

        }

        printf("\n");

    }

    printf("access using array + pointer method\n");

    for(row = 0; row < 4; row++)

    {

        for(column = 0; column < 5; column++)

        {

            printf("%c", *(array[row] + column));

        }

        printf("\n");

    }

    printf("----------------------------------\n");

    printf("access using pointer method\n");

    for(row = 0; row < 4; row++)

    {

        for(column = 0; column < 5; column++)

        {

            printf("%c", *(*(array+row)+column));

        }

        printf("\n");

    }

    printf("----------------------------------\n");

    printf("access using ptr point to array method\n");

    for(row = 0; row < 4; row++)

    {

        for(column = 0; column < 5; column++)

        {

            printf("%c", *(ptr + (row * 5) + column));

        }

        printf("\n");

    }




    while(1)

    {


    }

    system("pause");

    return 0;

}












C語言存取二維字串陣列(使用陣列或指標)

 #include <stdio.h>

#include <stdlib.h>


char str[4][6] = {

    {"PIC16"},

    {"PIC18"},

    {"PIC24"},

    {"DSPIC"}

};


unsigned char row, column;


int main(void)

{

    printf("access string using array method\n");

    for(row = 0; row < 4; row++)

    {

        column = 0;

        while(str[row][column] != 0x00)

        {

            printf("%c",str[row][column]);

            column++;

        }

        printf("\n");

    }

    printf("----------------------------------\n");

    printf("access string using array + pointer method\n");

    for(row = 0; row < 4; row++)

    {

        column = 0;

        while((*(str[row]+column)) != 0x00)

        {

            printf("%c", *(str[row]+column));

            column++;

        }

        printf("\n");

    }



    while(1)

    {


    }

    system("pause");

    return 0;

}














C語言存取字串指標陣列

 #include <stdio.h>

#include <stdlib.h>


char *str[4] = {"PIC16", "PIC18", "PIC24", "DSPIC"};


unsigned char row = 0, column = 0;


#define NULL 0x00


int main(void)

{

    printf("access string using pointer method\n");

    for(row = 0; row < 4; row++)

    {

        column = 0;

        while(*(*(str+row) + column) != NULL)

        {

            printf("%c", *(*(str+row) + column));

            column++;

        }

        printf("\n");

    }

    printf("----------------------------------------\n");


    printf("access string using array+pointer method\n");

    for(row = 0; row < 4; row++)

    {

        column = 0;

        while(*(str[row]+column) != NULL)

        {

            printf("%c",*(str[row]+column));

            column++;

        }

        printf("\n");

    }


    while(1)

    {


    }

    system("pause");

    return 0;

}



2023年11月30日 星期四

STM32於IAR 9.3以後的版本將uart導向至printf

首先,請先參考如以下IAR提供的"在IAR Embedded Workbench中实现打印输出技術資料"

https://www.iar.com/cn/knowledge/support/technical-notes/general/implementing-printf-output/

本文要說明的是重新定向到MCU的周邊(UART)



STM32在IAR9.2以前的版本printf時,在main.c的主程式之前通常會加入如以下的程式

#ifdef __GNUC__

/* With GCC, small printf (option LD Linker->Libraries->Small printf

   set to 'Yes') calls __io_putchar() */

#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)

#else

#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)

#endif /* __GNUC__ */


並執行以下宣告如於主程式之後

/**

  * @brief  Retargets the C library printf function to the USART.

  * @param  None

  * @retval None

  */

PUTCHAR_PROTOTYPE

{

  /* Place your implementation of fputc here */

  /* e.g. write a character to the USART2 and Loop until the end of transmission */

  HAL_UART_Transmit(&UartHandle, (uint8_t *)&ch, 1, 0xFFFF);

  return ch;

}

但是在IAR9.32以後,已經不支援此方式了,因此在這邊大致上來記錄一下我查到的資訊與方法跟同樣遇到問題的人分享,

1.先到IAR安裝後的資料夾找出write.c,下圖是write.c原始的內容


2.COPY write.c到自行設定的專案資料夾內

3.在您的IAR專案內加入write.c

4.修改write.c以下內容,把main.h這個head file include進來,然後把您的UART底層驅動的函式放在MyLowLevelPutChar內,大致上就可以了,記住您的main.h裡面必須include stdio.h進來,才會有printf相關的函式,由於我用的底層選擇為STM32K的LL,您也可以換成STM32 HAL或是Standard Peripheral Libraries的底層函式








二維陣列指標的表示方法