Archief - [PROG]-[C] overbodige dingen als buffer vol zit

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

GuntherDW

Legacy Member
de file waar het hem om gaat is http://guntherdw.be/tmp/readwad.0.1.c
het is de eerste keer da ik experimenteer me zo'n files dus don't shoot me (DooM WAD files :p)

nu, voor het type WAD file hebt ge in de header 4 bytes, zodus allocate ik 4 bytes, maar wanneer deze 4 bytes vol zitten en ik ze volledig uitlees me printf("%s", wad1.type); krijg ik een hoop erbij stuff erbij, wa dus vreselijk irritant is... :s

hetzelfde geld voor de lumps, als de 'header' van 8 bytes vol zit (hun naam), krijg ik dezelfde rommel erbij...
als deze niet vol zitten is er geen probleem, het is enkel wanneer ze hun volle 8 bytes opgebruiken...

kan iemand me helpen of me in de goede weg duwen? :p
thanks, GuntherDW

(dit is de output die ge krijgt me een example wad, het is me eenders welke wad hetzelfde, alsook de IWADS)
Code:
This is a PWAD
              
12 lumps
92443 offset
Now fseeking to the correct place...
OFFS : 13
SIZE : 44782
NAME : D_RUNNINPWAD
                   
OFFS : 44795
SIZE : 748
NAME : MAP01
OFFS : 45543
SIZE : 190
NAME : THINGS
OFFS : 45733
SIZE : 4676
NAME : LINEDEFSPWAD
                   
OFFS : 50409
SIZE : 18990
NAME : SIDEDEFSPWAD
                   
OFFS : 69399
SIZE : 1520
NAME : VERTEXESPWAD
                   
OFFS : 70919
SIZE : 8820
NAME : SEGS
OFFS : 79739
SIZE : 1184
NAME : SSECTORSPWAD
                   
OFFS : 80923
SIZE : 8260
NAME : NODES
OFFS : 89183
SIZE : 1118
NAME : SECTORS
OFFS : 90301
SIZE : 232
NAME : REJECT
OFFS : 90533
SIZE : 1910
NAME : BLOCKMAPPWAD

GuntherDW

Legacy Member
kheb het dan toch (met een 'hack' in orde gekregen)

Code:
z = strlen(lumps.name);
if(z > 8) { z = 8; }

strncpy(lumpname, lumps.name, z);
lumpname[z] = '\0';

mja, nu worden alle lumps etc tenminste goed weergegeven :applause:

Vich

Legacy Member
Je alloceert het geheugen at runtime? (dat lees ik)
Dat is nou niet echt de bedoeling hoor. De bedoeling is dat je van de vaste datastructuren structs maakt en die structs in een keer inleest!

Bijvoorbeeld voor een Quake3 bsp heb je iets als:
Code:
/// BSP file header
struct tBspHeader
{
    char strId[4]; // should be "IBSP"
    int iVersion;
};

Er zijn - in Q3 - bvb ook lumps als:
Code:
/// BSP lump
struct tBspLump
{
    int iOffset;
    int iLength;
};

/// BSP vertex
struct tBspVertex
{
    CVector3f vPosition;
    CVector2f vTextureCoord;
    CVector2f vLightmapCoord;
    CVector3f vNormal;
    byte color[4];
};


// BSP face
struct tBspFace
{
    int iTextureId;
    int iEffect;
    int iType;
    int iStartVertexIndex;
    int iVertexCount;
    int iMeshVertexIndex;
    int iMeshVertCount;
    int iLightmapId;
    int iLightmapCorner[2];
    int iLightmapSize[2];
    CVector3f vLightmapPos;
    CVector3f vLightmapVectors[2]; // s & t unit vectors
    CVector3f vNormal;
    int iSize[2];
};

Jadzia

Legacy Member
Normaal niet een forum dat ik volg, maar was toevallig aan het lezen :)

De reden dat die rommel erbij komt is omdat je printf("%s".... gebruikt. Dit wil zeggen dat je een serie van chars gaat printen. De C printf functie blijft karakters printen tot het te printen karakter een 0x00 ('\0') is (dit heet null terminated strings of char arrays). Want printf weet niet hoe lang de te printen tekst is, dus blijft ie maar printen tot het een 0x00 tegenkomt.

Dus als je bijvoorbeeld 4 bytes alloceert en daar de inhoud van de 4 bytes grote header inzet, dan zijn er 2 gevallen mogelijk. Geval 1, je leest de header in en die bevat minder dan 4 karakters, dan zal je char array automatisch correct afgesloten worden met een 0x00 omdat die zo in de WAD file ook staan. Als je echter exact 4 letters in de header hebt staan, dan is je 4 bytes bufertje niet meer null terminated en zal dus printf blijven printen tot het toevallig ergens een 0x00 tegenkomt in het geheugen.

Simpele oplossing? Alloceer 1 byte meer dan je nodig hebt en zet in die extra byte aan het einde een 0x00. Op die manier zal printf exact de gewenste header inhoud tonen.

Probleem in jou geval? Je leest de volledige WAD header in 1 keer in rechtstreeks naar een struct. Dus die extra byte ertussen zetten is niet mogelijk dan. Dus in jou geval zal je best een functie maken om een WAD header af te printen. Twee simpele mogelijkheden:

Code:
void print1(char *data, int size)
{
  int i;
  for(i = 0; i < size; ++i)
  {
    printf("%c", data[i]);
  }
}

void print2(char *data, int size)
{
  char buffer[MAXSIZE];
  memcpy(buffer, data, size);
  buffer[size] = '\0';
  printf("%s", buffer);
}

Oproepen bv met:
print1(wad.type, sizeof(wad.type));

Alletwee niet zo mooi en er bestaan waarschijnlijk betere manieren voor hoor. Nuja, je weet nu wat het probleem is. De 2 voorbeeldjes zijn rap rap getypt zonder controle... het kan zijn dat je nog een include mist ofzo.

mvg,
Jad.
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan