Hallo, ich schreibe oft wiederverwendbare Programmmodule und verwende selbstverständlich Header-Files für die Definitionen dafür. Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben. Kennt jemand ein Tool das aus dem .c-File mir die Funktions-Deklarationen automatisch auslesen und das .h-File erstellen kann? Gruß
> Allerdings ist es sehr mühsehlig die .h immer selbst zu schreiben.
So?
Hmm, in einem ordentlichen Softwaredesign wäre das Headerfile
eigentlich zuerst da, da es das Interface eines Moduls nach außen
beschreibt. Erst wenn das feststeht, sollte man mit der
Implementierung beginnen. Alle Hilfsfunktionen, die ,,auf dem Weg''
entstehen, werden dann von vornherein gleich "static" deklariert,
damit sind sie nur modulintern sichtbar und müssen folglich auch nicht
ins Headerfile.
Ansonsten ist die von dir gewünschte Aufgabe so einfach nicht, da man
(zumindest wenn man es komplett formatfrei erledigen können möchte) ja
praktisch einen Teil des C-Parsers dafür implementieren muss.
GCC hat ein Feature, mit dem er beim Compilieren alle
Funktionsprototypen in eine separate Datei ablegen kann, die man ihm
mit -aux-info <dateiname> angibt. Das müsste dir dafür weiter helfen.
Ich mache das anders: jede neu Funktion die ich editire stelle ich allen anderen zuvorerstellten voran. Unnmittelbar nach Erstellen der Funktionsdefinition kopiere ich diese, füge sie oberhalb einer Trennzeile als letzte ein und ändere sie in eine Funktionsdecleration um. So erhalte ich ohne großen auf Aufwand eine Liste der im Programm definerten Funktionen und stelle sicher das alle Funktionen vor ihrem Erstenaufruf deklariert sind. Gelegentlich verwende ich selbige Declerationsliste wenn ich ein Modul für eine lib schreibe gleichzeitig zum erstellen des Haederfiles.
z.B.so [c] /*---------------------------------------------------------------------- ---------------------------- Name : LCD8bit.lib Description : Libery file for 8Bit LCD driver. für Atmel 128 µC's Author : Winfried Jaeckel (deviltronic) and this : Daten und Steuerport_Bits können relativ freigewählt, müssen dann aber in den "General purpose constants" angepaßt werden. ------------------------------------------------------------------------ --------------------------*/ #ifndef LCD8bit #define LCD8bit #include <delay.h> /*---------------------------------------------------------------------- ---------------------------- General purpose constants ------------------------------------------------------------------------ --------------------------*/ #ifndef NULL #define NULL 0 #endif #define FALSE 0 #define TRUE 1 #define LCD_X_RES 16 #define LCD_Y_RES 2 // Datenport #define LCD_Dataport PORTA // PortA #define LCD_Dataport_RR DDRA // Steuerport #define LCD_Steuerport PORTC // PORTC #define LCD_Steuerport_RR DDRC #define LCD_ON_PIN 0x01 // PC0 #define LCD_RS_PIN 0x02 // PC1 #define LCD_RW_PIN 0x04 // PC2 #define LCD_E_PIN 0x08 // PC3 // LCDPWM PORT #define LCD_PWM_PORT PortB // Portb #define LCD_PWM_PORT_RR PortB // Portb /*---------------------------------------------------------------------- ---------------------------- Public function prototypes ------------------------------------------------------------------------ --------------------------*/ /* static void LCD_Delay (void); static void LCD_SDelay (void); void LCD_Open (void); void LCD_Close (void); void LCD_Strobe (void); void LCD_Command (void); void LCD_Data (void); void LCD_Clear (void); void LCD_Home (void); void LCD_Uhr_Home (void); void LCD_S_L_Home (void); void LCD_2_L_Home (void); void LCD_3_L_Home (void); void LCD_4_L_Home (void); void LCD_Mode (void); void LCD_D_C_Control (void); void LCD_D_C_Shift (void); void LCD_Funktion_Set (void); void LCD_Set_CDRAM_ADDR (unsigned char CDADDR); void LCD_Set_DDRAM_ADDR (unsigned char DDADDR); void LCD_Read_BUSYFlag_ADC (void); // inaktiv void LCD_Write_Data_to_RAM (unsigned char DB); void LCD_ReadD_Data_from_RAM (void);// inaktiv void LCD_Init (void); void LCD_Write_Str (char []); void LCD_Write_Strf (flash char str [] ); void LCD_Write_Stre (eeprom char str [] ); void LCD_Cursor_On (void); void LCD_Cursor_Off (void); void LCD_Cursor_Blink (void); Characters 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 First line (H) 00 01 02 03 04 05 06 07 08 09 0A 0B 0C 0D 0E 0F 80-8F Second line (H) 40 41 42 43 44 45 46 47 48 49 4A 4B 4C 4D 4E 4F C0-FF Third line (H) 10 11 12 13 14 15 16 17 18 19 1A 1B 1C 1D 1E 1F 90-9F Fourth line (H) 50 51 52 53 54 55 56 57 58 59 5A 5B 5C 5D 5E 5F D0-DF */ //------------------------------------------------- static void LCD_Delay ( void ) { delay_ms(30); } //------------------------------------------------- static void LCD_SDelay ( void ) { delay_ms(1); } //------------------------------------------------- //------------------------------------------------------ void LCD_Open(void) { //LCD_Steuerport = 0xFA; //steuerbits high //LCD_Steuerport_RR = 0x0F; //steurport ein //LCD_Dataport = 0x00; // Port Löschen //LCD_Dataport_RR = 0xFF; // Dataport zur Ausgabe freigeben } //------------------------------------------------------ void LCD_Close(void) { //LCD_Dataport_RR = 0xFF; // Dataport zur Ausgabe freigeben //LCD_Dataport = 0x00; // Port Löschen //LCD_Steuerport = 0xFA; //steuerbits high //LCD_Steuerport_RR = 0x0F; //steurport ein } //---------------------------------------- void LCD_on (void) { LCD_Steuerport =0xFE // &= ~LCD_ON_PIN ; delay_ms(1000); LCD_Steuerport =0xFA; // &= ~LCD_RS } //---------------------------------------- void LCD_off (void) { LCD_Steuerport =0xFF //|= LCD_ON_PIN ; delay_ms(1000); } //---------------------------------------- void LCD_Strobe(void) { LCD_Steuerport &= ~LCD_E_PIN; LCD_SDelay(); LCD_Steuerport |= LCD_E_PIN; LCD_SDelay(); } //---------------------------------------- void LCD_Command(void) { LCD_Steuerport &= ~LCD_RS_PIN; LCD_SDelay(); } //---------------------------------------- void LCD_Data(void) { LCD_Steuerport |= LCD_RS_PIN; LCD_SDelay(); } //------------------------------------------------- void LCD_Clear ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x01; LCD_Strobe(); LCD_Data(); LCD_Close(); } //------------------------------------------------- void LCD_Home ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x02; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //------------------------------------------------- void LCD_Mode ( void ) { LCD_Delay(); LCD_Delay(); LCD_Delay(); LCD_Open(); LCD_Command(); LCD_Dataport = 0x06; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); LCD_Delay(); LCD_Delay(); } //------------------------------------------------- void LCD_D_C_Control ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x0C; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //------------------------------------------------- void LCD_Cursor_On ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x0E; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //-------------------------------------------------- void LCD_Cursor_Off ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x0C; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //-------------------------------------------------- void LCD_Cursor_Blink ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x0F; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //-------------------------------------------------- void LCD_D_C_Shift ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x14; LCD_Strobe(); LCD_Data(); LCD_Close(); } //------------------------------------------------- void LCD_Funktion_Set ( void ) { LCD_Open(); LCD_Command(); LCD_Dataport = 0x38; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_Delay(); } //------------------------------------------------- void LCD_Write_Data_to_RAM (unsigned char DB ) { LCD_Open(); LCD_Data(); LCD_Dataport = DB; LCD_Strobe(); LCD_Data(); LCD_Close(); } //------------------------------------------------- void LCD_Init (void) { LCD_Delay(); LCD_Funktion_Set(); LCD_D_C_Control(); LCD_Mode(); LCD_Clear(); LCD_Home(); } //------------------------------------------------- void LCD_Set_DDRAM_ADDR (unsigned char DDADDR) { LCD_Open(); LCD_Command(); LCD_Dataport = DDADDR; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_SDelay(); } //------------------------------------------------- void LCD_Uhr_Home (void) { LCD_Set_DDRAM_ADDR(0x88);LCD_Delay(); } //------------------------------------------------- void LCD_S_L_Home (void) { LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay(); } //------------------------------------------------- void LCD_2_L_Home (void) { LCD_Set_DDRAM_ADDR(0xC0);LCD_Delay(); } //------------------------------------------------- void LCD_3_L_Home (void) { LCD_Set_DDRAM_ADDR(0x90);LCD_Delay(); } //------------------------------------------------- void LCD_4_L_Home (void) { LCD_Set_DDRAM_ADDR(0xD0);LCD_Delay(); } //------------------------------------------------- void LCD_Set_CDRAM_ADDR (unsigned char CDADDR) { LCD_Open(); LCD_Command(); LCD_Dataport = CDADDR; LCD_Strobe(); LCD_Data(); LCD_Close(); LCD_SDelay(); } //------------------------------------------------- void LCD_Write_Str (char str [] ) { while ( *str ) { LCD_Write_Data_to_RAM(*str++); } } //------------------------------------------------- void LCD_Write_Strf (flash char str [] ) { while ( *str ) { LCD_Write_Data_to_RAM(*str++); } } //------------------------------------------------- void LCD_Write_Stre (eeprom char str [] ) { while ( *str ) { LCD_Write_Data_to_RAM(*str++); } } //------------------------------------------------- #endif // LCD8bit /*---------------------------------------------------------------------- ----------------------------*/ [\c]
hoppla jetzt aber:
1 | /* LCD 8Bit driver routines
|
2 | |
3 | */
|
4 | |
5 | #ifndef _LCD8bit_INCLUDED_
|
6 | #define _LCD8bit_INCLUDED_
|
7 | |
8 | |
9 | #pragma used+
|
10 | static void LCD_Delay (void); |
11 | static void LCD_SDelay (void); |
12 | |
13 | void LCD_Open (void); |
14 | void LCD_Close (void); |
15 | void LCD_on (void); |
16 | void LCD_off (void); |
17 | |
18 | void LCD_Strobe (void); |
19 | void LCD_Command (void); |
20 | void LCD_Data (void); |
21 | |
22 | void LCD_Clear (void); |
23 | void LCD_Home (void); |
24 | void LCD_Uhr_Home (void); |
25 | void LCD_S_L_Home (void); |
26 | void LCD_2_L_Home (void); |
27 | void LCD_3_L_Home (void); |
28 | void LCD_4_L_Home (void); |
29 | |
30 | void LCD_Mode (void); |
31 | void LCD_D_C_Control (void); |
32 | void LCD_D_C_Shift (void); |
33 | void LCD_Funktion_Set (void); |
34 | void LCD_Set_CDRAM_ADDR (unsigned char CDADDR); |
35 | void LCD_Set_DDRAM_ADDR (unsigned char DDADDR); |
36 | //void LCD_Read_BUSYFlag_ADC (void); // inaktiv
|
37 | void LCD_Write_Data_to_RAM (unsigned char DB); |
38 | //void LCD_ReadD_Data_from_RAM (void);// inaktiv
|
39 | |
40 | void LCD_Init (void); |
41 | void LCD_Write_Str (char []); |
42 | void LCD_Write_Strf (flash char str [] ); |
43 | void LCD_Write_Stre (eeprom char str [] ); |
44 | void LCD_Cursor_On (void); |
45 | void LCD_Cursor_Off (void); |
46 | void LCD_Cursor_Blink (void); |
47 | |
48 | |
49 | #pragma used-
|
50 | #pragma library Lcd8bit.lib
|
51 | |
52 | #endif
|
sorry da ich nicht angemeldet sondern nur als Gast anwesend war kann ichs nicht korrigeren oder löschen. Die token sind mir missglückt aber worum es geht ist wohl leicht zu erkennen. CTRL+c und CTRL+v sind deine Freunde bei der Routinearbeit sicher wäre ein Genrator auch eine Lösung. Am besten einer der beim erstellen einer *.lib gleich das zugeöhrige *.h generiert
Ah ja, sehr schön... aber ich erinnere mich noch wage daran das nach automatischer Erstellung des Haeders gefragt wurde.
Vielen Dank. Der Tipp von Jörg tuts erstmal. Geb ihm auch vollkommen recht in seiner Aussage. Die Idee von Winne ist aber auch nicht schlecht.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.