problem mit pointer-strukur struct pointer *point



  • hallo an alle!
    ich will eine kleine main-methode schreiben um funktionen, die in einem anderne modul geschrieben wurden zu testen.
    die zu testende funktion soll einfach bytes von einem fd in einen puffer schreiben und sieht folgendermaßen aus:

    ssize t readToBuf (int fd, struct buffer *buf);
    

    nun versuche ich in der main eben jene methode mit einem struct aufzurufen, erhalte jedoch immer folgende fehlermeldung:

    error: incompatible type for argument 2 of âreadToBufâ
    util.h:30: note: expected âstruct buffer *â but argument is of type âstruct bufferâ
    

    ich weiss, dass die formatübergabe nicht stimmt, habe jedoch 2 stunden mit den derefenzierungen etc. etc. rumgespielt und meinen fehler nicht gefunden, wäre nett, wenn mir einer meinen denkfehler erklärt 🙂

    1 #include <stdio.h>
      2 #include <stdlib.h>
      3 #include <unistd.h>
      4 #include <string.h>
      5 #include <sys/types.h>
      6 #include <stdarg.h>
      7 #include <errno.h>
      8 #include <sys/stat.h>
      9 #include <fcntl.h>
     10
     11 #include "util.h"
     12 #include "server.h"
     13
     14 int main () {
     15
     16
     17 int desk;
     18
     19 struct buffer {
     20 char buffer[1024];
     21 };
     22
     23 struct buffer *buf;
     24
     25 if ((desk = open("test.txt", O_RDONLY)) == -1) {
     26         perror("Fehler beim oeffnen mit open()");
     27         return EXIT_FAILURE;
     28 }
     29
     30 if ((readToBuf(desk, *buf)) == -1){
     31         perror("Fehler bei readToBuf()");
     32         return EXIT_FAILURE;
     33 } }
    


  • [quoteif ((readToBuf(desk, *buf)) == -1){[/quote]
    würde ich durch :

    if ((readToBuf(desk, buf)) == -1){
    


  • habe ich auch schon versucht, jedoch kriege ich dann folgende fehlermeldung:

    warning: passing argument 2 of âreadToBufâ from incompatible pointer type
     note: expected âstruct buffer *â but argument is of type âstruct buffer *â
    


  • Aus welcher Bibliothek ist eigendlich der Befehl?
    Dort sollte auch ein struct sein, da dein Selbergebautes struct offensichtlich falsch ist.



  • Das ist jetzt eine Warnung und kein Fehler mehr.
    Außerdem fehlt die Definition des Speichers für *buf.
    Ebenso kann ich den Unterschied zwischen "struct buffer *" und "struct buffer *" nicht erkennen, bist du dir sicher, dass du den Teil richtig gepostet hast?



  • die bib:

    #ifndef _util_h
    
    #define _util_h
    
    struct buffer {
    
    	unsigned char *buf;
    
    	unsigned int bufmax;
    
    	unsigned int buflen;
    
    };
    
    /* Buffer Functions
    
     * createBuf creates a new buffer (including malloc)
    
     * copyBuf copies the contents from src to dest (overwriting dest)
    
     * flushBuf empties a buffer (sets buflen to 0)
    
     * freeBuf frees the malloced memory
     * 
    
     * returns -1 on error, 1 on success (for non-void functions)
    
    */
    
    int createBuf(struct buffer *buf, unsigned int maxsize);
    
    int copyBuf (struct buffer *dest, struct buffer *src);
    
    void flushBuf(struct buffer *buf);
    
    void freeBuf(struct buffer *buf);
    
    ssize_t writeWrapper (int fd, const void *buf, size_t count);
    
    ssize_t writef (int fd, char *fmt, ...);
    
    char *stringBuilder (const char *fmt, ...);
    
    char *vStringBuilder (const char *fmt, va_list ap);
    
    ssize_t readToBuf (int fd, struct buffer *buf);
    
    ssize_t writeBuf (int fd, struct buffer *buf);
    
    #endif
    

    den fehler/warnung habe ich auch nur copy+paste. da das auch für mich identisch aussieht habe ich mich eben gewundert.



  • struct buffer {
    
        unsigned char *buf;
    
        unsigned int bufmax;
    
        unsigned int buflen;
    
    };
    

    Du musst den Buffer nehmen.
    Also

    struct buffer meinBuffer;
    if ((readToBuf(desk, &meinBuffer)) == -1)
    


  • du meinst also konkret nicht dereferenzieren sondern mit ihm direkt arbeiten??

    hab den code mal dementsprechend verändert, bekomme trotzdem noch folgende warnung

    server.c:31: warning: passing argument 2 of âreadToBufâ from incompatible pointer type
    util.h:30: note: expected âstruct buffer *â but argument is of type âstruct buffer *â
    

    ach ja, zusätzlich steht nach der warnung noch folgendes:

    /tmp/ccI5Aqw1.o: In function `main':
    server.c:(.text+0x61): undefined reference to `readToBuf'
    server.c:(.text+0x8c): undefined reference to `writeBuf'
    collect2: ld returned 1 exit status
    

    ergibt sich das nach dem linken via make?



  • Der Linker kann den Codeteil der beiden Funktionen nicht finden, das lässt auf grundsätzliche Fehler/Unkenntnis in deinem Projektaufbau schließen.


Log in to reply