C - 错误未定义且存储未知

Posted

技术标签:

【中文标题】C - 错误未定义且存储未知【英文标题】:C - ERROR not defined and storage unknown 【发布时间】:2017-09-05 23:54:41 【问题描述】:

我有删除目录的代码。我有header1.hheader1.cmain.c。 我遇到了一些错误,但我更难理解的是错误: (1) ffblk 的存储大小未知。 另外,我对如何定义ffblk的属性有疑问,即ff_name和ff_attrib 此示例来自互联网上的各种代码示例(甚至来自此处的其他示例),它们都执行相同的代码,只是在我的情况下它不起作用。 我错过了结构的定义吗?或者也许我在不应该是任何代码的地方添加了代码? 请你帮助我好吗?我通常不使用 C 语言编程,我使用的是 Dev-Cpp

header1.h:

#ifndef HEADER1_H_INCLUDED
#define HEADER1_H_INCLUDED

typedef struct ffblk ffblk;

#endif

header.c:

#include <stdio.h>
#include <stdlib.h>
#include "header1.h"
struct ffblk

    char ff_attrib[20];  //this line i added just so dont show error of unknown
    char ff_name[20];  //this line i added just so dont show error of unknown
;

main.c:

#ifndef FA_RDONLY
  #define FA_RDONLY _A_RDONLY
 #endif

#ifndef FA_HIDDEN
  #define FA_HIDDEN _A_HIDDEN
 #endif

 #ifndef FA_SYSTEM
  #define FA_SYSTEM _A_SYSTEM
 #endif

 #ifndef FA_DIREC
  #define FA_DIREC _A_SUBDIR
 #endif

 #ifndef FA_ARCH
  #define FA_ARCH _A_ARCH
 #endif


# include <stdio.h>
# include <dos.h>
# include <dir.h>
# include <io.h>
# include <conio.h>
#include "header1.h"

    typedef struct ffblk ffblk;

int BorrarArchivo(char *nombarch)

   printf("Borrando Archivo %s \n",nombarch);

   remove(nombarch);

   return 0;


int EliminarAtributo(char *nombarch,int atributo)

   printf("Elimina Atributo %s   %d\n",nombarch,atributo);

   chmod(nombarch,atributo);

   return 0;


int BorrarArbol(void)
  
   struct ffblk ffblk;
   int done,err;

   err=0;
   done=findfirst("*.*",&ffblk,FA_RDONLY|FA_HIDDEN|FA_DIREC|FA_ARCH|FA_SYSTEM);

   while (!done)
   
     if (FA_HIDDEN & ffblk.ff_attrib)
         EliminarAtributo(ffblk.ff_name,FA_HIDDEN);

     if (FA_SYSTEM & ffblk.ff_attrib)
         EliminarAtributo(ffblk.ff_name,FA_SYSTEM);

     if (FA_RDONLY & ffblk.ff_attrib)
         EliminarAtributo(ffblk.ff_name,FA_RDONLY);

     if (FA_ARCH & ffblk.ff_attrib)
         err=BorrarArchivo(ffblk.ff_name);
     else if (FA_DIREC & ffblk.ff_attrib)
     
        if (ffblk.ff_name[0]!='.')
         
            chdir(ffblk.ff_name);

            err=BorrarArbol();

            chdir("..");

            if (!err)  
                printf("Removiendo %s\n",ffblk.ff_name);

            rmdir(ffblk.ff_name);
        
     
     else
        err=BorrarArchivo(ffblk.ff_name);

     if (err)
       
        printf("Error en el borrado ... !"); return err;
     

     done=findnext(&ffblk);
    

   return 0;


int main (void)
 int err=0;
  char c;
    printf("Esta seguro  [ Si -> S , No ->otra tecla ] =>");
    c=getchar();
    if (!(c=='S' || c=='s')) return 0;
    err=BorrarArbol();
    if (err) printf("Error en el borrado ... !");
    return err;

编辑: 我找到了struct的定义并将其粘贴到header.h中

typedef struct ffblk 
      char lfn_magic[6];        /* LFN: the magic "LFN32" signature */
      short lfn_handle;     /* LFN: the handle used by findfirst/findnext */
      unsigned short lfn_ctime; /* LFN: file creation time */
      unsigned short lfn_cdate; /* LFN: file creation date */
      unsigned short lfn_atime; /* LFN: file last access time (usually 0) */
      unsigned short lfn_adate; /* LFN: file last access date */
      char ff_reserved[5];      /* used to hold the state of the search */
      unsigned char ff_attrib;  /* actual attributes of the file found */
      unsigned short ff_ftime;  /* hours:5, minutes:6, (seconds/2):5 */
      unsigned short ff_fdate;  /* (year-1980):7, month:4, day:5 */
      unsigned long ff_fsize;   /* size of file */
      char ff_name[260];        /* name of file as ASCIIZ string */
    ffblk;

现在它显示错误:

C:\Users\1\AppData\Local\Temp\cc89P309.o:Untitled3.c:(.text+0x8e): undefined reference to `findfirst'
C:\Users\1\AppData\Local\Temp\cc89P309.o:Untitled3.c:(.text+0x1d8): undefined reference to `findnext'

【问题讨论】:

该错误出现在代码的哪一行? 另外,在 header.c 中添加struct ffblk 的定义后,它会出现吗? 最初的代码只是 main.c 但我得到了多个错误,看到我创建的示例 header.h 和 header.c 剩余的最后一个错误出现在声明的 main.c结构 ffblk ffblk. 我刚刚注意到您正在使用一些特定于 Windows 的文件,所以我可能无法为您提供太多帮助,但您的新错误通常意味着 findfirst 和 findnext 需要定义、包含或链接。你知道他们应该来自什么文件吗?如果你包含dos库(#include &lt;dos.h&gt;)那么你是否还必须链接到dos库(-ldos从命令行,不确定在Dev-Cpp中做什么)。 自从我在 c 中工作已经很多年了,但 main.c 不需要像 int main() 中那样的主例程吗? 【参考方案1】:

最后,问题始终是函数 findfirst(a,b,c) 和 findnext(a,b,c)。我不得不更改函数并使用它们的版本与 2 个参数而不是 3 个参数。我将所有代码与包含、typedef 结构和下面的代码放在一个文件中。

【讨论】:

以上是关于C - 错误未定义且存储未知的主要内容,如果未能解决你的问题,请参考以下文章

Angular AOT Build:内部错误:未知标识符未定义

谷歌分析:ec.SetAction 未知目标:未定义

需要未知模块“未定义”

收到此错误:处理命令时发生未知的服务器端错误。原始错误:无法读取未定义的属性“替换”

[GraphQL 错误]:消息:“rootMutation”类型的字段“createUser”上的未知参数“email”。位置:[object Object],路径:未定义

在 AdvanceDataGrid 中添加记录时:TypeError:错误 #1010:术语未定义且没有属性