Help C

Software e hardware per OS4.x

Help C

Messaggioda ilbarbax » lun feb 11, 2013 8:02 pm

Purtroppo non ho mai approciato il C ed infatti sto programmando con Hollywood!!
Ho trovato nella documentazione dell'sdk la struttura dei file gui.prefs, ma non riesco a determinare il corretto n. di caratteri per le assegnazioni delle variabili in C per ULONG, UBYTE, UWORD. Mi sapete indicare quanto sono?
Io so (aprendo direttamente i files gui.prefs) che gp_MenuBackfill è in posizione 70
LONG gp_Reserved[4]; /* System reserved */
UWORD gp_Version; /* Version of the GUIPrefs structure */
ULONG gp_GlobalFlags; /* Global control flags */
ULONG gp_ScreenFlags; /* Screen control flags */
UBYTE gp_STitlePos; /* Position of screen title */
UBYTE gp_STitlebarHIncr; /* Increment to screen titlebar height */
UWORD gp_MenuType; /* PULLDOWN, POPUP or RELATIVE */
UWORD gp_MenuStyle; /* SQUARE, ROUNDED... */
ULONG gp_MenuFlags; /* MENUSHADOW, MENUTRANSP... */
TEXT gp_MenuBackfill[256]; /* Menu backfill

ma combinando le differenti possibili lunghezze per i vari tipi di variabili, non riesco ad arrivare a 70 in nessun caso.
Se il file ha una struttura fissa, e se le lunghezze sono assegnate, dovrei ritrovare il famoso 70, altrimenti non ho capito n'a mazza!
SAM 460 OS4.1 - IBM Thinkpad + Icaros - Mac Mini 1,42 MOS registrato - A1200 030 OS3.5
Avatar utente
ilbarbax

Maestro
 
Messaggi: 643
Iscritto il: lun ott 05, 2009 10:23 pm
Località: Camogli GE

Re: Help C

Messaggioda clros » lun feb 11, 2013 11:55 pm

Non ho capito...cosa devi fare esattamente?

Cmq, se non ricordo male, le "dimensioni" di quei tipi dovresti trovarle in exec/types.h

Ma, abbastanza intuitivamente:

BYTE/UBYTE = 8 bit
WORD/UWORD = 16bit
LONG/ULONG = 32 bit
Only AMIGA makes it possible !!
La colpa è sempre del Kernel!!
...un bit è formato da 8 byte...

Claudio "CP" La Rosa
Avatar utente
clros

Supremo
 
Messaggi: 3473
Iscritto il: ven mag 07, 2004 2:41 pm
Località: SYS 64738

Re: Help C

Messaggioda ilbarbax » mar feb 12, 2013 10:02 am

clros ha scritto:Non ho capito...cosa devi fare esattamente?

Cmq, se non ricordo male, le "dimensioni" di quei tipi dovresti trovarle in exec/types.h

Ma, abbastanza intuitivamente:

BYTE/UBYTE = 8 bit
WORD/UWORD = 16bit
LONG/ULONG = 32 bit


con quella configurazione si arriva a 164!!!

{ pos lg
LONG gp_Reserved 0 4
UWORD gp_Version; 4 32
ULONG gp_GlobalFlags; 36 16
ULONG gp_ScreenFlags; 52 16
UBYTE gp_STitlePos; 68 8
UBYTE gp_STitlebarHIncr; 76 8
UWORD gp_MenuType; 84 32
UWORD gp_MenuStyle; 116 32
ULONG gp_MenuFlags; 148 16
TEXT gp_MenuBackfill 164 256

Sicuramente mi sfugge qualcosa

PS scusate per l'incolonnamento che va a farsi f.. comunque la prima colonna numerica è la posizione
SAM 460 OS4.1 - IBM Thinkpad + Icaros - Mac Mini 1,42 MOS registrato - A1200 030 OS3.5
Avatar utente
ilbarbax

Maestro
 
Messaggi: 643
Iscritto il: lun ott 05, 2009 10:23 pm
Località: Camogli GE

Re: Help C

Messaggioda pvanni » mar feb 12, 2013 10:35 am

C'è qualcosa che mi sfugge nei tuoi calcoli, se quanto hai postato è corretto in base
a quanto detto da Claudio a me risulta:
LONG gp_Reserved 0 (4 * 4 = 16)
UWORD gp_Version; 17 2
ULONG gp_GlobalFlags; 19 4
ULONG gp_ScreenFlags; 23 4
UBYTE gp_STitlePos; 27 1
UBYTE gp_STitlebarHIncr; 28 1
UWORD gp_MenuType; 29 2
UWORD gp_MenuStyle; 31 2
ULONG gp_MenuFlags; 33 4
TEXT gp_MenuBackfill 37 256

però potrebbe anche essere che tutto quanto sia allineato a 32 bit
e quindi verrebbe:

LONG gp_Reserved 0 (4 * 4 = 16)
UWORD gp_Version; 17 2 (4)
ULONG gp_GlobalFlags; 21 4
ULONG gp_ScreenFlags; 25 4
UBYTE gp_STitlePos; 29 1(4)
UBYTE gp_STitlebarHIncr; 33 1 (4)
UWORD gp_MenuType; 37 2 (4)
UWORD gp_MenuStyle; 41 2 (4)
ULONG gp_MenuFlags; 44 4
TEXT gp_MenuBackfill 48 256

ma potrebbe anche essere allineato a 16 bit e non ti metto i conti :)
però il tuo assunto che questa struttura inizi all'inizio del file è sbagliato,
perchè sembra in formato IFF (anzi ne sono certo) e quindi ci sono altre informazioni
prima che inizi la struttura incriminata.
Ma non è nemmeno detto che il formato del file rispecchi esattamente la struttura
dato che per leggere questi file ci sono delle funzioni apposite che io non sò
cosa facciano.
Avatar utente
pvanni

Eroe
 
Messaggi: 914
Iscritto il: lun set 27, 2004 1:29 pm
Località: Lecco

Re: Help C

Messaggioda clros » mar feb 12, 2013 10:39 am

pvanni ha scritto:C'è qualcosa che mi sfugge nei tuoi calcoli, se quanto hai postato è corretto in base
a quanto detto da Claudio a me risulta:
LONG gp_Reserved 0 (4 * 4 = 16)
UWORD gp_Version; 17 2
ULONG gp_GlobalFlags; 19 4
ULONG gp_ScreenFlags; 23 4
UBYTE gp_STitlePos; 27 1
UBYTE gp_STitlebarHIncr; 28 1
UWORD gp_MenuType; 29 2
UWORD gp_MenuStyle; 31 2
ULONG gp_MenuFlags; 33 4
TEXT gp_MenuBackfill 37 256

Anche a me veniva lo stesso valore

però potrebbe anche essere che tutto quanto sia allineato a 32 bit
e quindi verrebbe:


Già, è vero! Non pensavo agli allineamenti!
@ilbarbax: non ho capito perchè ti serve sapere esattamente dove inizia quel campo...nella stragrande maggioranza dei casi, non te ne dovrebbe fregare niente!
Only AMIGA makes it possible !!
La colpa è sempre del Kernel!!
...un bit è formato da 8 byte...

Claudio "CP" La Rosa
Avatar utente
clros

Supremo
 
Messaggi: 3473
Iscritto il: ven mag 07, 2004 2:41 pm
Località: SYS 64738

Re: Help C

Messaggioda afxgroup » mar feb 12, 2013 11:04 am

non date le cose per scontato.. e non date i numeri..
ma usate sizeof().. esiste per quello..
Elf.library.. a noi due....
The BUG Hunter.. +1..
AMIGAONE - SAM - MOANA - A1200 - A600 - A500 - C64
Avatar utente
afxgroup

Admin
 
Messaggi: 3647
Iscritto il: ven giu 11, 2004 9:49 am
Località: Taranto

Re: Help C

Messaggioda ilbarbax » mar feb 12, 2013 12:09 pm

Lo so che nelle librerie C ci sono delle funzioni dedicate per tirare fuori i dati e che quindi garantiscono la compatibilità tra versioni differenti bla bla bla.

Purtroppo io sto usando Hollywood e non ha tali librerie ovviamente. Tutto quello che ho è un file che posso aprire e vedere carattere per carattere. Ne ho guardati diversi di questi file ed ho riscontrato la ricorrenza della posizione all'interno dei file per diverse info. Quindi mi fa pensare che abbiano una struttura fissa, cosa confermata dal file gui.h in sdk da cui ho estrapolato la lista riportata sopra.
A questo punto, visto che sono differenti altre le info che dovrei tirare fuori stavo cercando, nella mia ignoranza, di ricavare lo schema in termini di posizione di caratteri.
E quì mi sono impantanato!

Il progetto a cui sto lavorando è un editor di temi, sono ad un buon punto per quanto riguarda i temi basati prevalentemente su bitmaps, mentre per quelli basati sui gui.prefs, sono nella bratta (penso sia un termine genovese che indica fango)...
SAM 460 OS4.1 - IBM Thinkpad + Icaros - Mac Mini 1,42 MOS registrato - A1200 030 OS3.5
Avatar utente
ilbarbax

Maestro
 
Messaggi: 643
Iscritto il: lun ott 05, 2009 10:23 pm
Località: Camogli GE

Re: Help C

Messaggioda afxgroup » mar feb 12, 2013 12:15 pm

si ma ti fai un programmino scemo in c che con 2 righe di codice ti fa quello che stai facendo tu ora. E sei sicuro al 100%. alla fine è un printf che devi fare..e basta
Elf.library.. a noi due....
The BUG Hunter.. +1..
AMIGAONE - SAM - MOANA - A1200 - A600 - A500 - C64
Avatar utente
afxgroup

Admin
 
Messaggi: 3647
Iscritto il: ven giu 11, 2004 9:49 am
Località: Taranto

Re: Help C

Messaggioda TheKaneB » mar feb 12, 2013 1:00 pm

Codice: Seleziona tutto
unsigned int offsetDelCampo = (unsigned int)(&((TipoStruct*) 0)->nomeCampo);
printf("Offset = %d \n", offsetDelCampo);


In teoria, non ho testato, con queste due righe di C dovresti ricavare l'offset corretto di un campo all'interno di una struct. Immagino che in gui.h ci sia una struct con allineamento packed che serve a leggere l'header di quel tipo di files.

In particolare, la prima riga fa sì che il compilatore calcoli l'offset basandosi sulla dimensione, il packing e l'allineamente EFFETTIVI della struct, quindi non bisogna tirare ad indovinare.

EDIT:
Ad ogni modo, è possibile che nell'header del file ci siano più strutture in numero variabile, quindi il valore ricavato dovrà essere trattato di conseguenza. Ad esempio in un file video solitamente ci sono diversi header per ogni componente dello stream (canali video, canali audio, sottotitoli) e quindi diverse strutture i cui offset dipendono da un altro header più generale.
Immagine
Avatar utente
TheKaneB

Eroe
 
Messaggi: 2218
Iscritto il: sab mar 27, 2010 2:17 am
Località: Milano

Re: Help C

Messaggioda ilbarbax » mar feb 12, 2013 3:21 pm

@TheKaneB

se volevi confondermi del tutto ci sei riuscito!

Ok mi sembra che il mio approccio sia sconsigliato (anche su amigsns mi hanno dato lo stesso responso suggerendomi di usare IIntition->GetGUIAttrs() and IIntuitio->SetGUIAttrs()), anche se mi piaceva di più.
Quindi si potrebbe procedere con le due famose righe di C utilizzando i suddetti comandi per realizzare un eseguibile che posso lanciare da hollywood e magari mi scrive il risultato in un file txt in ramdisk da cui posso prendermi il dato di ritorno (non penso che sia possibile ottenere il dato di ritorno direttamente da hollywood).
Comunque sia per fare ciò dovrò provar"C"i!
Ma suppongo che sto ormai famoso getguiattr() vada a pescare dai parametri in uso al momento nel settaggio del wb, mentre io debbo pescarli da un file memorizzato altrove. Qualcuno sa confermarmi ciò o indirizzarmi su della documentazione al riguardo?

PS se siete iteressati a darmi qualche suggerimento più calzante su come indirizzare lo sviluppo del programma, mandatemi un pm che vi mando quello che ho fatto sino ad ora per commenti e suggerimenti.
SAM 460 OS4.1 - IBM Thinkpad + Icaros - Mac Mini 1,42 MOS registrato - A1200 030 OS3.5
Avatar utente
ilbarbax

Maestro
 
Messaggi: 643
Iscritto il: lun ott 05, 2009 10:23 pm
Località: Camogli GE

Re: Help C

Messaggioda afxgroup » mar feb 12, 2013 3:58 pm

Codice: Seleziona tutto
#include <stdio.h>

#if (defined(__GNUC__) && defined(__CHAR_UNSIGNED__)) || (defined(__SASC) && defined(_UNSCHAR))
typedef          char TEXT; /* Non-negative character */
#else
typedef unsigned char TEXT; /* Non-negative character */
#endif

typedef long            LONG;     /* signed 32-bit quantity */
typedef unsigned long   ULONG;    /* unsigned 32-bit quantity */
typedef unsigned long   LONGBITS; /* 32 bits manipulated individually */
typedef short           WORD;     /* signed 16-bit quantity */
typedef unsigned short  UWORD;    /* unsigned 16-bit quantity */
typedef unsigned short  WORDBITS; /* 16 bits manipulated individually */
typedef signed char     BYTE;     /* signed 8-bit quantity */
typedef unsigned char   UBYTE;    /* unsigned 8-bit quantity */
typedef unsigned char   BYTEBITS; /* 8 bits manipulated individually */
typedef unsigned short  RPTR;     /* signed relative pointer */

#pragma pack(2)
struct GUIPrefsNotAlign
{
    LONG     gp_Reserved[4];                /* System reserved                        */
    UWORD    gp_Version;                    /* Version of the GUIPrefs structure      */
    ULONG    gp_GlobalFlags;                /* Global control flags                   */
    ULONG    gp_ScreenFlags;                /* Screen control flags                   */
    UBYTE    gp_STitlePos;                  /* Position of screen title               */
    UBYTE    gp_STitlebarHIncr;             /* Increment to screen titlebar height    */
    UWORD    gp_MenuType;                   /* PULLDOWN, POPUP or RELATIVE            */
    UWORD    gp_MenuStyle;                  /* SQUARE, ROUNDED...                     */
    ULONG    gp_MenuFlags;                  /* MENUSHADOW, MENUTRANSP...              */
    TEXT     gp_MenuBackfill[256];          /* Menu backfill picture path             */
};

