Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 字符字符串覆盖其他字符串_C_String_Char_Microcontroller_Avr - Fatal编程技术网

C 字符字符串覆盖其他字符串

C 字符字符串覆盖其他字符串,c,string,char,microcontroller,avr,C,String,Char,Microcontroller,Avr,我正在制作一个程序来构建二进制消息。我使用字符字符串来保存二进制值。因此,我初始化了一组具有默认值的字符字符串。然后我通过运行for循环将它们组合起来,并将它们读入一个大字符串(aismg/ais_数据包)。在我添加msg14Text[]之前,一切都很顺利,然后我正在构建的字符串(aimsg/ais_packet)被缩短,如下所示(即使我没有使用变量)。似乎当我添加msg14Text[]时,它会更改其他字符串之一的值。这可能是内存分配问题吗 守则的一部分: char ais_packet[257

我正在制作一个程序来构建二进制消息。我使用字符字符串来保存二进制值。因此,我初始化了一组具有默认值的字符字符串。然后我通过运行for循环将它们组合起来,并将它们读入一个大字符串(aismg/ais_数据包)。在我添加msg14Text[]之前,一切都很顺利,然后我正在构建的字符串(aimsg/ais_packet)被缩短,如下所示(即使我没有使用变量)。似乎当我添加msg14Text[]时,它会更改其他字符串之一的值。这可能是内存分配问题吗

守则的一部分:

char ais_packet[257];                           //Allokerer array for ais data pakke.
char aismsg[175];                               //Allokerer array for meldingen.
int burst_nr = 1;                               //Indicates with burst it is transmittin (1-7).

char ramp_up[] = "00000000";                    //Ramp up buffer.
char train_seq[] = "010101010101010101010101";  //Training sequence 24 bits of alternating 0-1.s
char hdlc_flag[] = "01111110";                  //HDLC Start and END flag.
char buffer[] = "000000000000000000000000";     //Data packet buffer.
char msgID1[] = "000001";                       //msg. 1.
char msgID14[] ="010100";                       //msg. 14.
char repeat[] = "00";                           //repetert 0 ganger.
char mmsi[] = "000111010110111100110100010101"; //Gir 123456789  som MMSI.
char nav_stat[] = "1111";                       //Gir 15= AIS-SART test, endres til 14 (1110) for aktiv AIS-SART.x'
char rot[] = "10000000";                        //Rate of Turn -128 betyr ikkje tilgjengelig.
char sogBin[] = "1111111111";                   //Tilsvarer 1023 = not available = default.
char pos_acc[] = "0";                           //Posisjonsnøyaktighet over 10m. 1 = under 10m.
char lonBin[] = "0110011110010001101011000000"; // Tilsvarer 181 grader som er default verdi for Longitude.
char latBin[] = "011010000010010000101000000";  // Tilsvarer 91 grader som er default verdi for Latitude.
char cogBin[] = "111000010000";                 //Tilsvarer 3600 = not available = default.
char headingBin[] = "111111111";                //511 = not available = default
char timestamp[] = "111100";                    //Tid siden melding er generert, 60 = default = ts not available.
char spec_man[] = "01";                         //Special manouver 0 = default, 1 = not engaged in special manouver
char spare[] = "000";
char spareMSG14[] = "00";                           //Reserved.
char raim[] = "0";                              //RAIM 0 = not in use.
char comm_state[] = "00011100000000000000";     // First 2bit: Sync state: 3 = no UTC sync = default, 0 = UTC sync. 0011100000000000000
char msg14Text[] = "100100101101111011111100";  //CAUSING TROUBLE!!!!  for AIS melding 14 står "Test" med 6-bit ASCII koding.
该函数的enitre代码可在以下位置找到:

使用msg14Text[]输出ais数据包:

00000000
0000000001010101010101010101010101111110000001000001110101101111001101000101011111100000000011010000000000000110100011000101111000000101100100000100001100101110000100000000110011111000100000011100000000000000001000100110100101111110000000000000000000000000
不带msg14Text[]的ais数据包输出:

00000000
0000000001010101010101010101010101111110000001000001110101101111001101000101011111100000000011010000000000000110100011000101111000000101100100000100001100101110000100000000110011111000100000011100000000000000001000100110100101111110000000000000000000000000
AIS数据包应包含以下变量:

ramp_up[] + train_seq[] + hdlc_flag[] + Datapacket(168bit) + crc(16bit) + hdlc_flag[] + buffer[] + '\0'
“这可能是内存分配问题吗?”

代码中没有显式分配任何内存。请注意,
charrepeat[]=“00”
是静态分配的数组,其大小等于3
char
s的大小,其内容由字符串literal
“00”
初始化

问题很可能是将这些字符串复制到
ais_数据包中
,因为这样做的方式不标准(一个字符接一个字符),这会导致代码难以读取,并且很容易出错:

for(int k=0; k<256; k++)
{
    ...
    if(k==256) // are you sure that value of k will reach 256 ?

for(int k=0;kfor(k=0;k<168;k++){if…else if…}

else if(k==168)
      {
        aismsg[k] = '\0';
        k=0;
      }

这将使(k只是一个想法,但是如果您正在构建二进制消息,为什么不使用实际的二进制而不是字符数组呢?下面是一种在联合内部使用结构对二进制数据进行位打包的方法

// declaration
typedef union
{
     uint32_t packed;
     struct {
         uint16_t  sample1: 12;  // 12 bits long
         uint16_t  sample2: 14;  
             uint16_t  6;            // unused bits
     } data;
} u1;

// instantiation
u1 pack1;

// setting
pack1.data.sample1 = 1234;
//getting
uint16_t newval = pack1.data.sample2;
// setting bit 6 in sample 1
pack1.data.sample1 |= (1 << 6);
// setting lo nibble in sample1 to 0101
pack1.data.sample1 &= 0b11110101;
// getting the whole packed value
uint32_t binmsg = pack1.packed;
//声明
typedef联合
{
uint32未包装;
结构{
uint16_t样本1:12;//12位长
uint16样本2:14;
uint16\u t 6;//未使用的位
}数据;
}u1;
//实例化
u1-pack1;
//背景
pack1.data.sample1=1234;
//得到
uint16_t newval=pack1.data.sample2;
//设置样本1中的位6

pack1.data.sample1 |=(1请创建一个字符串,并将其粘贴到您的问题中。您使用这些字符串作为二进制数据有什么特殊原因吗?