Write und seine Argumente...



  • Ich habe eine "verständliche" Warnung von meinem Compiler:

    client.c:255: Warnung: Verarbeiten des Argumentes 2 von »write« erzeugt Zeiger von Ganzzahl ohne Typkonvertierung

    Hier ein paar Zeilen aus meiner client.c:
    startaddr = headerIndexSize + header.readindex * frameSize;
    size = frameSize*(header.writeindex - header.readindex);
    write(fr, startaddr, size);

    Wird der Inhalt aus dem Speicherbereich ab Adresse "startaddr" nun korrekt in meine Datei geschrieben oder nicht?



  • Die Angabe der verwendeten Datentypen wäre hilfreich. Welchen Datentyp startaddr und size haben, kann man nur raten. Die Variable fr enthält vermutlich den Dateideskiptor.

    Wobei die Berechnung von startaddr nicht korrekt aussieht. "headerIndexSize" klingt nach der Grösse des indexes. "header.readindex * frameSize" sieht aus, wie ein Offset. Eine Grösse + Offset ergibt noch keinen Zeiger in den Speicher.

    Aus diesen Überlegungen vermute ich, daß startaddr eine Ganzzahl ist. Und write erwartet einen Zeiger als 2. Parameter. Dann ist die Warnung auch klar. "startaddr" ist keine Adresse, auch wenn die Variable so heisst.

    Übrigens wenn Du die Umgebungvariable LANG auf C setzt, bekommst Du englische Fehlermeldungen, die oft klarer sind.

    Tntnet



  • Danke hat sich nun erledigt.
    Habe nun einen Zeiger auf den Start des Speicherbereichs und aufs Ende...

    startaddr = headerIndexSize + header.readindex * frameSize;
    size = frameSize*(header.writeindex - header.readindex);
    ptr_first = (FRAME_SHM_ELEMENT*) startaddr;
    ptr_last = (FRAME_SHM_ELEMENT*)(startaddr+size);
    write(fr, ptr_first, size);



  • pyjamaboy schrieb:

    Danke hat sich nun erledigt.
    Habe nun einen Zeiger auf den Start des Speicherbereichs und aufs Ende...

    startaddr = headerIndexSize + header.readindex * frameSize;
    size = frameSize*(header.writeindex - header.readindex);
    ptr_first = (FRAME_SHM_ELEMENT*) startaddr;
    ptr_last = (FRAME_SHM_ELEMENT*)(startaddr+size);
    write(fr, ptr_first, size);

    So wie das da steht sieht aber startaddr nicht wie ein Zeiger sondern wie ein Index aus. Ich würde da eher so etwas erwarten:

    startaddr = header + headerIndexSize + header.readindex * frameSize;


Log in to reply