struct GUIPrefsAlign
{
    LONG     gp_Reserved[4];                /* System reserved                        */
    UWORD    gp_Version;                    /* Version of the GUIPrefs structure      */
    ULONG    gp_GlobalFlags;                /* Global control flags                   */
    ULONG    gp_ScreenFlags;                /* Screen control flags                   */
    UBYTE    gp_STitlePos;                  /* Position of screen title               */
    UBYTE    gp_STitlebarHIncr;             /* Increment to screen titlebar height    */
    UWORD    gp_MenuType;                   /* PULLDOWN, POPUP or RELATIVE            */
    UWORD    gp_MenuStyle;                  /* SQUARE, ROUNDED...                     */
    ULONG    gp_MenuFlags;                  /* MENUSHADOW, MENUTRANSP...              */
    TEXT     gp_MenuBackfill[256];          /* Menu backfill picture path             */
} __attribute__((aligned(32)));
#pragma pack()

int main(int argc, char **argv) {
   struct GUIPrefsAlign a;
   struct GUIPrefsNotAlign b;
   printf("sizeof GUIPrefsAlign = %d\n", sizeof(a));
   printf("sizeof GUIPrefsNotAlign = %d\n", sizeof(b));

   unsigned int gp_MenuFlagsAlign = offsetof(struct GUIPrefsAlign, gp_MenuFlags);
   printf("Offset gp_MenuFlags GUIPrefsAlign = %d \n", gp_MenuFlagsAlign);
   unsigned int gp_MenuFlagsNotAlign = offsetof(struct GUIPrefsNotAlign, gp_MenuFlags);
   printf("Offset gp_MenuFlags GUIPrefsNotAlign = %d \n", gp_MenuFlagsNotAlign);
   return 0;
}


EDIT
Su cygwin (non ho os4 qui ora) ricevo:

sizeof GUIPrefsAlign = 320
sizeof GUIPrefsNotAlign = 292
Offset gp_MenuFlags GUIPrefsAlign = 32
Offset gp_MenuFlags GUIPrefsNotAlign = 32
Elf.library.. a noi due....
The BUG Hunter.. +1..
AMIGAONE - SAM - MOANA - A1200 - A600 - A500 - C64
Avatar utente
afxgroup

Admin
 
Messaggi: 3647
Iscritto il: ven giu 11, 2004 9:49 am
Località: Taranto


Torna a Amiga OS 4.x

Chi c’è in linea

Visitano il forum: Nessuno e 18 ospiti