Newsgroup: it.comp.lang.visual-basic
Titolo: [VB 6] Traduzione di un tipo

Scusate la mia solita tiritera. Devo tradurre questo tipo
typedef struct _JunkChunk
{
    DWORD ChunkId;             /* Chunk ID marker (JUNK)*/
    DWORD PaggingSize;         /* Size of the padding in bytes */
    BYTE Padding[ChunkSize];   /* Padding */
} JUNKCHUNK;
trovato su questa pagina
http://netghost.narod.ru/gff/graphics/summary/micriff.htm
ma ho delle difficoltà.
Supponiamo che io faccia così:
Private Type Junk_chunk
    chunkID As integer
    PaggingSize As integer
    Padding As byte
End Type
ho paura che non vada bene, perchè non riesco a capire come "portare"
esattamente quel BYTE Padding[ChunkSize];
Qualche suggerimento?
Denghiu

 End Type
Primo una word č 16bit, quindi una double word č 32.
Poi non so se puoi fare Padding(0 to ChunkSize) perchč credo che VB ci
piazzi qualcosa davanti (ma potrebbe anche funzionare).
Di solito in questi (per fortuna rari) casi ho visto fare:
Private Type Junk_chunk
    chunkID As Long
    PaggingSize As Long
    Padding As String * ChunkSize
End Type
E non chiedermi quali porcate fa VB per non andare in crisi con il fatto che
le stringhe sono internamente Unicode (2 byte per char).
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 le stringhe sono internamente Unicode (2 byte per char).
Ciao Zanna
grazie mille per la risposta.
Dunque, ci sto provando. Il problema č che non gli piace il padding, perchč
mi dice "necessaria espressione costante".
Sono alla ricerca di un escamotage :D
Ciao

le stringhe sono internamente Unicode (2 byte per char).
Quindi lascerei stare le stringhe, visto che BYTE e' un typedef per
char senza segno:
// in windef.h
typedef unsigned char       BYTE; 
In msdn al capitolo
C++ Language Reference   
Fundamental Types
il char (con o senza segno) viene definito lungo 1 byte.
In conclusione muterei la dichiarazione cosi':
Private Type Junk_chunk
    chunkID As Long
    PaggingSize As Long
    Padding (ChunkSize) As Byte
End Type
-- 
ciao, hal

 End Type
Padding(ChunkSize) As Byte da lo stesso problema.
Mi si dice necessaria espressione costante :'(
Ciao e grassie



Ah, ma allora il problema e' un altro!
Ricevi questo messaggio in compilazione vero?
Che cosa e' ChunkSize?
-- 
ciao, hal

Ho provato cosě
Private Type Junk_chunk
     chunkID As Long
     PaggingSize As Long
     Padding () As Byte
End Type
passando l'indice junksize in fase di lettura, ma mi va sempre in errore,
questa volta al momento di leggere...
Ciao<

 Che cosa e' ChunkSize?
Chunksize è un parametro che acquisisco leggendo il file avi.
Non ho ancora capito esattamente se si tratta di un integer o di un long, mi
dà lo stesso valore.
Da qualche parte (qui
http://www.maersk-moller.net/projects/libmpeg2/mpeg2dec/libvo/avilib.c
) ho
trovato questo OUTLONG(njunk);
Ciao

 trovato questo OUTLONG(njunk);
hem me so scordato la seconda parte (che casinista)
in quel docuimento si parla della fase di creazione dell'avi, e ad un certo
punto si determina la quantitŕ di dati da scrivere nel junk (che č un pezzo
di riempimento inserito nell'header dell'avi). bene, questa quantitŕ di dati
č njunk (e quell'n mi richiama le serie, e quindi gli interi). Ma poi
quell'OUTLONG mi confonde...
Ciao



e che dice?
-- 
ciao, hal

dŕ lo stesso valore.
Intendo dire:
* e' dichiarato come costante? *
-- 
ciao, hal

hem me so scordato la seconda parte (che casinista)
vabbe', abbiamo fatto tutti casino, stasera...
sono andato a leggere solo adesso la pagina che avevi dato al primo
post
allora la struttura va dichiarata cosi':
Private Type Junk_chunk
     chunkID As Long
     PaddingSize As Long
     Padding () As Byte
End Type
In esecuzione leggi il valore di quel ChunkSize che in realta' e'
quello che va messo in PaddingSize, quindi ridimensioni l'array al
terzo campo:
Dim jc As JunkChunk
jc.chunkId = <sai_tu_a_che_cosa>
jc.PaddingSize = <valore_che_recuperi_dal_file>
Redim jc.Padding(jc.PaddingSize)
e vai con Dio, vedrai che funziona ;-)
-- 
ciao, haň

 e che dice?
