Newsgroup: it.comp.os.linux.development
Titolo: Inserire un array di int in una stringa

Salve NG,
Devo comunicare con un programma ad un altro meditante una coda di messaggi.
Ho creato una struttura che passo mediante la coda, dove ci ho messo
qualche variabile a mio uso e costume:
struct SendMsg  {                       //struttura per l'invio di messaggi
        long mtype;
        pid_t PID;
        int msgtipo;
        uid_t uid;
        gid_t gid;
        char path[MAXPATH];
};
Siccome devo inviare degli interi, pensavo di mettere nella struttura anche
un array di int, ma a volte mi basta un array, a volte 2 e a volte 6. A
volte mi basta solo un intero ecc. Comunque sempre con interi ho a che
fare. Per evitare di inserire nella struttura tutte le variabili di cui ho
bisogno, tipo:
struct SendMsg  {
        long mtype;
        int array1[255];
        int array2[255];
        int array3[255];
        int array4[255];
        int array5[255];
        int array6[255];
        int intero1;
        int intero2;
        int intero3;
        int intero4;
        pid_t PID;
        int msgtipo;
        uid_t uid;
        gid_t gid;
        char path[MAXPATH];
};
Pensavo di fare qualcosa mettendo le variabili che mi servono in una
stringa, con delle virgole che mi separano i campi, il tutto per evitare di
creare un mega struttura con tutto gia' dentro da mandare a spasso con le
code di messaggi. O forse sto' sognando ed e' meglio la struttura grossa?
Grazie, Nicola.
-- 
chi va pian va san e va lontan

 che fare. 
Conviene così:
        struct SendMsg  {
                ...
                int array_size; // 0...255
                int array[255];
                ...
        };
Dopo di che per popolare l'array fai:
        SendMsg m;
        ...
        for( int i = 0; i < N; ++i )
                m.array[ i ] = ...;
        m.array_size = N;
        ...
Per usarlo fai
        SendMsg m;
        ...
        for( int i = 0; i < m.array_size; ++i )
                // Use m.array[ i ]
Ciao...
-- 
---
*************** | Have you ever retired a human by mystake?
*** Azathot *** |
*************** | To contact me, ask me gently. Thanks.

Ciao, NicoKid!
Il giorno 19/08/2003 alle ore 12:28 hai scritto:
 N> Pensavo di fare qualcosa mettendo le variabili che mi servono in una
 N> stringa, con delle virgole che mi separano i campi, il tutto per evitare
 N> di creare un mega struttura con tutto gia' dentro da mandare a spasso
 N> con le code di messaggi. O forse sto' sognando ed e' meglio la struttura
 N> grossa?
Puoi anche creare diverse strutture con i componenti dimensionati per
l'utilizzo previsto e aggiungere un campo in testa che indica il tipo di
struttura, cosi' chi riceve il messaggio puo' fare un type casting con il
tipo di struttura utilizzato da chi trasmette.
Bye

Uno Sconosciuto wrote:

Uhmm, alla funzione msgrcv io passo il puntatore a una struttura uguale a
quella che mi ha mandato il messaggio. Come faccio a controllare un campo
della struttura se non so ancora che struttura e' ? 


 
Il problema e' che non ho un solo array, come faccio a distinguere i vari
array tra di loro?
Grazie, Nicola


Ciao, NicoKid!
Il giorno 19/08/2003 alle ore 15:37 hai scritto:
 N> Uhmm, alla funzione msgrcv io passo il puntatore a una struttura uguale
 N> a quella che mi ha mandato il messaggio. Come faccio a controllare un
 N> campo della struttura se non so ancora che struttura e' ?
La testa della struttura sara' sempre uguale per tutte quindi o usi una
struttura qualsiasi o ti fai una struttura con solo la parte iniziale comune
e usi un puntatore a quella.
Esempio:
typedef struct {
  int stype;
} COMMON;
typedef struct {
  int mstype;
  int array1[5];
  ...
} MSGTYPE1;
typedef struct {
  int mstype;
  int array1[5];
  int array2[6];
  ...
} MSGTYPE2;
La COMMON la usi per determinare il tipo di struttura da utilizzare un
seguito.
Bye

 array tra di loro?
O mandi più messaggi o fai un array di array. That's simple. :)
Ciao!


 O mandi più messaggi 
Se volevo fare questo, non avrei nemmeno stressato il NG :)
o fai un array di array. That's simple. :)
Ok, a questo punto sono daccapo: tanto vale fare una struttura completa di
tutto cio' che mi serve :((
Grazie, Nicola.


Uno Sconosciuto wrote:

