main()放在第一位 C
main() on the first place C
所以我写了这段代码,我想问一下是否可以先写main然后再写其他东西?
#include <stdio.h> // Standard Ein-/Ausgabefunktionen
#include <at89c51cc03.h> // CC03er-Grundregister
#define CS_LCD 0xffb8
xdata unsigned char eak_io @0xff80;
xdata unsigned char DIS_IR_W @CS_LCD+0x0;
xdata unsigned char DIS_DR_W @CS_LCD+0x1;
xdata unsigned char DIS_IR_R @CS_LCD+0x2;
xdata unsigned char DIS_DR_D @CS_LCD+0x3;
void init_schnittstelle(void)
{
SCON=0x52; // Initialisierung
TMOD |=0x20; // Timermodus 8-bit auto-reload
TH1=0xfa; // 4800 Baud
TR1=1;
}
void ms_warten(unsigned int multiplikator)
{
unsigned int i,j;
for(i=0;i<multiplikator;i++)
{
for(j=0;j<123;j++);
}
}
void dis_ready(void)
{
while ((DIS_IR_R & 0x80)!=0);
}
void init_lcd(void)
{
unsigned char i;
for (i=0; i<=2; i++)
{
DIS_IR_W=0x30;
ms_warten(10);
}
// Function Set: DL=1, N=1, F=0
dis_ready();
DIS_IR_W=0x38;
// Display ON/OFF: D=1, C=1, B=0
dis_ready();
DIS_IR_W=0x0c;
// Entry Mode Set: I/D=1, S=0
dis_ready();
DIS_IR_W=0x06;
}
void dis_clear(void)
{
dis_ready();
DIS_IR_W=0x01;
}
void dis_csr_set(unsigned char z, unsigned char s)
{
unsigned char csr_pos;
switch (z)
{
case 0 : csr_pos=s;
break;
case 1 : csr_pos=s+0x40;
break;
case 2 : csr_pos=s+0x14;
break;
case 3 : csr_pos=s+0x54;
break; }
dis_ready();
DIS_IR_W=(csr_pos | 0x80);
}
void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a)
{
unsigned char i;
if (csr==1) dis_csr_set(z,s);
i=0;
while(a[i]!=0)
{
dis_ready();
DIS_DR_W=a[i];
i++;
}
}
void main(void)
{
char aktuellerWert;
init_schnittstelle();
init_lcd();
while(1)
{
RI = 0;
while(!RI);
if(SBUF != aktuellerWert)
{
aktuellerWert = SBUF;
switch(aktuellerWert)
{
case 'O': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
dis_text(1, 3, 3, "blabla");
break;
case 'G': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
break;
case 'R': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
break;
}
}
}
}
所以我想把main方法写在#define之前,o或多或少放在第一个位置。
谢谢!
有一种叫做函数声明的东西。与函数定义相反
int foo(int x)
{
return x + 42;
}
告诉编译器函数做什么,函数声明告诉编译器如何调用函数。这将是 foo
:
的有效函数声明
int foo(int x);
注意缺少大括号和尾随分号。声明一个函数足以让编译器知道如何调用它。所以如果预先声明了main()
调用的所有函数,可以先定义main函数。这是一个可能看起来像的示例:
void init_schnittstelle(void);
void ms_warten(unsigned int multiplikator);
void dis_ready(void);
void init_lcd(void);
void dis_clear(void);
void dis_csr_set(unsigned char z, unsigned char s);
void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a);
void main(void)
{
/* Code hier */
}
程序中事物的习惯顺序是这样的:
- 功能测试宏
#include
指令
#define
指令
- 类型和枚举声明
- 函数声明
- 变量定义
- 函数定义
请注意,在定义 main()
之前有一堆东西,但您仍然可以使 main()
成为定义的第一个函数。
在调用函数之前,编译器必须了解您在代码中使用的函数的一些信息。不需要函数的实际implementation/definition,只需要调用前的声明(函数原型)。这可以通过两种方式完成:
- 在头文件中。如果您想在多个 C 文件中使用您的函数,请使用此方法。
- C 源文件中的任意位置(最好在开头)。这些函数仅限于文件范围,即它们只能在声明它们的 C 源代码中使用。
函数原型如下所示:
return_type function_name(type_t param1, type_t param2);
例如:
int sum(int a, int b);
会声明函数 sum,告诉编译器
- 某处存在名为 sum 的函数
- 函数接受两个整数作为参数
- 函数returns一个整数。
此时,编译器并不知道该函数是如何实现的。然而,由于编译器知道它的存在以及它的样子,它会很好地编译你的代码。
这是一个使用您的代码的简短示例:
#include <stdio.h> // Standard Ein-/Ausgabefunktionen
#include <at89c51cc03.h> // CC03er-Grundregister
// Function prototypes for functions used in main() are here, now the compiler
// is aware of them
void init_schnittstelle(void); // Note the semicolon
void init_lcd(void);
// I didn't include the prototype for the function ms_warten(), since the main()
// Doesn't use it directly. Declatring it beforehand wouldn't hurt, though.
int main()
{
// Your code here
}
#define CS_LCD 0xffb8 // This isn't used by main() either, so the compiler
// doesn't needto know about it before the
// main() fucntion.
xdata unsigned char eak_io @0xff80;
xdata unsigned char DIS_IR_W @CS_LCD+0x0;
xdata unsigned char DIS_DR_W @CS_LCD+0x1;
void init_schnittstelle(void)
{
// Your code here
}
void ms_warten(unsigned int multiplikator)
{
// Your code here
}
所以我写了这段代码,我想问一下是否可以先写main然后再写其他东西?
#include <stdio.h> // Standard Ein-/Ausgabefunktionen
#include <at89c51cc03.h> // CC03er-Grundregister
#define CS_LCD 0xffb8
xdata unsigned char eak_io @0xff80;
xdata unsigned char DIS_IR_W @CS_LCD+0x0;
xdata unsigned char DIS_DR_W @CS_LCD+0x1;
xdata unsigned char DIS_IR_R @CS_LCD+0x2;
xdata unsigned char DIS_DR_D @CS_LCD+0x3;
void init_schnittstelle(void)
{
SCON=0x52; // Initialisierung
TMOD |=0x20; // Timermodus 8-bit auto-reload
TH1=0xfa; // 4800 Baud
TR1=1;
}
void ms_warten(unsigned int multiplikator)
{
unsigned int i,j;
for(i=0;i<multiplikator;i++)
{
for(j=0;j<123;j++);
}
}
void dis_ready(void)
{
while ((DIS_IR_R & 0x80)!=0);
}
void init_lcd(void)
{
unsigned char i;
for (i=0; i<=2; i++)
{
DIS_IR_W=0x30;
ms_warten(10);
}
// Function Set: DL=1, N=1, F=0
dis_ready();
DIS_IR_W=0x38;
// Display ON/OFF: D=1, C=1, B=0
dis_ready();
DIS_IR_W=0x0c;
// Entry Mode Set: I/D=1, S=0
dis_ready();
DIS_IR_W=0x06;
}
void dis_clear(void)
{
dis_ready();
DIS_IR_W=0x01;
}
void dis_csr_set(unsigned char z, unsigned char s)
{
unsigned char csr_pos;
switch (z)
{
case 0 : csr_pos=s;
break;
case 1 : csr_pos=s+0x40;
break;
case 2 : csr_pos=s+0x14;
break;
case 3 : csr_pos=s+0x54;
break; }
dis_ready();
DIS_IR_W=(csr_pos | 0x80);
}
void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a)
{
unsigned char i;
if (csr==1) dis_csr_set(z,s);
i=0;
while(a[i]!=0)
{
dis_ready();
DIS_DR_W=a[i];
i++;
}
}
void main(void)
{
char aktuellerWert;
init_schnittstelle();
init_lcd();
while(1)
{
RI = 0;
while(!RI);
if(SBUF != aktuellerWert)
{
aktuellerWert = SBUF;
switch(aktuellerWert)
{
case 'O': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
dis_text(1, 3, 3, "blabla");
break;
case 'G': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
break;
case 'R': dis_clear();
dis_text(1, 1, 2, "blabla");
dis_text(1, 2, 1, "blabla");
break;
}
}
}
}
所以我想把main方法写在#define之前,o或多或少放在第一个位置。
谢谢!
有一种叫做函数声明的东西。与函数定义相反
int foo(int x)
{
return x + 42;
}
告诉编译器函数做什么,函数声明告诉编译器如何调用函数。这将是 foo
:
int foo(int x);
注意缺少大括号和尾随分号。声明一个函数足以让编译器知道如何调用它。所以如果预先声明了main()
调用的所有函数,可以先定义main函数。这是一个可能看起来像的示例:
void init_schnittstelle(void);
void ms_warten(unsigned int multiplikator);
void dis_ready(void);
void init_lcd(void);
void dis_clear(void);
void dis_csr_set(unsigned char z, unsigned char s);
void dis_text(unsigned char csr, unsigned char z, unsigned char s, char *a);
void main(void)
{
/* Code hier */
}
程序中事物的习惯顺序是这样的:
- 功能测试宏
#include
指令#define
指令- 类型和枚举声明
- 函数声明
- 变量定义
- 函数定义
请注意,在定义 main()
之前有一堆东西,但您仍然可以使 main()
成为定义的第一个函数。
在调用函数之前,编译器必须了解您在代码中使用的函数的一些信息。不需要函数的实际implementation/definition,只需要调用前的声明(函数原型)。这可以通过两种方式完成:
- 在头文件中。如果您想在多个 C 文件中使用您的函数,请使用此方法。
- C 源文件中的任意位置(最好在开头)。这些函数仅限于文件范围,即它们只能在声明它们的 C 源代码中使用。
函数原型如下所示:
return_type function_name(type_t param1, type_t param2);
例如:
int sum(int a, int b);
会声明函数 sum,告诉编译器
- 某处存在名为 sum 的函数
- 函数接受两个整数作为参数
- 函数returns一个整数。
此时,编译器并不知道该函数是如何实现的。然而,由于编译器知道它的存在以及它的样子,它会很好地编译你的代码。
这是一个使用您的代码的简短示例:
#include <stdio.h> // Standard Ein-/Ausgabefunktionen
#include <at89c51cc03.h> // CC03er-Grundregister
// Function prototypes for functions used in main() are here, now the compiler
// is aware of them
void init_schnittstelle(void); // Note the semicolon
void init_lcd(void);
// I didn't include the prototype for the function ms_warten(), since the main()
// Doesn't use it directly. Declatring it beforehand wouldn't hurt, though.
int main()
{
// Your code here
}
#define CS_LCD 0xffb8 // This isn't used by main() either, so the compiler
// doesn't needto know about it before the
// main() fucntion.
xdata unsigned char eak_io @0xff80;
xdata unsigned char DIS_IR_W @CS_LCD+0x0;
xdata unsigned char DIS_DR_W @CS_LCD+0x1;
void init_schnittstelle(void)
{
// Your code here
}
void ms_warten(unsigned int multiplikator)
{
// Your code here
}