Salta al contenuto
  • Categorie
  • Recenti
  • Tag
  • Popolare
  • Utenti
  • Gruppi
Collassa
Logo del marchio
  1. Home
  2. Elettronica e Programmazione
  3. Programmazione
  4. Problema con interi in un array di char

Problema con interi in un array di char

Pianificato Fissato Bloccato Spostato Programmazione
2 Post 0 Autori 1.5k Visualizzazioni
  • Da Vecchi a Nuovi
  • Da Nuovi a Vecchi
  • Più Voti
Rispondi
  • Risposta alla discussione
Effettua l'accesso per rispondere
Questa discussione è stata eliminata. Solo gli utenti con diritti di gestione possono vederla.
  • L Non in linea
    L Non in linea
    Le085
    scritto su ultima modifica di
    #1

    Devo fare una funzione che mi inserisce dei dati in un array di char (che poi invierò su seriale)

    ciò che devo fare è questo

    | T | P | 2 ¦ 3 | ....

    in pratica nelle prime due posizioni ci sono dei caratteri, mentre nelle due seguenti ci devo mettere un intero di due byte (uno short).

    altrove.. unsigned char tempoMsg[9];

    createTempoMsg(tempoMsg)

    void createTempoMsg(unsigned char tempoMsg[])

    {

    tempoMsg[0]=T_SIGN;

    tempoMsg[1]=P_SIGN;

    unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[2]);

    *tempoMsgLength=6;

    ...

    }

    facendo così però mi va a modificare tempoMsg[1] e ci mette 6;

    Ho scoperto quindi che shiftando tutto di 1 e quindi scrivendo:

    unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[3]);

    lo mette al posto giusto: ciò vuol dire che il puntatore punta all'ultima cella di memoria e non alla prima? che arcano è mai questo? ha a che fare con il big endian?

    il problema è che seguendo questa logica (ovvero che i puntatori puntano all'ultima cella, il resto del programma non va e vado a leggere celle di memorie non valide...

    idee?

    PS: sto compilando con un gcc per piattaforme ARM con linux

    1 Risposta Ultima Risposta
    0
    • L Non in linea
      L Non in linea
      Le085
      scritto su ultima modifica di
      #2

      Devo fare una funzione che mi inserisce dei dati in un array di char (che poi invierò su seriale)

      ciò che devo fare è questo

      | T | P | 2 ¦ 3 | ....

      in pratica nelle prime due posizioni ci sono dei caratteri, mentre nelle due seguenti ci devo mettere un intero di due byte (uno short).

      altrove.. unsigned char tempoMsg[9];

      createTempoMsg(tempoMsg)

      void createTempoMsg(unsigned char tempoMsg[])

      {

      tempoMsg[0]=T_SIGN;

      tempoMsg[1]=P_SIGN;

      unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[2]);

      *tempoMsgLength=6;

      ...

      }

      facendo così però mi va a modificare tempoMsg[1] e ci mette 6;

      Ho scoperto quindi che shiftando tutto di 1 e quindi scrivendo:

      unsigned short* tempoMsgLength=(unsigned short*)(&tempoMsg[3]);

      lo mette al posto giusto: ciò vuol dire che il puntatore punta all'ultima cella di memoria e non alla prima? che arcano è mai questo? ha a che fare con il big endian?

      il problema è che seguendo questa logica (ovvero che i puntatori puntano all'ultima cella, il resto del programma non va e vado a leggere celle di memorie non valide...

      idee?

      PS: sto compilando con un gcc per piattaforme ARM con linux

      1 Risposta Ultima Risposta
      0
      • L Non in linea
        L Non in linea
        Le085
        scritto su ultima modifica di
        #3

        Dopo quasi 24h di sbattimenti ho capito che il cast dei puntatori non si può fare, perché non funziona come su windows...

        la funzione memcpy invece funziona, usero quella

        1 Risposta Ultima Risposta
        0

        Ciao! Sembra che tu sia interessato a questa conversazione, ma non hai ancora un account.

        Stanco di dover scorrere gli stessi post a ogni visita? Quando registri un account, tornerai sempre esattamente dove eri rimasto e potrai scegliere di essere avvisato delle nuove risposte (tramite email o notifica push). Potrai anche salvare segnalibri e votare i post per mostrare il tuo apprezzamento agli altri membri della comunità.

        Con il tuo contributo, questo post potrebbe essere ancora migliore 💗

        Registrati Accedi
        Rispondi
        • Risposta alla discussione
        Effettua l'accesso per rispondere
        • Da Vecchi a Nuovi
        • Da Nuovi a Vecchi
        • Più Voti


        • Accedi

        • Non hai un account? Registrati

        • Accedi o registrati per effettuare la ricerca.
        Powered by NodeBB Contributors
        • Primo post
          Ultimo post
        0
        • Categorie
        • Recenti
        • Tag
        • Popolare
        • Utenti
        • Gruppi