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 thxmfg
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.