Ok, ma ho sempre il dubbio che la chiamata msgrcv non funzioni
correttamente:
int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
Ad esempio size_t msgsz sara' sicuramente diverso a seconda della struttura
usata. Non posso tirare a caso il tipo di struttura, salvo che prima arrivi
un messaggio che mi dice: ehi, il prossimo messaggio avra' la struttura
MSGTYPE1. Ma a questa complicazione preferisco un super struct.
Un'altra ipotesi e' che non ho capito cosa intendi per testa della struttura
:O


Ciao, NicoKid!
Il giorno 19/08/2003 alle ore 19:45 hai scritto:
 N> Ok, ma ho sempre il dubbio che la chiamata msgrcv non funzioni
 N> correttamente:
Finche' non provi... comunque sappi che cose del genere sono usate
praticamente ovunque e quindi funzionano perfettamente.
 N> int msgsnd(int msqid, struct msgbuf *msgp, size_t msgsz, int msgflg);
 N>
 N> Ad esempio size_t msgsz sara' sicuramente diverso a seconda della
 N> struttura usata.
Certo, ma che ti importa ? Il casting dovra' farlo chi riceve non chi
trasmette che ovviamente sa gia' cosa deve trasmettere.
 N> Non posso tirare a caso il tipo di struttura, salvo che prima arrivi un
 N> messaggio che mi dice: ehi, il prossimo messaggio avra' la struttura
 N> MSGTYPE1. Ma a questa complicazione preferisco un super struct.
Certo che puoi tirare a caso visto che i primi elementi di tutte le
strutture sono uguali. I primi byte della struttura ti dicono che struttura
e', li analizzi e poi decidi qual'e' quella giusta, non e' necessario avere
un messaggio che ti dica cosa arrivera' dopo (e comunque sarebbe sempre
meglio di una struttura con tutto dentro, pensa solo all'overhead).
 N> Un'altra ipotesi e' che non ho capito cosa intendi per testa della
 N> struttura :O
Quello che sta all'inizio. Ma hai visto l'esempio che ti ho fatto ?
Bye

 all'overhead).
cut..
Ok, faccio una cosa del tipo:
// riceve un messaggio
int msgsz;
int z;
union  {
        struct standard  {
                long mtype;
                pid_t PID;
                int msgtipo;
        } sdtmsg;
        struct tipo1 {
                long mtype;
                pid_t PID;
                int msgtipo;
                int array1[255];
        } tipo1msg;
        struct tipo2 {
                long mtype;
                pid_t PID;
                int msgtipo;
                int array1[255];
                int array2[255];
        } tipo2msg;
}umsg;
 
msgsz = (sizeof umsg) - (sizeof (long));
z = msgrcv(msqid, &UnAnyMsg.msg, msgsz, 1, IPC_NOWAIT | MSG_NOERROR);
if( z == -1 && errno == ENOMSG)  {
        return(0);              //ritorno se non c'e' nessun messaggio
}
if( z == -1)  {
        return(-1);
}
// verifico che tipo di struttura e'
if( umsg.sdtmsg.msgtipo = 1) {
        printf("tipo standard");
}
if( umsg.sdtmsg.msgtipo = 2) {
        printf("Array1[0] vale: %d",umsg.tipo1msg.array1[0]);
}
if( umsg.sdtmsg.msgtipo = 3) {
        printf("Array1[0] vale: %d",umsg.tipo2msg.array1[0]);
        printf("Array2[0] vale: %d",umsg.tipo2msg.array2[0]);
}
Questa roba dovrebbe andare (poi la provo). Prima controllo msgtipo che e'
presente in tutte e 3 le strutture, poi in base a cosa vale mi scelgo la
mia struttura. E' esatto?


Ciao, NicoKid!
Il giorno 20/08/2003 alle ore 19:15 hai scritto:
 N> Questa roba dovrebbe andare (poi la provo). Prima controllo msgtipo che
 N> e' presente in tutte e 3 le strutture, poi in base a cosa vale mi scelgo
 N> la mia struttura. E' esatto?
A occhio e croce dovrebbe andare, anche se non ho capito perche' dalla
sizeof della union togli il sizeof di un long.
Bye

Uno Sconosciuto wrote:

da man msgrcv:
The argument msgsz specifies the maximum size in bytes for  the  member
mtext of the structure pointed to by the msgp argument.
Il messaggio tipo e'
struct msgbuf {
       long mtype;     /* message type, must be > 0 */
       char mtext[1];  /* message data */
};
In non so quale libro ho letto che il messaggio deve avere questo tipo di
struttura "tipo", ovvero avere almeno il campo mtype e che non viene
considerato nel calcolo di msgsz. Infatti la man page dice solo di
calcolare mtext, che dovrebbe contenere tutto il resto della struttura.
Quindi dal calcolo totale cavo il long di mtype. Ovviamente tutto IMHO.
