[Hỏi] Vấn đề tách 1 mảng ra 3 mảng

lvdao014

Trứng gà
Anh, chị và các bạn giúp mình việc tách 1 mảng ra thành 3 mảng với! cụ thể là có một mảng như sau:
array[30] = "654321 42.119.173.169 1234", mình muốn tách thành pass_receive[6] ="65431", ip_receive[14]="42.119.173.169", port_receive[4]= "1234" . Nhưng kết quả mình làm không có trúng tí nào hết:5cool_sweat:, mọi người giúp mình với, có nhiêu đó mà đuối với nó quá!
Code:
#include "io430.h"
void init_UART_g2553();
void Send_Char(char chr);
void Print_UART(char *ch);
char array[30] = "654321 42.119.173.169 1234";
char pass_receive[6],ip_receive[14],port_receive[4];
void split_buffer(char *data)  // Xac dinh PASS, IP, PORT tu buffer
{
  char i=0;
//  strcpy(string1, data);
//  strncpy(pass_receive,string1, 6); // copy 6 phan tu cua buffer dua vao pass
//  strncpy(pass_receive,data, 6); // copy 6 phan tu cua buffer dua vao pass
 
 // lấy 6 phần tử đầu tiên của mảng nguồn lưu vào  pass_receive
  for (i=0;i<6;i++)
    {
      pass_receive[i] = *(data+i);
//      *(data+i)=0;
    }
 
 // lấy 14 phần tử tiếp theo của mảng nguồn lưu vào  ip_receive
  for (i=0;i<14;i++)
    {
        ip_receive[i] = *(data+i+7);
    //    *(data+i+7)=0;
    }
 
   // lấy 4 phần tử cuối cùng của mảng nguồn lưu vào  port_receive
  for (i=0;i<4;i++)
    {
      port_receive[i] = *(data+i+22);
    //  *(data+i+22)=0;
    }
  //  erase_buffer();
}
int main( void )
{
  // Stop watchdog timer to prevent time out reset
  WDTCTL = WDTPW + WDTHOLD;
    // Su dung dao dong noi ben trong chip msp430g2553
  BCSCTL1 = CALBC1_1MHZ;
  DCOCTL = CALDCO_1MHZ;
  init_UART_g2553();
while(1)
{
  split_buffer(array);
  Print_UART(" Noi dung cua array : ");
  Print_UART(array);Print_UART("\r\n");
  __delay_cycles(1000000);
  // in ra pass
  Print_UART(pass_receive);Print_UART("\r\n");__delay_cycles(1000000);
  // in ra ip
  Print_UART(ip_receive);Print_UART("\r\n");__delay_cycles(1000000);
  // in ra port
  Print_UART(port_receive);Print_UART("\r\n");__delay_cycles(1000000);
 
}
 
}
 
 
void init_UART_g2553(){
// ======================== UART GPIO ==========================================
  P1SEL = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
  P1SEL2 = BIT1 + BIT2 ;                    // P1.1 = RXD, P1.2=TXD
// ======================== Sour Clock &  =========================================
  UCA0CTL1 |= UCSSEL_2;                    // SMCLK
  UCA0BR0 = 104;                            // 1MHz 9600
  UCA0BR1 = 0;                              // 1MHz 9600
// ======================= .... ================================================
  UCA0MCTL |= (UCBRS0);                    // Modulation UCBRSx = 1
  UCA0CTL1 &= ~UCSWRST;                    // **Initialize USCI state machine**
  IE2 |= (UCA0RXIE);
}
 
void Send_Char(char chr)
{
    while (!(IFG2&UCA0TXIFG));        // USCI_A0 TX buffer ready?
      UCA0TXBUF = chr;                    // load gia tri vao UCA0TXBUF
     
}
 
// ================ Ham Print chuoi ky tu tu msp430 gui len Terminal ===========
// ================== Gia tri tra ve: khong ====================================
void Print_UART(char *ch){
char i = 0;
    while(ch[i] != '\0'){
            Send_Char(ch[i]);
            i++;
      }
}
 

thienminh_npn

Thành Viên PIF
Bạn thử ép kiểu triệt để hơn xem, ví dụ như ở vòng for tách pass sửa thành:
Code:
pass_receive[i] = *((unsigned char*)(data+i));
Nhắc luôn là có thể khi debug nhìn vào ô watch thì nó sai còn khi kết thúc quy trình (procedure) thì kết quả vẫn ok như expected vì compiler đã optimize assembly code từ code C nhé.
 

lvdao014

Trứng gà
Bạn thử ép kiểu triệt để hơn xem, ví dụ như ở vòng for tách pass sửa thành:
Code:
pass_receive[i] = *((unsigned char*)(data+i));
Nhắc luôn là có thể khi debug nhìn vào ô watch thì nó sai còn khi kết thúc quy trình (procedure) thì kết quả vẫn ok như expected vì compiler đã optimize assembly code từ code C nhé.
Kết quả cũng không thay đổi bạn ơi:-(, mọi người ai có thời gian thì chỉ dùm mình với, pó tay rồi không biết nó sai ở đâu luôn


code projet: http://www.mediafire.com/download/qic1er042bipe62/split_array.rar
 

thienminh_npn

Thành Viên PIF
Bạn khai báo lại các biến array nhé:
Code:
char pass_receive[7] = {0, 0, 0, 0, 0, 0, 0};
char ip_receive[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char port_receive[5] = {0, 0, 0, 0, 0};
 

lvdao014

Trứng gà
:1cool_byebye:
Bạn khai báo lại các biến array nhé:
Code:
char pass_receive[7] = {0, 0, 0, 0, 0, 0, 0};
char ip_receive[15] = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0};
char port_receive[5] = {0, 0, 0, 0, 0};
Mình cảm ơn rất nhiều, nhưng tại sau lại tăng số phần tử mảng lên vậy
 

thienminh_npn

Thành Viên PIF
Hàm Print_UART chỉ kết thúc khi nào gặp '\0', 3 arrays bạn khai báo liền nhau nên khi xuất chuỗi trước chuỗi sau cũng dính vào đó mà.
 
Top