【问题标题】:Function that returns a string from an array of pointers从指针数组返回字符串的函数
【发布时间】:2018-07-05 05:19:32
【问题描述】:

我需要声明一个从指针数组返回字符串的函数。我正在编写 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);

    }
}

我得到“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);

    }
}

我不明白为什么我会得到 mm .. 我不确定我是否错误地声明了函数或者我的指针有问题,谢谢

【问题讨论】:

  • 这里问题的根源在于臭名昭著的 PIC 编译器“MPLAB”,或者现在所谓的废话,很糟糕。一个正常工作的 C 编译器会指出 return key2[key]; 的语言违规,这是由于意外使用 char kbd_getc() 而不是预期的:char* kbd_getc()
  • 附带说明,指向字符串文字的指针应声明为const char*。它们将存储在闪存中。
  • 另外说明,void main() 不符合标准。 main() 应该返回一个 int

标签: c arrays string function pointers


【解决方案1】:

您的函数返回char,但您返回char *

将返回类型改为char *

然后你的编译器警告来捕捉这些东西。

【讨论】:

  • 我对您的应用程序的细节了解不够,我只是告诉您您的 C 有什么问题。您(我希望)需要将返回更改为 char *。你做了什么?
  • 我将:char kbd_getc(){ 更改为:char * kbd_getc(){ 现在可以了,谢谢
  • 没有必要“向上”编译器警告,代码包含违反约束并且符合要求的编译器必须给出诊断消息。所以解决办法是改成标准的C编译器。
【解决方案2】:
    char *key2[] = {"3", "4", "5"}; 
    return key2[key];

这里,key2 是一个由 char 指针组成的数组,key2[key] 是数组 key2 的索引 key 处的指针,它指向字符串的第一个字符。
现在,看看函数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

【讨论】:

    【解决方案3】:

    试试这个,

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

    我认为你正在返回数组。

    您需要返回一个字符。

    谢谢

    【讨论】:

    • 同样的问题,同样的错误。您的代码从 char 函数返回 char *。我认为函数应该返回char *
    • 是的,我认为按下的键是 char.. 请将其更改为 char* ,如果然后将方法名称更改为 char *
    猜你喜欢
    • 2013-09-27
    • 2015-01-02
    • 2021-03-16
    • 2018-01-10
    • 2011-07-19
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2012-11-12
    相关资源
    最近更新 更多