0

構造のアライメントに問題があります。私が何をしても、コンパイラは構造体の2つのフィールドの間にバイトを挿入するようです。これは出力のサンプルです

 4  +j 4    +++       40004    .........    4 
 5  +j 5    +++       50005    .........    5 
 6  +j 6    +++       60006    .........    6 
 7  +j 7    +++       70007    .........    7 
 8  +j 8    +++       80008    .........    8 
 9  +j 9    +++       90009    .........    9 

バイト00は、H構造体のreフィールドとimフィールドの間に挿入されます。コンパイラがHに対してこれを実行するのを停止して、ポインタpWがポインタpWを介して両方のフィールドを32ビットとして読み取ることができるようにするにはどうすればよいですか?

たぶん、3D配列のサイズを変更する必要があります。配列サイズを変更せずに方法があれば素晴らしいでしょう。

#include <stdio.h>
#include <stdlib.h>

#define NA 4
#define NS 3
#define NF 5

typedef struct  {
  short re;
  short im;
} cint16 ;

typedef struct 
{
   cint16   H[NRx][NSTS][NFFT];
} AAA;

AAA        H;
AAA *      pH = &H;

int main(void)
{
    int i, j, k, n, m;
    cint16 *    pC;
    int *       pW;

    n = 0;
    for(i=0; i<NA; i++)
    {
        for(j=0; j<NS; j++)
        {
            for(k=0; k<NF; k++)
            {  
                H.H[i][j][k].re = n ;
                H.H[i][j][k].im = n;

                n++;
            }
        }
    }

    pC = &H.H[0][0][0];
    m = 0;
    for(k=0; k<NA; k++)
    {
        for(i=0; i<NS; i++)
        {
            for(n=0; n<NF; n++)
            {
                printf("%02d  ",    pC[m].re );
                printf("+j%02d,",   pC[m].im );
                printf("     ");
                m++;
            }
            printf("\n"); 
        }    
    }

    printf("\n\n");

    pW = (int *)&H.H[0][0][0];
    pC = &H.H[0][0][0];
    m = 0;
    for(k=0; k<NA*NS*NF; k++)
    {
        printf("%2X  ",   pC[m].re );
        printf("+j%2X",   pC[m].im );
        printf("    +++       ");
        printf("%X  ",   pW[m] );

        printf("  .........    %d \n", m);

        m++;
    }


    exit (0);
}
4

2 に答える 2

1

出力を誤って解釈します。

printf("%X  ",   pW[m] );

構造体の4バイトをunsigned int16進表現で出力します

    4|00|04

最初のバイトは、 (エンディアンに依存するかどうかに関係なく)の上位バイトに対応する構造体メンバーの1つの非ゼロバイトからのものであり、次の42バイトは、他のメンバーの2バイトからのものです。unsigned intreim0004

メンバー間にバイトは挿入されません。先行ゼロが抑制されているため、1バイト(および1ニブル)が出力されません。

于 2013-03-27T10:46:20.910 に答える
0

使用しているコンパイラによって異なります。GCCにはがあり__attribute__ ((__packed__))、VC++にはがあり#pragma packます。

SOには、それらの使用方法を示す重複する質問がおそらくたくさんあります。


また、警告のわずかな注意:32ビット整数を使用して2つの16ビット値にアクセスすることは、基盤となるプラットフォームのバイト順序に大きく依存します。たとえば、この構造をインターネット経由またはファイルで送信する場合は、正しく変換する必要があります。

于 2013-03-27T10:42:05.037 に答える