Newsgroup: it.comp.lang.c++
Titolo: aiuto per comprendere meglio una routine di lettura file...

ciao a tutti.
ecco il mio problema: voglio scrivermi un programma che legga da file immagine di una telecamera i valori della matrice di dati senza il file header.
l'hw salva in formato .b16 (sono matrici composte dai valori della cdd red, green, green, blu su 12bit).
che cosa ho fatto? ho chiesto al signore che lo ha inventato una mano (
www.pco.de
) e mi ha dato queste 2 funzioni per leggere e scrivere ma usano l'sdk di win e io non lo conosco bene.
ho cercato un ng sulle sdk ma in italiano non l'ho trovato e dato che il programmino è scritto in cpp spero che non mi castigherete.
il problema serio: c'é una dichiarazione di un puntatore che mi da errore ( dword *b1; ), perché? ma perché lui ha scritto in minuscolo?
secondo: alla funzione int read_b16(char *filename, void *buf) devo passare il puntatore all'allocazione di memoria del nome file (ok) e del buffer che conterrà i dati che e = ReadFile(hfread, (void *)buf, z, &zz, NULL); ci andrà a scrivere.
ma questo buffer come deve essere? un vettore lungo abbastanza da contenere tutti i valori di una immagine 1280x1024pixel?
come arrivo alla matrice dei dati bella ordinata in righe e colonne con l'uscita di questa funzione? tipo data[1280][1024]?
qui mi basterebbe qualche dritta, poi mi arrangerò io (so che non è bello chiedere che latri scrivano il codice per te). la domanda è banale (forse) ma è il mio primo programma che legge file immagini, sono proprietari e per di più usano l'sdk mentra io ho studiato solo l'ansi C... ma voglio cogliere l'occasione per imaparare.
sotto il codice scritto dalla pco:
int read_b16(char *filename, void *buf)
{
  HANDLE hb1;
  byte *cptr;
  byte *c1;
  dword *b1;
 
  HANDLE hfread;
  DWORD z, zz;
  int e;
 
  long fsize;
  long headerl;
  int err;
 
 
  hb1 = GlobalAlloc(GHND, 2000L);
  cptr = (byte *)GlobalLock(hb1);
  hfread = CreateFile(filename,
    GENERIC_READ,
    0,
    NULL,
    OPEN_EXISTING, 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
    0);
  if (hfread== INVALID_HANDLE_VALUE)
  {
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
  e = ReadFile(hfread, (void *)cptr, 400, &z, NULL);
 
  if ((e == 0) || (z != 400))
  {
    //  ErrMsg("File-Read ERROR");
    CloseHandle(hfread);
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
 
  c1 = cptr;
  if ((*c1 != 'P') || (*(c1 + 1) != 'C') || (*(c1 + 2) != 'O') || (*(c1 + 3) != '-'))
  {
    CloseHandle(hfread);
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
  // read FILEHEADER
  (void *)b1 = cptr + 4;
  fsize = *b1;
 
  (void *)b1 = cptr + 8;                  // headerlength
  headerl =*b1;
 
  z = fsize - headerl;
 
  if (IsBadWritePtr(buf, z) != FALSE)
    return (NOMEM);
 
  err = NOERR;
  // read data
  SetFilePointer(hfread, headerl, NULL, FILE_BEGIN);
 
  e = ReadFile(hfread, (void *)buf, z, &zz, NULL);
 
  if ((e == 0) || (z != zz))
  {
    err = NOFILE;
  }
 
  // close filehandle
  CloseHandle(hfread);
  GlobalUnlock(hb1);
  GlobalFree(hb1);
 
  return (err);
}
int store_b16(char *filename, int width, int height,
              int colormode, void *buf)
{
  byte *cptr;
  byte *c1;
  int *b1;
  int e;
 
  HANDLE hfstore;
  HANDLE hb1;
  long z, zz;
  DWORD headerl;
  //  char of[20];
 
  hb1 = GlobalAlloc(GHND, 2000L);
  cptr = (byte *)GlobalLock(hb1);
 
  headerl = 128;
 
  c1 = cptr;
  *c1++ = 'P';           // Begin PCO-Header PCO-
  *c1++ = 'C';
  *c1++ = 'O';
  *c1++ = '-';
 
  (void *)b1 = c1;
 
  // Daten für Header
  *b1++ =(width*height*2) + headerl;
  *b1++ = headerl;
  *b1++ = width;
  *b1++ = height;
  //@vers3.03
  *b1++ = -1;
 
  *b1++ = colormode;
  getdialogbw(b1   , (b1 + 1), (b1 + 2));
  //              bwmin,bwmax ,bwlin
  getdialogcol((b1 + 3), (b1 + 4), (b1 + 5), (b1 + 6), (b1 + 7), (b1 + 8), (b1 + 9));
  //               rmin  ,rmax  ,gmin  ,gmax  ,bmin  ,bmax  ,collin
 
  b1 += 10;
 
  // Fill Header
  c1 = (void *)b1;
  for (; c1 < cptr + 128; )
    *c1++=0;
 
  hfstore = CreateFile(filename,
    GENERIC_WRITE,
    0,
    NULL,
    CREATE_ALWAYS, 
    FILE_ATTRIBUTE_NORMAL | FILE_FLAG_SEQUENTIAL_SCAN,
    0);
  if (hfstore== INVALID_HANDLE_VALUE)
  {
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
 
  z = headerl;
  e = WriteFile(hfstore, (void *)cptr, z, &zz, NULL);
  if ((e == 0) || (z != zz))
  {
    CloseHandle(hfstore);
    DeleteFile(filename);
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
  z = width*height*2;
  e = WriteFile(hfstore, (void *)buf, z, &zz, NULL);
  if ((e == 0) || (z != zz))
  {
    CloseHandle(hfstore);
    DeleteFile(filename);
    GlobalUnlock(hb1);
    GlobalFree(hb1);
    return (NOFILE);
  }
 
  CloseHandle(hfstore);
  GlobalUnlock(hb1);
  GlobalFree(hb1);
  return (NOERR);
}

 ho cercato un ng sulle sdk ma in italiano non l'ho trovato
it.comp.programmare.win32, ad esempio.
-- 
   |   \    \  | ___|_  |_  | ianezz a casa sua... :-)
   |  _ \  | \ | _|    /   /  Visita il LinuxTrent a
  _|_/  _\_|  _|____|___|___| 
http://www.linuxtrent.it

   SetFilePointer(hfread, headerl, NULL, FILE_BEGIN);
Assumendo che fsize sia la dimensione in byte del file, e che headerl 
sia la dimensione in byte dell'header, z dovrebbe essere la lunghezza in 
byte dei dati.


grazie, faccio subito un post.

 byte dei dati.
cioè intendi che ma matrice in cui ReadFile va a scrivere è dati[z] (di dimensione z?)