niente, semplicemente esce dalla sub...
ho impostato on error goto Err:
va a Err: ed esce

 e vai con Dio, vedrai che funziona ;-)
ho fatto così
        Dim jc As Junk_chunk
        a = jc.chunkID
        jc.PaddingSize = junk_0_size
        ReDim jc.Padding(jc.PaddingSize)
        b = CStr(jc.Padding)
non va più in errore, ma quel cstr(jc.padding) non va affatto, mi
restituisce una stringa di solo "quadratini"
Esiste un modo per convertire in ASCII? forse non è l'espressione adatta.
Insomma, alcuni software (tipo virtualdub) in quel "junk" mettono la loro
firma. Io vorrei riuscire a leggerla e visualizzarla...
ma sto impazzendo mannaggia :(
In questo caso spezifico ad esempio, junk_0_size = 4120
quindi padding(4120) mi restituisce un array lungo 4120 bytes giusto? o non
ho capito una mazza di quello che sto facendo?
Grazie per la pazienza jal
Ciao

 restituisce una stringa di solo "quadratini"
vero, ma  a = jc.chunkID è una stronzata perchè mi darà sempre zero, quindi
hai ragione tu. Indagherò per sapere, ma credo che sia semplicemente un
contatore che io devo ioncrementare ogni qual volta mi trovo ad aver a che
fare con un "JUBK" chunk..
grassi eper la pazienza
'notte

 Esiste un modo per convertire in ASCII? 
Prova cosě:
StrConv(jc.padding, vbUnicode)
o forse (ma non credo)
StrConv(jc.padding, vbFromUnicode)
Se hai letto la parte giusta dovresti vedere qualcosa, altrimenti prova 
a shiftare la lettura di un byte.
Ciao

 va a Err: ed esce
Ok, ma quando sei su Err (brutto nome per un'etichetta d'errore) puoi 
debuggare l'oggetto Err.
Ciao

 a shiftare la lettura di un byte.
solo quadratini mannaggia  :'(
Ciao

 debuggare l'oggetto Err.
hem
non essendo un professionista, non ho molta padronanza del debug.
Ho impostato su Err: una espressione di controllo, ma non posso mettere un
punto di intrsrruzione.
In ogni caso non mi dice nulla.
Facdendo il controllo immediato mi dice poi "valore 7"
che significa?
Ciao

Bene
ringrazio tutti per la pazienza portata e per la disponibilità mostrata.
Alla fine me ne sono uscito in una maniera non proprio pulita, magari poco
ortodossa, ma che funziona alla grande :D
Ecco come:
'Ho definito così il tipo (non potendo assegnare una larghezza variabile
alla stringa (o non sapendo come fare)
Private Type JunkChunk
    ChunkId As String * 4
    PaddingSize As Long
    Padding As String * 4
End Type
'e questo qui è il ciclo con cui leggo il famoso JUNK (se l'id è "junk")
    If InStr(1, junk_0, "junk", vbTextCompare) <> 0 Then ''
        Seek AviFile, strfHeaderSize + 48
        Get AviFile, , jc
        ci = jc.ChunkId
        js = jc.PaddingSize
        For i = 0 To (jc.PaddingSize / 4) - 2
            Seek AviFile, strfHeaderSize + 60 + 4 * i
            Get AviFile, , sTemp
            jd = jd + sTemp
        Next
        List1.AddItem junk_0 & vbTab & jc.PaddingSize & vbTab & jd
    End If
Tutto qui.
Per chi è incuriosito, può contattarmi per avere il proggo e vedere di che
si tratta :D
Ciao e grassie mille.

 che significa?
Quando ti va in errore il Goto ti salta all'istruzione sucessiva 
all'etichetta.
Metti il breakpoint lě, anche se fosse l'exit sub.
Quando si ferma fai CTRL+G e ci scrivi
? Err.Description <INVIO>
Puoi in alternativa a tutto questo impostare nelle opzioni l'interrompi 
ad ogni errore, cosě ti accorgi di ogni errore che si verifica, anche se 
   "trappato".
Ciao

    "trappato".
Zanna sei davvero estremamente gentile :D
P.S. perchè Err: è un brutto nome per una etichetta di errore?

 P.S. perchè Err: è un brutto nome per una etichetta di errore?
immagino che sia perchè in visual basic esiste già un oggetto con quel nome:
utilizzare lo stesso nome per indicare due entità diverse, anche se a volte
possibile, non è mai una bella cosa, ai fini della leggibilità del codice.
salutoni
sergio

 le stringhe sono internamente Unicode (2 byte per char).
Casomai fossi curioso, su MSDN Library (quella offline, non saprei se anche
online) vai sotto 'Book Excerpts\Win32 API Programming with Visual Basic'
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown