unknown type name typedef



  • Hallo!
    Wieso bekomme ich hier die Fehlermeldung unknown type name TNode?

    #ifndef COUNTSUBDIRS_H_INCLUDED
    #define COUNTSUBDIRS_H_INCLUDED
    
    struct TNode
    {
    	struct TNode * pNext;
    	char * path;
    };
    
    typedef TNode * TList;
    

    im main wird das headerfile folgendermaßen eingebunden:

    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <ftw.h>
    #include "CountSubDirs.h"
    
    int main(int argc, char **argv) {
        if (!argv[1] || access(argv[1], R_OK)) {
            return 1;
        }
    
        AddDirectory(argv[1]);
        CountSubDirectories();
        RemoveAll();
        return 0;
    }
    

    laut internet, gibt es in c auch die direktive typedef, also muss es durch einen syntaxfehler meinerseits verursacht worden sein. kann mir aber wer welchen wo dieser ist?

    mfg
    ACnut



  • Du hast keinen Typ "TNode" definiert
    Deshalb funktioniert

    typedef TNode * TList;
    

    Du hast nur den Typ "struct TNode" (Zeile 4) definiert



  • hast recht 🙂
    aber in C++ hätte das schon funktioniert, oder?

    hmmm und jetzt bekomme ich den fehler undefined reference to <aufgerufene Funktionen im main(AddDirectory,...)>

    #ifndef COUNTSUBDIRS_H_INCLUDED
    #define COUNTSUBDIRS_H_INCLUDED
    
    struct TNode
    {
    	struct TNode * pNext;
    	char * path;
    };
    
    typedef struct TNode * TList;
    
     int const OK=1;
     int const NOK=0;
    
     TList * dirs=0;
     int length=0;
    
     unsigned int total=0;
    
    //adds a directory to directory list
    void AddDirectory(char const* dir);
    
     //removes a directory
    void RemoveDirectory(char const* dir);
    
     //removes all directories
    void RemoveAll();
    
     //counts all sub directories
    void CountSubDirectories();
    
    .
    .
    .
    #endif // COUNTSUBDIRS_H_INCLUDED
    

    im c file werden die oben definierten funktionsprototypen, dann eben ausimplementiert.

    benutzen tu ich Code::Blocks auf Ubuntu

    was passt jetzt schon wieder nicht? 🙂


  • Mod

    ACnut schrieb:

    hast recht 🙂
    aber in C++ hätte das schon funktioniert, oder?

    Ja. In C++ soll es angeblich vieles geben, was es in C nicht gibt 🙂 .

    was passt jetzt schon wieder nicht? 🙂

    Irgendeine der Angaben, die du machst, wird wohl nicht stimmen. Vielleicht wird die Funktion doch nirgend implementiert (vielleicht wird irrtümlich eine Funktion implementiert, die so ähnlich heißt?). Vielleicht wird die resultierende Datei mit den Funktionen nicht zu der Datei mit der main-Funktion gelinkt. Vielleicht ist die Reihenfolge falsch.
    http://www.c-plusplus.net/forum/304133



  • gut dann poste ich mal eine "miniversion"(hoffentlich mini genug)

    also das header file:

    #ifndef COUNTSUBDIRS_H_INCLUDED
    #define COUNTSUBDIRS_H_INCLUDED
    
    struct TNode
    {
        struct TNode * pNext;
        char * path;
    };
    
    typedef struct TNode * TList;
    
     int const OK=1;
     int const NOK=0;
    
     TList * dirs=0;
    
    unsigned int total=0;
    
    //adds a directory to directory list
    void AddDirectory(char const* dir);
    
     //removes a directory
    void RemoveDirectory(char const* dir);
    
     //removes all directories
    void RemoveAll();
    
     //counts all sub directories
    void CountSubDirectories();
    
    .
    .
    .
    #endif // COUNTSUBDIRS_H_INCLUDED
    

    die protoptypen für die listenfunktionen wurden darunter geschrieben

    c-file wo die funktionen implementiert werden:

    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <string.h>
    #include <dirent.h>
    #include <stdlib.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <ftw.h>
    #include "CountSubDirs.h"
    
          void AddDirectory(char const* dir)
           {
           	if(dirs==0)
           		return 0;  //listenfunktion InitList(dirs);
    
           	//listenfunktion Append(dirs, dir);
           }
    
            void RemoveDirectory(char const* dir)
            {
            	if(dirs==0)
            	{
            		fprintf(stderr, "%s\n", "There are no directories yet to delete!");
            		return;
            	}
            	//Delete(dirs,dir);
            	if(Length(dirs)==0)
            	{
            		free(dirs);
            		dirs=0;
            	}
            }
    
             void RemoveAll()
             {
             	if (dirs==0)
             		return;
    
             	//Clear(dirs);
             	dirs=0;
             }
    
              void CountSubDirectories()
              {
              	int i=0;
              	TNode* pItem=dirs;
    
              	if(dirs==0)
              	{
              		fprintf(stderr, "%s\n", "No directories added yet!");
              		return;
              	}
    
              	for(pItem;pItem!=0;pItem=pItem->pNext)
              	{
              		total=0;
    
              		   if (ftw(pItem->path,&sum, 1)) {
            perror("ftw");
            return 2;
        }
    
        printf("Count of subdirs in %s is: %lu\n\n", item->path, total);
              	}
    
              }
    

    unterhalb werden die listenfunktionen implementiert (wobei ein austausch de rpositionen auch nichts gebracht hat)

    die main sieht so aus:

    #include <stdio.h>
    #include <errno.h>
    #include <unistd.h>
    #include <sys/types.h>
    #include <sys/stat.h>
    #include <ftw.h>
    #include "CountSubDirs.h"
    
    int main(int argc, char **argv) {
        if (!argv[1] || access(argv[1], R_OK)) {
            return 1;
        }
    
        AddDirectory(argv[1]);
        CountSubDirectories();
        RemoveAll();
        return 0;
    }
    

  • Mod

    Fehlermeldung?



  • fehlermeldung:

    obj/Debug/main.o||In function `main':|
    /home/bsy3/Workspace/CodeBlocks_Workspace/CountSubDirs/main.c|14|undefined reference to `AddDirectory'|
    /home/bsy3/Workspace/CodeBlocks_Workspace/CountSubDirs/main.c|15|undefined reference to `CountSubDirectories'|
    /home/bsy3/Workspace/CodeBlocks_Workspace/CountSubDirs/main.c|16|undefined reference to `RemoveAll'|
    ||=== Build finished: 3 errors, 0 warnings (0 minutes, 0 seconds) ===|
    

  • Mod

    Bist du mal dem Link bezüglich Linkerfehlern gefolgt (no pun intended), in dem Link, den ich oben angegeben habe? Sieht so aus, als würdest du eine Art IDE benutzen, hättest jedoch die Quelldateien nicht korrekt zu einem Projekt zusammen gefügt.



  • nach dem erstellen der Dateien werden anscheinend diese nicht automatisch gelinkt, sondern man muss diese dann manuell zum Projekt hinzufügen.
    Jetzt funktioniert es, danke 🙂


Anmelden zum Antworten