【问题标题】:Referencing an array from a function从函数中引用数组
【发布时间】:2011-11-28 16:51:40
【问题描述】:

我编写了一个时钟代码,并创建了一个函数来显示存储在数组 time[] 中的时间

char time[]="23:59:45         ";
char display_time(char *t[], char *, char *, char *);

void main(void)             
{
            display_time(&time, &hr, &min, &sec);
            GLCD_GoTo(5,3);
            GLCD_WriteString(time, Font_System7x8);
}

这是我的功能

char display_time(char *t[], char *h, char *m, char *s)
{

                *t[0]=*h/10+48;
                *t[1]=*h%10+48;
                *t[3]=*m/10+48;
                *t[4]=*m%10+48;
                *t[6]=*s/10+48;
                *t[7]=*s%10+48;


}

一切编译正常,但我的时间没有得到更新,只显示初始化值。

【问题讨论】:

  • 如果你在课堂上学过void main(void),是时候换讲师了。
  • 将您的编译器警告级别提高到最大.. 并注意警告
  • 您永远不会显示应该实际更新时间的代码。我假设您在某个地方实际修改了 time[] 的值,您应该发布执行此操作的代码,这样我们实际上可以看到可能出了什么问题。
  • 那段代码中的操作顺序让我头晕。
  • 你可能打算这样调用你的函数:display_time(time, &hr, &min, &sec); - 没有和号准时。

标签: c arrays function


【解决方案1】:
  • 请在编译时出现警告 (gcc -Wall -Wextra)
  • display_time 应该返回 void
  • main 应该返回 int 并采用 (int, char*[])(),但不是 (void)
  • 您可以通过传递值(而不是指针)来提高易读性
  • 使用'0' 而不是 48,同样是为了便于理解
  • 您没有初始化 hr。代码中的 min 和 sec。
  • 您应该测试 h 是否在 0 到 24 之间等。
  • 你应该测试空指针
  • display_time 不“显示时间”,为函数写一个更好的名称,你就完成了:-)

.

void display_time(char t[], int h, int m, int s) {
    t[0] = h / 10 + '0';
    t[1] = h % 10 + '0';
    t[3] = m / 10 + '0';
    t[4] = m % 10 + '0';
    t[6] = s / 10 + '0';
    t[7] = s % 10 + '0';
}

int main(int, char*[]) {
    char time[] = "23:59:45";
    int hr = 3, min = 9, sec = 42;
    display_time(time, hr, min, sec);
    GLCD_GoTo(5,3);
    GLCD_WriteString(time, Font_System7x8);
    return 0;
}

【讨论】:

    【解决方案2】:

    你的类型是错误的。您不应该发送char *t[],因为您没有传递指针数组。另外,您可能没有意识到&timetime 相同,没有“时间地址”。您只想将 char* 传递给您的函数。

    【讨论】:

    • &timetime 一样是什么意思?
    • 这就是数组声明的工作方式。试试看,执行 printf("%x %x", &time, time);,它会打印两个相同的地址
    • 据我了解,它们不同,因为它们具有不同的类型。 timechar[9]&timechar*。您对printf 的调用中的事情是这是一个可变参数函数,并且您在那里有一个隐式转换为 int (因为%x 需要一个无符号的十六进制整数)。
    • @GiovanniFunchal,这不是影响已发布问题行为的功能差异。在引擎盖下,char[] 和 char* 是相同的。我的观点是做 *t[0] 是错误的,因为它应该只是 t[0]
    • No char[] 和 char* 不一样。 char[] 表示某处有一个数组并指示其地址,但char* 表示某处有一个数组加上指向该数组的指针并指示该指针。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 2013-03-05
    • 1970-01-01
    • 2018-11-14
    • 1970-01-01
    • 1970-01-01
    • 2014-06-04
    • 1970-01-01
    相关资源
    最近更新 更多