2013-07-28 54 views
-1

當我將表內容添加到表(Lua)中時,表中的所有內容突然消失,我遇到了很大的問題。 有問題的表包含禁止列表(目前有608個條目)的數據,並通過使用table.insert置於表內,但用戶的主要條目完成爲Umbra.Banlist [profileId] = { };Umbra.Banlist [profileId] = {};表本身應該意味着Umbra.Banlist表中有內容。 我運行代碼時沒有錯誤,並且使用添加內容時表爲空

if (#Umbra.Banlist == 0) then 
     System.LogAlways(Umbra.Tag.." The Banlist seems to be empty. It seems that some part of loading has failed."); 
    end 

,當我得到這個:

1

我看了在網上和在本網站但似乎並不是任何相關的問題,所以我在這裏發佈。

此代碼是Crysis Wars服務器mod的一部分(請參閱下面的整個函數),但手頭上有整個Lua庫(所以如果您不認爲您的答案不會解決問題)。

驗證碼:

Umbra.ReadBans = function() 
    self = Umbra; 
    System.LogAlways(Umbra.Tag.." Starting banlist read."); 
    FileHnd, err = io.open(Root().."Mods/Infinity/System/Read/Banlst.lua", "r"); 
    if (not FileHnd) then 
     System.LogAlways(Umbra.Tag.." Unable to find file 'Banlst.lua'."); 
     return; 
    end 
    for line in FileHnd:lines() do 
     local name, profile, ip, domain, reason, date, bannedby = line:match([[Umbra.BanSystem:Add%('(.-)', '(.+)', '(.+)', '(.+)', '(.+)', '(.+)', '(.-)'%);]]); 
     if (not name) then 
      System.LogAlways(Umbra.Tag.." Failed to read the banlist at line "..count or 0); 
      break; 
     end 
     System.LogAlways(Umbra.Tag.." Banlist; Name: [ "..name.." ], For: [ "..reason.." ], By: [ "..bannedby.." ]"); 
     --local Msg, Date, Reason, Type, Domain = line:match([[User:Read%("(.-)", { Date="(.+)"; Reason="(.+)"; Typ="(.+)"; Info="(.+)"; } %);]]); 
     --User:Read("Banned", { Date="31.03.2011"; Reason="WEBSTREAM"; Typ="Inetnum"; Info="COMPUTER.SED.gg"; }); 
     --Umbra.BanSystem:Add('patryk', '258132298', '178.183.243.163', '178.183.243.163.dsl.dynamic.t-mobile.pl', 'flyhack', '08/11/2012 | 21:39:53', 'Anti-Noob'); 
     Umbra.Banlist[profile] = {}; 
     table.insert(Umbra.Banlist[profile], name); 
     table.insert(Umbra.Banlist[profile], ip); 
     table.insert(Umbra.Banlist[profile], domain); 
     table.insert(Umbra.Banlist[profile], reason); 
     table.insert(Umbra.Banlist[profile], date); 
     table.insert(Umbra.Banlist[profile], bannedby); 
     --[[Umbra.Banlist[profile].name = name; 
     Umbra.Banlist[profile].ip = ip; 
     Umbra.Banlist[profile].domain = domain; 
     Umbra.Banlist[profile].reason = reason; 
     Umbra.Banlist[profile].date = date; 
     Umbra.Banlist[profile].bannedby = bannedby;--]] 
     if not count then count = 0; end 
     count = count + 1; 
    end 
    Umbra.Bans = {}; 
    Umbra.Bans.cnt = count; 
    System.LogAlways(Umbra.Tag.." Read "..count.." banned players (added into the Umbra Global Banlist)"); 
    if (#Umbra.Banlist == 0) then 
     System.LogAlways(Umbra.Tag.." The Banlist seems to be empty. It seems that some part of loading has failed."); 
    end 
    count = nil; --Purge this one as well, again! 
end 

編輯:

我不明白,如果他們的個人資料不存在於表中下面的代碼應打印的消息,所以他們的檔案確實存在。

if (not Umbra.Banlist[profile]) then 
      System.LogAlways(Umbra.Tag.." Error in 'Umbra.Banlist': The profile does not exist.)"); 
      break; 
     end 

另一個編輯:

證明,該系統可以其實得到 'ID' 變量:

enter image description here

+0

是的,我爲屏幕截圖中可見的一些名稱表示歉意 - 我無法幫助解決這個問題,而且我並沒有在這裏爲屏幕截圖編輯禁止列表。 – cybermonkey

+0

您可以編輯屏幕截圖來修改名稱。 –

回答

2

只是嘗試使用這個函數來獲取項目的計數表:

function count(t) 
    local c=0; 
    for i in pairs(t) do c=c+1; end 
    return c; 
end 
--... 
if(count(Umbra.Banlist)==0)then 
    --... 
end 

的事情是,#計數與數量指標陣列/表,但你必須用繩子索引表。#與在計數函數中用「ipairs」替換「對」相同。因此,當您執行#Umbra.Banlist(其中所有索引都是字符串)時,它將返回0,因爲有0個整數索引,但這並不意味着該表爲空。

+0

對配置文件使用tostring()後,我可以正確訪問配置文件表。 謝謝:) – cybermonkey

4

你附近有#Umbra.Banlist == 0代碼的結束但我沒有看到任何項目插入到它的數字鍵。這裏有一些事情要檢查,看看你的假設是否符合現實。

檢查profile不是nil。它看起來像你的用例,你假設它是一個數字。你可以很容易地檢查:

assert(profile) 
assert(type(profile) == 'number') 

如果profile其實不是數字類型,然後檢查Umbra.Banlist與#操作故障。注意#不計算表的關聯部分。如果您只關心Umbra.Banlist是否爲空,您可以使用if next(Umbra.Banlist) then進行檢查。

+0

是的,Umbra.Banlist是一個數字(9位數字)。使用_if next(Umbra.Banlist)_會得到相同的結果。也許我正在閱讀文件錯誤? – cybermonkey

+0

@AlexanderStopher捕獲將採用字符串形式。嘗試'tonumber(profile)'將其轉換爲數字,假設配置文件是真的。 – greatwolf

+0

@AlexanderStopher幫助調試你也可以登錄並打印出'name,profile,ip,domain等'來確認它正在捕獲你期望的內容。 – greatwolf