unklarer gcc Fehler



  • Hi !

    Was mach ich hier falsch:

    while( fileStatus != 0) {
    	read(serverID, c, sizeof(char));
    	if( c != '\b') {  //server sends '\b' if EOF is reached
    	  addch(c);
    	  currCols++;
    
    	  if( c == '\n' || currCols == COLS) {
    	    currCols = 0;
    	    linesToDisplay++;
    	    move(linesToDisplay, 0);
    	  }
    
    	  if( linesToDisplay == LINES) {
    	    refresh();
    	    move(0,0);
    	    char userInput = getch(); 
    	    if( userInput == 'q') {
    	      write(serverID, 'q', sizeof(char)); //inform the server, that the user wants to quit the program
    	    } 
    	    linesToDisplay = 0;
    	    clear();
    	  } //end if( linesToDisplay == LINES)
    
    	  write(serverID, 'y', sizeof(char)); //tell the server to send the client one more character
    
    	} else //else for if( c != '\b') 
    	  fileStatus = 0;
    }
    

    gcc Mecker:

    [tom@Fedora unix Praktikum]$ gcc -o fileViewer -lcurses fileViewer.c
    fileViewer.c: In function `main':
    fileViewer.c:41: Warnung: passing arg 2 of `read' makes pointer from integer without a cast
    fileViewer.c:57: Warnung: passing arg 2 of `write' makes pointer from integer without a cast
    fileViewer.c:63: Warnung: passing arg 2 of `write' makes pointer from integer without a cast
    

    Das versteh ich nicht. In dem Server benutze ich read und write genauso wie in diesem Quellcode und da macht er es ohne zu meckert. Die passenden Header sind eingebunden.

    mfg
    tom



  • Kannst du englisch?
    "fileViewer.c:41: Warnung: passing arg 2 of `read' makes pointer from integer without a cast" in mieses deutsch übersetzt: Übergabe von Argument 2 von 'read' wandelt einen Integer in einen Pointer um, ohne cast. Wir haben also ein Typproblem. Argument 2 ist c. Scheint, als würde read dort einen Zeiger erwarten, c ist aber kein Zeiger, sondern wahrscheinlich ein integraler Typ (Deklaration hast du ja hilfreicherweise unterschlagen).
    Wie löst man das Problem? Offensichtlich besteht einige Unklarheit, wie die Funktion read zu benutzen ist, also kann es nicht verkehrt sein, mal in die Dokumentation zu schauen. Wir geben also "man 2 read" ein und warten was passiert. Tatsächlich!

    ssize_t read(int fd, void *buf, size_t count);
    

    Der zweite Parameter muss ein Zeiger sein. Weiter im Text:

    read()  attempts  to  read  up  to  count  bytes from file
           descriptor fd into the buffer starting at buf.
    

    (ich übersetze wieder): read() versucht, bis zu «count» bytes vom Filedescriptor «fd» in den Puffer, der bei «buf» beginnt, einzulesen.

    Wir müssen also einen Puffer einrichten. Da du nur 1 Byte einlesen willst, reicht dafür ein char. Basteln wir uns mal den Aufruf zusammen. Wir brauchen einen Filedescriptor, einen Pointer auf den Puffer, und die Länge des Puffers. Also:

    char buffer;
    read(fd, &buffer, 1);
    

    Bei write isses äquivalent. Beim nächsten Mal schaffst du das hoffentlich alleine.



  • Ich weiss zwar nicht für wen oder was du dich hälst, aber auch wenn dein Vorschlag richtig ist, hast du gefälligst nicht in einem so arroganten Ton zu antworten.

    Ausserdem war mir schon klar was die Fehlermeldung soll, aber wenn du richtig gelesen hättest, dann hättest du das wahrscheinlich gelesen:

    In dem Server benutze ich read und write genauso wie in diesem Quellcode und da macht er es ohne zu meckert

    Kann mir jemand erklären, weiso das hier dann kompiliert ?:

    #include <netinet/in.h> //INADDR_ANY,sockaddr_in
    #include <sys/socket.h> //socket, bind ...
    #include <stdio.h> // filehandling 
    #include <stdlib.h> // exit 
    
    int main(int argc, char **argv) {
    
      int socketID, clientID;
    
      struct sockaddr_in serveraddr;
      if( (socketID = socket(AF_INET, SOCK_STREAM, 0)) < 0 ) {
        printf("Error creating the socket");
        exit(1);
      }
    
      //configure the server's address properties
      serveraddr.sin_family = AF_INET; //tcp/ip v4 protocol family
      serveraddr.sin_addr.s_addr = htonl(INADDR_ANY); //accept contacts from any address
      serveraddr.sin_port = htonl(5000); //comunicate over port 5000, this should be a free one
    
      //bind the server's address properties to the socket
      bind( socketID, (struct sockaddr*) &serveraddr, sizeof(serveraddr)); 
    
      //the server should listen to the socket it is configured for. Waiting queue is 1 element
      listen(socketID, 1);
    
      FILE *file = NULL; //FILE creates a new FileHandle
      /*open the file, if this fails tell the user. Note: We ONLY regard the last argument!*/  
      if( (file = fopen( argv[argc-1], "r")) == NULL ) { 
        exit(-1); //quit the prog  
      }
    
      //for(;;) {
        clientID = accept(socketID, NULL, NULL);
    
        //read data from file an send to the client
        char c; //buffer character c
        char clientStatus = 'y'; //has value 'q' if the user quits the programm earlier than expected
        while ( ( (int) c = fgetc(file) ) != EOF && clientStatus != 'q' ) { //read one character in each pass
          write(clientID, c, 1); //transmit data to the client
          read( clientID, clientStatus, sizeof(char)); //wait for client's answer to the transmission of c       
        }   
        write(clientID, '\b', 1); //inform the client, that we've reached EOF
        close( clientID );
        //}
      close(file);  
    
    }
    

    Darauf will ich hinaus.
    trotzdem thx

    mfg
    tom



  • tomatoTom schrieb:

    Ich weiss zwar nicht für wen oder was du dich hälst, aber auch wenn dein Vorschlag richtig ist, hast du gefälligst nicht in einem so arroganten Ton zu antworten.

    Ohje, nie kann man es den Leuten recht machen. Dem einen ist "RTFM" zu arrogant, nimmt man einen mal komplett an die Hand, isses auch zu arrogant. Wie hätten Sie es denn gern?

    Ausserdem war mir schon klar was die Fehlermeldung soll

    Warum heißt Ihr Thema dann "Unklarer gcc Fehler"?

    , aber wenn du richtig gelesen hättest, dann hättest du das wahrscheinlich gelesen:

    In dem Server benutze ich read und write genauso wie in diesem Quellcode und da macht er es ohne zu meckert

    Hab ich gelesen, aber da Sie das Programm, in dem es "funktioniert", erst jetzt posten, konnte ich damit nichts anfangen.

    Kann mir jemand erklären, weiso das hier dann kompiliert ?:

    unistd.h ist nicht eingebunden, daher kein Prototyp zu read oder write vorhanden, keine Typprüfung möglich, Compiler läßt Typfehler durchgehen. Die Quittung dafür bekommen Sie dann mit etwas Glück bei der Ausführung.


Anmelden zum Antworten