線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2038
推到 Plurk!
推到 Facebook!

請教錯誤訊息"EListError"

答題得分者是:RaynorPao
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-29 14:06:51 IP:61.220.xxx.xxx 未訂閱
我的程式執行到一半出現 EListError with message 'List Index out of bounds (0)' 的錯誤,請教大家可以從此訊息中猜出大概是什麼樣的錯誤嗎? 而且我覺得很奇怪的是,同樣的程式一直在執行,為何執行到一半會出錯,而前面卻不會出錯呢? 謝謝大家花時間幫忙!
axsoft
版主


發表:681
回覆:1056
積分:969
註冊:2002-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-29 14:12:31 IP:61.218.xxx.xxx 未訂閱
danielj您好:       我猜想您是否有個index已經超出索引的範圍了?因為看不到您的程式碼,只能用訊息來猜了!    HAVE A NICE DAY FOR YOU
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-29 14:24:31 IP:61.220.xxx.xxx 未訂閱
附上主要程式碼部分 //---------------------------------------------------------------------------    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,       TCustomWinSocket *Socket) {     ClientMessage = Socket->ReceiveText();     AnsiString filename;        if      (ClientMessage.SubString(1,15) == "RecievedLength=")     {         if (StrToInt(ClientMessage.SubString(16,ClientMessage.Length())) == LastPacketSize )         {             ClientReceived = true ;         }     }     else if (ClientMessage.SubString(1,7) == "Command")     {         if      (ClientMessage=="Command_1")         {             for (int i=0;i<1000;i ) { filename.printf("d",i&); filename=JPEG_PATH filename ".jpg"; SendImage0(filename); } } else if (ClientMessage=="Command_2") { SendImage0("c:\\0000.jpg"); } else if (ClientMessage=="Command_3") { SendImage0("c:\\0002.jpg"); } } } //--------------------------------------------------------------------------- void TForm1::SendImage0(AnsiString image_name) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(image_name); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); ClientReceived = false ; LastPacketSize = mp.dwThisDataSize ; Timer1->Enabled = true ; //在Server端未接獲Client端傳來訊息前暫時停止傳送封包 StatusBar1->SimpleText = "等待Client端回報訊息..." ; while (!ClientReceived) { Application->ProcessMessages(); } // Sleep(SLEEP_TIME); } StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- 小弟覺得很奇怪,為什麼要到第三輪以後才後出現錯誤?也請大家幫忙找看看錯誤可能是在那裡,謝謝!
RaynorPao
版主


發表:139
回覆:3622
積分:7025
註冊:2002-08-12

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-30 00:24:13 IP:61.221.xxx.xxx 未訂閱
引言: 附上主要程式碼部分
//---------------------------------------------------------------------------    void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender,
      TCustomWinSocket *Socket)
{
    ClientMessage = Socket->ReceiveText();
    AnsiString filename;        if      (ClientMessage.SubString(1,15) == "RecievedLength=")
    {
        if (StrToInt(ClientMessage.SubString(16,ClientMessage.Length())) == LastPacketSize )
        {
            ClientReceived = true ;
        }
    }
    else if (ClientMessage.SubString(1,7) == "Command")
    {
        if      (ClientMessage=="Command_1")
        {
            for (int i=0;i<1000;i  )
            {
                filename.printf("d",i&);
                filename=JPEG_PATH   filename   ".jpg";
                SendImage0(filename);
            }
        }
        else if (ClientMessage=="Command_2")
        {
            SendImage0("c:\\0000.jpg");
        }
        else if (ClientMessage=="Command_3")
        {
            SendImage0("c:\\0002.jpg");
        }
    }
}
//---------------------------------------------------------------------------
void TForm1::SendImage0(AnsiString image_name)
{
   TMemoryStream *msFile=new TMemoryStream;
   msFile->LoadFromFile(image_name);
   MYPACK mp;
   int i=0;
   int block=(msFile->Size%MAX_DATASIZE==0)?
      msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1;       for(i=0; iSize;
      mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)?
         msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE;
      msFile->Position=i*MAX_DATASIZE;
      msFile->Read(mp.pbThisData, mp.dwThisDataSize);          ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK));
      ClientReceived = false ;          LastPacketSize = mp.dwThisDataSize ;          Timer1->Enabled = true ;
      //在Server端未接獲Client端傳來訊息前暫時停止傳送封包
      StatusBar1->SimpleText = "等待Client端回報訊息..." ;
      while (!ClientReceived)
      {
          Application->ProcessMessages();
      }
