Visualizzazione dei risultati da 1 a 6 su 6
  1. #1

    [c] Struttura e intero in un'unico buffer

    Salve mi scuso con i moderatori perchč questa domanda č sostanzialmente una riformulazione di quella che ho giā fatto ([c & DDK - due parametri a un driver]).La riformulo cercando di focalizzarla sulla parte del problema che realmente non riesco a risolvere perchč mi sono reso conto che probabilmente il tema driver non č familiare a molti (me compreso...) e anche chi potrebbe aiutarmi non la considera nemmeno perchč pensa di non essere ferrato in materia...speriamo bene...perchč fin'ora zero risposte,ad ogni modo se i moderarori vogliono cancellare l'altra discussione nessun problema da parte mia.

    Venendo al dunque:io ho una funzione che prende un puntatore a void contenente tutti i dati che le servono accodati l'uno dietro all'altro e un intero che gli indica la dimensione totale dei dati.Dall'esterno io devo riuscire a costruire appunto un buffer in cui siano accodati di seguito una struttura con vari campi ed un intero,passare il buffer alla mia funzione, e all'interno della funzione riuscire ad estrarre i dati dal buffer sapendo giā come sono strutturati al suo interno (cioč se venga prima la struttura o l'intero e quanto č grande la struttura).
    Per farlo ho operato cosė:

    codice:
    //costruzione del buffer:
    
    Mystruct struct;
    
    ...........
    
    char* data = (char*)malloc(sizeof(MyStruct) + sizeof(int));
    //if(!data)
     	.......
    
    memcpy (data,&struct, sizeof(MyStruct));
    memcpy (data + sizeof(MyStruct),&MyInt, sizeof(int));
    
    
    //estrazione dati dal buffer all'iterno della funz:
    
    
    void MyFunct(void * buff,int dataSize)
    {
    	.............
    	Mystruct *struct;
    	int *pMyInt;
    	struct = (MyStruct *)buff;
    	buff+=sizeof(Mystruct); ///<-------- il compilatore si arrabbia
    	pMyInt = (int*)buffr;
    	
    	//alla fine della fiera *pMyInt e struct->questo,struct->quell'altro...dovrebbero
    	//contenee i dati che mi servono
    
    
    }

    -Il problema č che il compilatore non č d'accordo con me su quell'incremento del
    puntatore a void,mi dice che non conosce la dimensione.
    -Per la costruzione del buffer invexce non mi da problemi (almeno in compilazione poi si vedrā)
    -C'č da dire anche che io questo codice lo devo inserire,la parte di sotto in un driver scritto in c e quindi tutto ok,ma la parte di sopra in un'applicazione scritta in C++ usando le MFC,cioč all'interno di un metodo,e non č il massimo inserire istruzioni prettamente C come memcpy o malloc in un programma in C++.

    Quindi se qualcuno sapesse dirmi come risolvere il mio problema di trasferimento di dati in maniera semplice ed elegante glie ne sarei mooolto grato.


    PS.Non suggeritemi una cosa ovvia come :"perchč non scrivi Myfunct in modo che i dati li prenda separatemente in vari parametri e non accorpati in un'unico buffer?",semplicemente perchč MyFunct č una chiamata di sistema che si usa cosė e basta.

    Thanks,ciao
    Il centro dell'attenzione non č sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  2. #2
    Utente di HTML.it L'avatar di MMarzia
    Registrato dal
    Mar 2001
    Messaggi
    1,781

    Re: [c] Struttura e intero in un'unico buffer

    Originariamente inviato da unomichisiada
    Salve mi scuso con i moderatori perchč questa domanda č sostanzialmente una riformulazione di quella che ho giā fatto ([c & DDK - due parametri a un driver]).La riformulo cercando di focalizzarla sulla parte del problema che realmente non riesco a risolvere
    allora chiudo l'altra
    io sono festosamente cicciottello :: e. cartman

    t'amo senza sapere come, nč quando nč da dove,
    t'amo direttamente senza problemi nč orgoglio:
    cosė ti amo perchč non so amare altrimenti

  3. #3
    Per il problema con il puntatore a void credo tu debba convertirlo in qualche altro formato per poter effettuare operazioni. Io ho trovato questo. Non so se possa esserti utile.

    In ANSI C void* also appears and means something quite different to plain void. Plain void indicates the absence of data. void* indicates the address of some data of unknown type. It is only used for formal arguments of functions. This functions can be written to use any type of data. An example is qsort in the standard C library. But a void* points at objects of unknown size, so pointer arithmetic is not defined on them. So void* arguments can not have subscripts and the * operator is undefined on them! Instead the size of the data is put in a different argument and, internally, the void* pointer is cast into a char* and all access to the objects is done using the explicit size and memory copy functions.

    prova a fare cosė e vedere se funziona:
    codice:
    void MyFunct(void * buff,int dataSize)
    {
    (char *)new_buf = (char *)buff;
    // e usi new_buf per le operazioni all'interno della funzione
    ...
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

  4. #4
    Originariamente inviato da AnĒkin
    Per il problema con il puntatore a void credo tu debba convertirlo in qualche altro formato per poter effettuare operazioni. Io ho trovato questo. Non so se possa esserti utile.
    prova a fare cosė e vedere se funziona:
    codice:
    void MyFunct(void * buff,int dataSize)
    {
    (char *)new_buf = (char *)buff;
    // e usi new_buf per le operazioni all'interno della funzione
    ...
    per convertire un puntatore da void ad un altro tipo non c'č bisogno di crearne un'altro...basta fare cosi':
    codice:
    void MyFunct(void * buff,int dataSize){
    buff = (char *);
    
    // e usi new_buf per le operazioni all'interno della funzione
    ...
    prova cosi'...dovrebbe andare per la conversione(č la stessa cosa che si fā x malloc/calloc ad es )

    Vediamo..sogni che diventano professione...passioni che diventano vita... Free as in Freedom...

  5. #5
    Ok grazie ad entrambi,in un prog di prova in c funziona,ora bisogna vedere se mi funge nel driver.

    Questo non si puō fare Andrea_Net:
    buff = (char *);

    almeno non col mio compilatore (dev-c++),cmq grazie lo stesso.

    Su un'alternativa pių c++ oriented rispetto a malloc e memcpy per costruire il buffer e riempirlo sapete dirmi qualcosa?
    Il centro dell'attenzione non č sempre un buon posto in cui trovarsi

    Mai discutere con uno stupido, la gente potrebbe non capire la differenza. (O. W.)

  6. #6
    Originariamente inviato da unomichisiada
    Ok grazie ad entrambi,in un prog di prova in c funziona,ora bisogna vedere se mi funge nel driver.

    Questo non si puō fare Andrea_Net:
    buff = (char *);

    almeno non col mio compilatore (dev-c++),cmq grazie lo stesso.

    Su un'alternativa pių c++ oriented rispetto a malloc e memcpy per costruire il buffer e riempirlo sapete dirmi qualcosa?


    secondo me puoi continuare ad usare memcpy, mentre al posto di malloc usa new :
    codice:
    char *data = new char [sizeof( MyStruct ) + sizeof( int )];
    if ( !data ) ...
    dA .. foto di viaggio
    L'esperienza č il tipo di insegnante pių difficile.
    Prima ti fa l'esame, e poi ti spiega la lezione.

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.