Функция, которая возвращает строку из массива указателей - PullRequest
0 голосов
/ 05 июля 2018

Мне нужно объявить функцию, которая возвращает строку из массива указателей .. Я программирую PIC и использую в качестве интерфейса LCD ... С этим кодом у меня есть то, что я хочу:

// CONFIGURATION BITS
#pragma config FOSC = HS   // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF   // Low-Voltage In-Circuit Serial Programming Enable bit
#pragma config CPD = OFF   // Data EEPROM Memory Code Protection bit 
#pragma config WRT = OFF   // Flash Program Memory Write Enable bits 
#pragma config CP = OFF    // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 8000000

// DEFINING LCD PINS
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>

#include "lcd.h"

#include <stdio.h>
#include <stdlib.h>

void main()
{

    TRISD = 0x00;           //PORTD as output for LCD
    Lcd_Init();
    Lcd_Clear();

    while(1)
    {

        Lcd_Set_Cursor(1,1);

        char *keypress;
        int key = 2;
        char *key2[] = {"3", "4", "5"}; 
        keypress = key2[key];

        Lcd_Write_String(keypress);

        __delay_ms(50);

    }
}

enter image description here

Я получаю "5" .. Это то, что я хочу .. Но когда я пытаюсь сделать функцию для этого ..

// CONFIGURATION BITS
#pragma config FOSC = HS   // Oscillator Selection bits (XT oscillator)
#pragma config WDTE = OFF  // Watchdog Timer Enable bit (WDT disabled)
#pragma config PWRTE = OFF // Power-up Timer Enable bit (PWRT disabled)
#pragma config BOREN = OFF // Brown-out Reset Enable bit (BOR disabled)
#pragma config LVP = OFF   // Low-Voltage In-Circuit Serial Programming Enable bit
#pragma config CPD = OFF   // Data EEPROM Memory Code Protection bit 
#pragma config WRT = OFF   // Flash Program Memory Write Enable bits 
#pragma config CP = OFF    // Flash Program Memory Code Protection bit

#define _XTAL_FREQ 8000000

// DEFINING LCD PINS
#define RS RD2
#define EN RD3
#define D4 RD4
#define D5 RD5
#define D6 RD6
#define D7 RD7

#include <xc.h>

#include "lcd.h"

#include <stdio.h>
#include <stdlib.h>

char kbd_getc();

char kbd_getc(){

    int key = 2;
    char *key2[] = {"3", "4", "5"}; 
    return key2[key];

}

void main()
{

    TRISD = 0x00;           //PORTD as output for LCD
    Lcd_Init();
    Lcd_Clear();

    while(1)
    {

        Lcd_Set_Cursor(1,1);

        char *keypress;

        keypress = kbd_getc();

        Lcd_Write_String(keypress);

        __delay_ms(50);

    }
}

enter image description here

Я не понимаю, почему я получаю мм .. Я не уверен, неправильно ли я объявляю функцию или я делаю что-то не так с указателями, спасибо

Ответы [ 3 ]

0 голосов
/ 05 июля 2018

Просто попробуйте это,

char kbd_getc(){

int key = 2;
char *key2[] = {"3", "4", "5"}; 
char a = key2[key];
return a ;

}

Я думаю, что вы возвращаете массив.

Вам нужно вернуть чарса.

Спасибо

0 голосов
/ 05 июля 2018
    char *key2[] = {"3", "4", "5"}; 
    return key2[key];

Здесь key2 - это массив char указателей, а key2[key] - указатель на индекс key массива key2, который указывает на первый символ строки.
Теперь посмотрим на тип возвращаемого значения функции kbd_getc():

char kbd_getc(){
^^^^

Это char тип. Это означает, что вы возвращаете строку из функции, которая должна возвращать символ.
Если я пишу простую программу для проверки вашего kbd_getc(), я получаю следующее предупреждающее сообщение о выписке return key2[key]; -

warning: incompatible pointer to integer conversion returning 'char *' from a function with result type 'char';

Если я изменю тип возврата на char *

char * kbd_getc(){

предупреждение исчезает, и я получаю желаемый вывод:

$ ./a.out 
5
0 голосов
/ 05 июля 2018

Ваша функция возвращает char, но вы возвращаете char *.

Измените тип возврата на char *

И ваше предупреждение компилятора, чтобы поймать эти вещи.

...