//      Sleep(SLEEP_TIME);
   }
   StatusBar1->SimpleText = image_name   "("   mp.dwTotalDataSize   "Byte)傳送完成" ;
   delete msFile;
}
//---------------------------------------------------------------------------
小弟覺得很奇怪,為什麼要到第三輪以後才後出現錯誤?也請大家幫忙找看看錯誤可能是在那裡,謝謝!
danielj 你好:
建議你先檢查以下所提到的地方
(> >
    -- 
        
------
-- 若您已經得到滿意的答覆,請適時結案!! --
-- 欲知前世因,今生受者是;欲知來世果,今生做者是 --
-- 一切有為法,如夢幻泡影,如露亦如電,應作如是觀 --
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-30 08:33:15 IP:61.220.xxx.xxx 未訂閱
多謝RaynorPao大哥的建議,我會一一的嘗試的!
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-30 11:23:15 IP:61.220.xxx.xxx 未訂閱
小弟debug的功夫太差,看了半天也沒抓到問題,我把測試的Client端程式也post上來,我有把檔案傳到會員求助程式檔案上傳區,如果各位大大有空的話,能否幫我看一下…        我的基本傳輸方式是由Client端先發送指令建立連線,然後再送指令要求Server傳送檔案,而檔案是分成多個1k為單位的封包。從我log到的訊息中看出來,Client端最後有送出文字訊息到Server端,server不知為何並未收到該訊息(難道是Server在未收到訊息前就掛了?),我實在是看不出來那邊可能會產生"Index out of bounds (0)"的機會,能否再請大家幫一下忙,感謝大家的熱心!    //=================================================================== //Server端最後的完整程式碼 //------------------------------------------------------------------- //---------------------------------------------------------------------------    #include  #pragma hdrstop #include "Unit1.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" FILE *fp; TForm1 *Form1; #define MAX_STRLEN 16 #define MAX_FILENAME_LEN 255 #define MAX_DATASIZE 1024 typedef struct _MyPack { char szHeader[MAX_STRLEN]; char szFileName[MAX_FILENAME_LEN]; DWORD dwPackTotal; DWORD dwPackCount; DWORD dwTotalDataSize; DWORD dwThisDataSize; BYTE pbThisData[MAX_DATASIZE]; } MYPACK; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { Button1->Enabled = false ; JPEG_PATH = "c:\\My Documents\\My Pictures\\"; SLEEP_TIME = 50 ; Timer1->Enabled = false ; Timer1->Interval = 30000 ; Timer2->Enabled = false ; Timer2->Interval = 1000 ; fp=fopen("c:\\server.msg","w"); } //--------------------------------------------------------------------------- void __fastcall TForm1::FormDestroy(TObject *Sender) { ServerSocket1->Active = false ; ServerSocket1->Close(); Timer1->Enabled = false ; fclose(fp); } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { TMemoryStream *msFile=new TMemoryStream; OpenDialog1->Filter = "*.jpg"; if (OpenDialog1->Execute()) msFile->LoadFromFile(OpenDialog1->FileName); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iFileName.c_str()); mp.dwPackTotal=block; mp.dwPackCount=i; mp.dwTotalDataSize=msFile->Size; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); Sleep(SLEEP_TIME); } StatusBar1->SimpleText = OpenDialog1->FileName "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1Accept(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "接受" Socket->RemoteHost "之連線" ; Button1->Enabled = true ; Button1->Caption = "傳送圖片給" Socket->RemoteHost ; char szz[256]={0}; AnsiString mes = "Server " StatusBar1->SimpleText ; sprintf(szz, "%s", mes); OutputDebugStringA(szz); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientConnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "與" Socket->RemoteHost "連線中" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientDisconnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "與" Socket->RemoteHost "連線中斷" ; char szz[256]={0}; AnsiString mes = "Server " StatusBar1->SimpleText ; sprintf(szz, "%s", mes); OutputDebugStringA(szz); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientError(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { ErrorCode = 0 ; StatusBar1->SimpleText = "Error from Client socket" ; StatusBar1->SimpleText = "Client 端發生錯誤!已中斷與" Socket->RemoteHost "之連線,請重新開啟伺服器" ; for(int i=0; iSocket->ActiveConnections; i ) { if(Socket->RemoteAddress==ServerSocket1->Socket->Connections[i]->RemoteAddress) { ServerSocket1->Socket->Disconnect(i); } } char szz[256]={0}; AnsiString mes = "Server " StatusBar1->SimpleText ; sprintf(szz, "%s", mes); OutputDebugStringA(szz); // ServerSocket1->Close(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1Listen(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = Socket->LocalHost " Port" Socket->LocalPort "等待用戶連線…" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::mnuListenClick(TObject *Sender) { ServerSocket1->Port=StrToInt(InputBox("伺服器設定","傳輸埠","4000")); ServerSocket1->Open(); } //--------------------------------------------------------------------------- void __fastcall TForm1::ServerSocket1ClientRead(TObject *Sender, TCustomWinSocket *Socket) { ClientMessage = Socket->ReceiveText(); AnsiString filename; char sz[256]={0}; AnsiString mes = "Server收到" ClientMessage ; sprintf(sz, "%s", mes); OutputDebugStringA(sz); if (ClientMessage.SubString(1,15) == "RecievedLength=") { if (StrToInt(ClientMessage.SubString(16,ClientMessage.Length())) == LastPacketSize ) { ClientReceived = true ; } } else if (ClientMessage.SubString(1,7) == "Command") { if (ClientMessage=="Command_1") { for (int i=0;i<1000;i ) { filename.printf("d",i&); filename=JPEG_PATH filename ".jpg"; SendImage0(filename); } } else if (ClientMessage=="Command_2") { SendImage0("c:\\0000.jpg"); } else if (ClientMessage=="Command_3") { SendImage0("c:\\0002.jpg"); } } } //--------------------------------------------------------------------------- void TForm1::SendImage0(AnsiString image_name) { TMemoryStream *msFile=new TMemoryStream; msFile->LoadFromFile(image_name); MYPACK mp; int i=0; int block=(msFile->Size%MAX_DATASIZE==0)? msFile->Size/MAX_DATASIZE: msFile->Size/MAX_DATASIZE 1; for(i=0; iSize; mp.dwThisDataSize=((i 1)*MAX_DATASIZE>msFile->Size)? msFile->Size-i*MAX_DATASIZE: MAX_DATASIZE; msFile->Position=i*MAX_DATASIZE; msFile->Read(mp.pbThisData, mp.dwThisDataSize); ServerSocket1->Socket->Connections[0]->SendBuf(&mp, sizeof(MYPACK)); ClientReceived = false ; LastPacketSize = mp.dwThisDataSize ; Timer1->Enabled = true ; //在Server端未接獲Client端傳來訊息前暫時停止傳送封包 StatusBar1->SimpleText = "等待Client端回報訊息..." ; Timer2->Enabled = true ; elaps_time = 0; while (!ClientReceived) { Application->ProcessMessages(); StatusBar1->SimpleText = "等待Client回應 :" IntToStr(elaps_time) "/" IntToStr(Timer1->Interval/1000) ; } // Sleep(SLEEP_TIME); } StatusBar1->SimpleText = image_name "(" mp.dwTotalDataSize "Byte)傳送完成" ; delete msFile; } //--------------------------------------------------------------------------- void __fastcall TForm1::SleepTime1Click(TObject *Sender) { SLEEP_TIME = StrToInt(InputBox("Sleep Time Setting","Sleep Time (ns) = ","100")); } //--------------------------------------------------------------------------- void __fastcall TForm1::jpegpath1Click(TObject *Sender) { JPEG_PATH = InputBox("JPEG Path Setting","The Path including JPEGs : ","c:\\My Documents\\My Pictures\\"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = false ; ServerSocket1->Socket->Disconnect(0); StatusBar1->SimpleText = ServerSocket1->Socket->Connections[0]->RemoteHost "沒有回應,連線中斷" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::WaitTime1Click(TObject *Sender) { Wait_Time = StrToInt(InputBox("Wait Time Setting : ","Wait Client for (ms) : ","")); Timer1->Interval = Wait_Time ; ServerSocket1->Socket->SendText("Clinet Response Timeout"); } //--------------------------------------------------------------------------- void __fastcall TForm1::Timer2Timer(TObject *Sender) { elaps_time ; StatusBar1->SimpleText = "等待Client回應 :" IntToStr(elaps_time) "/" IntToStr(Timer1->Interval/1000) ; } //--------------------------------------------------------------------------- //=================================================================== //Client端最後的完整程式碼 //------------------------------------------------------------------- //--------------------------------------------------------------------------- #include #pragma hdrstop #include "Unit1.h" #include //--------------------------------------------------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //--------------------------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //--------------------------------------------------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ClientSocket1->Address = "192.168.0.95"; ClientSocket1->Port = 4000 ; ClientSocket1->Active = true ; ClientSocket1->Socket->SendText("Command_1"); StatusBar1->SimpleText = "Command_1 was sent" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::FormCreate(TObject *Sender) { ClientSocket1->Active = false ; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Connect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "現在正與" Socket->RemoteHost "連線" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Error(TObject *Sender, TCustomWinSocket *Socket, TErrorEvent ErrorEvent, int &ErrorCode) { StatusBar1->SimpleText = "錯誤:無法連線" Socket->RemoteHost " Port :" Socket->RemotePort ; ErrorCode = 0; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Disconnect(TObject *Sender, TCustomWinSocket *Socket) { StatusBar1->SimpleText = "現在中斷" Socket->RemoteHost "連線" ; } //--------------------------------------------------------------------------- void __fastcall TForm1::ClientSocket1Read(TObject *Sender, TCustomWinSocket *Socket) { MYPACK mp; Socket->ReceiveBuf(&mp, sizeof(MYPACK)); AnsiString sz=(AnsiString)mp.szHeader; AnsiString ClientMessage = "RecievedLength=" IntToStr(mp.dwThisDataSize) ; Socket->SendText("RecievedLength=" IntToStr(mp.dwThisDataSize) );//回報接收結果給Server StatusBar1->SimpleText = "現在正與" Socket->RemoteHost "連線 目前圖片" mp.szFileName; char szz[256]={0}; // sprintf(szz, "%s %s %d %d %d %d",mp.szHeader,mp.szFileName,mp.dwPackTotal,mp.dwPackCount,mp.dwTotalDataSize,mp.dwThisDataSize); AnsiString mes = "Client端送出訊息:RecievedLength=" IntToStr(mp.dwThisDataSize) ; sprintf(szz,"%s",mes); OutputDebugStringA(szz); } //--------------------------------------------------------------------------- 發表人 - danielj 於 2003/07/30 11:34:48
danielj
初階會員


發表:65
回覆:135
積分:40
註冊:2003-06-11

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-30 18:09:50 IP:61.220.xxx.xxx 未訂閱
多謝大家的幫忙!小弟花了一天的時間終於找出問題,問題在 void __fastcall TForm1::Timer1Timer(TObject *Sender) { Timer1->Enabled = false ; //***********兇手在以下二行程式,但是不知為何會Out of Index**************** ServerSocket1->Socket->Disconnect(0); StatusBar1->SimpleText = ServerSocket1->Socket->Connections[0]->RemoteHost "沒有回應,連線中斷" ; } 另外小弟的程式中也未對Enable後的Timer1及Timer2做disable動作,也是其一缺失… RaynorPao大大謝謝!debugview好像還不錯,不過我還不熟,也謝謝axsoft的熱情回應!
系統時間:2024-04-28 10:06:21
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!