|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計 | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
如何在Keil C51使用函數(shù)FILE、fopen、fclose、exit、fscanf? |
| 作者:inanswer 欄目:單片機(jī) |
小弟想在Keil C51使用以下函數(shù):FILE、fopen、fclose、exit、 fscanf、rewind。這些函數(shù)的預(yù)定義是包含在C語言的<stdio.h><stdlib.h>中,但Keil C51中的<stdio.h><stdlib.h>只是C語言的<stdio.h><stdlib.h>的子集,無法通過編譯和 連接,所以小弟我將Keil C51中的<stdio.h><stdlib.h>文件進(jìn)行了修改,將他們的預(yù)定義 包含在頭文件中,結(jié)果通過了編譯。但在連接時出現(xiàn)了下面的warning: warning: *** WARNING L16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?PR ? _INIT_MEMPOOL?INIT_MEM *** WARNING L16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS SEGMENT: ?C _INITSEG *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: _EXIT *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: _FSCANF *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: _FCLOSE *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: _REWIND *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: _FOPEN *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL SYMBOL: ?_FOPEN?BYTE *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _EXIT *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _FSCANF *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _FCLOSE *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _REWIND *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _FOPEN 不知哪位大蝦能指點(diǎn)指點(diǎn)小弟?謝謝! |
| 2樓: | >>參與討論 |
| 作者: inanswer 于 2005/3/14 20:42:00 發(fā)布:
以下是我修改的<stdio.h>,請大蝦們幫忙看看 /*-------------------------------------------------------------------------- STDIO.H Prototypes for STANDARD I/O functions. COPYRIGHT (c) 1988-2001 Keil Elektronik GmbH and Keil SOFTWARE, Inc. All rights reserved. --------------------------------------------------------------------------*/ #ifndef EOF #define EOF -1 #endif #ifndef NULL #define NULL ((void *) 0) #endif #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; #endif //---------------------------------------added code begin--------------------- ----// /* Define _CRTIMP */ #ifndef _CRTIMP #ifdef _DLL #define _CRTIMP __declspec(dllimport) #else /* ndef _DLL */ #define _CRTIMP #endif /* _DLL */ #endif /* _CRTIMP */ /* Define __cdecl for non-Microsoft compilers */ #if ( !defined(_MSC_VER) && !defined(__cdecl) ) #define __cdecl #endif /* typedef struct { SHORT level; unsigned flags; CHAR fd; unsigned CHAR hold; SHORT bsize; unsigned CHAR *baffer; unsigned CHAR *curp; unsigned istemp; SHORT token; }FILE; */ #ifndef _FILE_DEFINED struct _iobuf { CHAR *_ptr; int _cnt; CHAR *_base; int _flag; int _file; int _CHARbuf; int _bufsiz; CHAR *_tmpfname; }; typedef struct _iobuf FILE; #define _FILE_DEFINED #endif #define FILENAME_MAX 260 _CRTIMP FILE * __cdecl fopen(const CHAR *, const CHAR *); _CRTIMP int __cdecl fscanf(FILE *, const CHAR *, ...); _CRTIMP void __cdecl rewind(FILE *); _CRTIMP int __cdecl fclose(FILE *); //----------------------------------added code end------------------// #pragma SAVE #pragma REGPARMS extern CHAR _getkey (void); extern CHAR getCHAR (void); extern CHAR ungetCHAR (CHAR); extern CHAR putCHAR (CHAR); extern int printf (const CHAR *, ...); extern int sprintf (CHAR *, const CHAR *, ...); extern int vprintf (const CHAR *, CHAR *); extern int vsprintf (CHAR *, const CHAR *, CHAR *); extern CHAR *gets (CHAR *, int n); extern int scanf (const CHAR *, ...); extern int sscanf (CHAR *, const CHAR *, ...); extern int puts (const CHAR *); #pragma RESTORE |
|
| 3樓: | >>參與討論 |
| 作者: inanswer 于 2005/3/14 20:46:00 發(fā)布:
以下是我修改后的<stdlib.h>,請大蝦們幫忙看看,謝謝! /*-------------------------------------------------------------------------- STDLIB.H STANDARD functions. COPYRIGHT (c) 1988-2001 Keil Elektronik GmbH and Keil SOFTWARE, Inc. All rights reserved. --------------------------------------------------------------------------*/ #ifndef _SIZE_T #define _SIZE_T typedef unsigned int size_t; #endif #ifndef NULL #define NULL ((void *) 0L) #endif #ifndef _WCHAR_T_DEFINED_ #define _WCHAR_T_DEFINED_ typedef CHAR wCHAR_t; #endif //-----------------------------------------added code begin-------------------- ---// /* Define _CRTIMP */ #ifndef _CRTIMP #ifdef _DLL #define _CRTIMP __declspec(dllimport) #else /* ndef _DLL */ #define _CRTIMP #endif /* _DLL */ #endif /* _CRTIMP */ /* Define __cdecl for non-Microsoft compilers */ #if ( !defined(_MSC_VER) && !defined(__cdecl) ) #define __cdecl #endif /* Definition of the argument values for the exit() function */ #define EXIT_SUCCESS 0 #define EXIT_FAILURE 1 /* function prototypes */ _CRTIMP void __cdecl abort(void); _CRTIMP void __cdecl exit(int); //---------------------------------added code end------------------------------ -----// #pragma SAVE #pragma REGPARMS extern int abs (int val); extern LONG labs (LONG val); extern float atof (CHAR *s1); extern LONG atol (CHAR *s1); extern int atoi (CHAR *s1); extern int rand (); extern void srand (int); extern float strtod (CHAR *, CHAR **); extern LONG strtol (CHAR *, CHAR **, unsigned CHAR); extern unsigned LONG strtoul (CHAR *, CHAR **, unsigned CHAR); #define _MALLOC_MEM_ xdata extern int init_mempool (void _MALLOC_MEM_ *p, unsigned int size); extern void _MALLOC_MEM_ *malloc (unsigned int size); extern void free (void _MALLOC_MEM_ *p); extern void _MALLOC_MEM_ *realloc (void _MALLOC_MEM_ *p, unsigned int size); extern void _MALLOC_MEM_ *calloc (unsigned int size, unsigned int len); #pragma RESTORE |
|
| 4樓: | >>參與討論 |
| 作者: hiberhe 于 2005/3/14 21:19:00 發(fā)布:
必然出錯! WARNING L16:UNCALLED SEGMENT,IGNORED FOR OVERLAY PROCESS ENT: ?PR ? _INIT_MEMPOOL?INIT_MEM 這個可以不管,是指你有的函數(shù)沒有調(diào)用,相當(dāng)于"死"而無用的,當(dāng)然,有可能用函數(shù)指針調(diào)用了,或者有其它什么目的 *** WARNING L1:UNRESOLVED EXTERNAL SYMBOL 沒有實現(xiàn),已就是你調(diào)用的外部函數(shù),沒有這個函數(shù)的實現(xiàn)形式! 比如 SYMBOL: _EXIT,說明exit這個函數(shù)沒有實現(xiàn)形式 *** WARNING L2:REFERENCE MADE TO UNRESOLVED EXTERNAL SYMBOL: _FOPEN 說明fopen沒有聲明,也就是說你調(diào)用的fopen,但你沒有用extern聲明這個函數(shù),如果你聲明了,但這個函數(shù)實現(xiàn)不存在,那么就會出現(xiàn)第二個錯誤 不明白你為什么要去用fopen之類的,你怎么去open???當(dāng)然,你可以改寫你以你的形式的fopen,比如從串口讀一個文件,可是你必須自己寫呀. c51和c還是有很多的不同的! |
|
| 5樓: | >>參與討論 |
| 作者: exdata 于 2005/3/14 21:23:00 發(fā)布:
假如 (假如)首先我無條件假設(shè)你是正確的,所以得到: FILE *p = fopen(".\\test.txt","rw");執(zhí)行正確,但是我想問問你當(dāng)前路徑是在什么地方呢,你都無法解析當(dāng)前路徑信息何處得來跟更不用說是打開文件進(jìn)行操作了。 因此,不是簡單的把win32/dos平臺的使用的頭文件聲明CTRL+C and CTRL+V進(jìn)來單片機(jī)就給你干活的,這里涉及很多關(guān)于標(biāo)準(zhǔn)流的內(nèi)部函數(shù)keil都沒有實現(xiàn)。 |
|
| 6樓: | >>參與討論 |
| 作者: 楊工 于 2005/3/14 22:47:00 發(fā)布:
你對單片機(jī)的期望太高了 單片機(jī)不是PC機(jī),何來硬盤?何來操作系統(tǒng)? 何來文件系統(tǒng)? 怎么可能支持函數(shù)fopen(), fclose()等。 這些函數(shù)都必須有操作系統(tǒng)的支持。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |