• Willkommen im Geoclub - dem größten deutschsprachigen Geocaching-Forum. Registriere dich kostenlos, um alle Inhalte zu sehen und neue Beiträge zu erstellen.

Über eine Table iterieren

Ich habe eine verschachtelte Table, welche so aussieht (gekürzte Version):
Code:
tbl_race2 = {}
tbl_race2[1] = {}
tbl_race2[1].name = "Shadow Fighter"
tbl_race2[1].quote = 11.9
tbl_race2[1].wsk = 0.08
tbl_race2[2] = {}
tbl_race2[2].name = "Sonnenpfeil"
tbl_race2[2].quote = 7.9
tbl_race2[2].wsk = 0.12
tbl_race2[3] = {}
tbl_race2[3].name = "Painted Blue"
tbl_race2[3].quote = 31.7
tbl_race2[3].wsk = 0.03
Hier möchte ich drüberiterieren und den Text in eine Variable schreiben.

Nun habe ich mir das Beispiel im Handbuch angesehen: http://wig-wiki.docfred.de/index.ph...hleifen_durch_alle_Elemente_einer_Table_gehen

Ich habe mir das testeshalber mal so in meine Cartridge gepackt:
Code:
fruechte_table{}
fruechte_table[1]={} --Hier wird jetzt das erste Element des äußeren numerischen table mit einem neuen (assoziativen) table gefüllt.  
fruechte_table[1].name="Apfel"
fruechte_table[1].farbe="gruen"
fruechte_table[1].schale="hart"
fruechte_table[1].geschmack="sauer"
fruechte_table[2]={name="Birne", farbe="gelb", gechmack="suess"}
fruechte_table[3]={name="Kirsche", farbe="rot", geschmack="suess"}

fruechte_table{}
fruechte_table[1]={} --Hier wird jetzt das erste Element des äußeren numerischen table mit einem neuen (assoziativen) table gefüllt.  
fruechte_table[1].name="Apfel"
fruechte_table[1].farbe="gruen"
fruechte_table[1].schale="hart"
fruechte_table[1].geschmack="sauer"
fruechte_table[2]={name="Birne", farbe="gelb", gechmack="suess"}
fruechte_table[3]={name="Kirsche", farbe="rot", geschmack="suess"}

function TESTIteration()
   local text = ""
   for index, inhalt in pairs(fruechte_table) do 
       text = text.."Attribut: "..index.." = "..inhalt.." "  
        -- index ist nach jedem Durchgang geschmack, farbe, schale, inhalt ist sauer, rot, hart
    print(text)
   end
 end

Leider kommt da schon beim Kompilieren eine ellenlange Fehlermeldung.

Könnte mich jemand unterstützen um die Funktion so anzupassen, dass ich die Elemente aus meiner Table auslesen kann?
 

Charlenni

Geomaster
Du hast eine geschachtelte Tabelle, also jedes Element der Tabelle (1, 2, 3) ist wieder eine Tabelle (geschmack, farbe, schale, name). Deine for-Schleife geht über die äußere Tabelle, nicht das einzelne Element. Damit ist index dann nicht geschmack, farbe usw., sondern 1, 2, 3. Versuch es mal mit
Code:
function TESTIteration(tbl)
   local text = ""
   for num,element in pairs(tbl) do
      -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...), 
      -- element is fruechte_table[1], fruechte_table[2] usw.
      for index, inhalt in pairs(element) do
         text = text.."Attribut: "..index.." = "..inhalt.." " 
         -- index ist nach jedem Durchgang geschmack, farbe, schale, inhalt ist sauer, rot, hart
         print(text)
      end
   end
 end
 
OP
W

whiterussian_ch

Geocacher
Bin leider erst heute dazu gekommen das anzusehen und an dieser Stelle schon mal vielen Dank für die Hilfe!

Enteweder ich bin zu blöd (nicht auszuschliessen) oder da ist noch was falsch.

Ich habe mal eine komplett leere Cartridge genommen (ohne Zonen und alles) und dies in die lua user functions eingegeben:
Code:
fruechte_table{}
fruechte_table[1]={} --Hier wird jetzt das erste Element des äußeren numerischen table mit einem neuen (assoziativen) table gefüllt. 
fruechte_table[1].name="Apfel"
fruechte_table[1].farbe="gruen"
fruechte_table[1].schale="hart"
fruechte_table[1].geschmack="sauer"
fruechte_table[2]={name="Birne", farbe="gelb", gechmack="suess"}
fruechte_table[3]={name="Kirsche", farbe="rot", geschmack="suess"}

function TESTIteration(tbl)
   local text = ""
   for num,element in pairs(tbl) do
      -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...),
      -- element is fruechte_table[1], fruechte_table[2] usw.
      for index, inhalt in pairs(element) do
         text = text.."Attribut: "..index.." = "..inhalt.." "
         -- index ist nach jedem Durchgang geschmack, farbe, schale, inhalt ist sauer, rot, hart
         print(text)
      end
   end
end

Aufruf im OnStart der Cartridge mittels lua benutzerdefinierter Code. Das kompiliert leider nicht:
aaaa.jpg
 

Charlenni

Geomaster
Ei paar kleine Fehler hast Du eingebaut, damit ich noch etwas zu tun habe :D

Code:
fruechte_table = {}  -- Hier hat ein Gleichheitszeichen gefehlt
fruechte_table[1]={} --Hier wird jetzt das erste Element des äußeren numerischen table mit einem neuen (assoziativen) table gefüllt.
fruechte_table[1].name="Apfel"
fruechte_table[1].farbe="gruen"
fruechte_table[1].schale="hart"
fruechte_table[1].geschmack="sauer"
fruechte_table[2]={name="Birne", farbe="gelb", gechmack="suess"}
fruechte_table[3]={name="Kirsche", farbe="rot", geschmack="suess"}

function TESTIteration(tbl)
   local text = ""
   for num,element in pairs(fruechte_table) do  -- Hier musst Du auch die Tabelle von tbl in fruechte_table umbenennen
      -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...),
      -- element is fruechte_table[1], fruechte_table[2] usw.
      for index, inhalt in pairs(element) do
         text = text.."Attribut: "..index.." = "..inhalt.." "
         -- index ist nach jedem Durchgang geschmack, farbe, schale, inhalt ist sauer, rot, hart
         print(text)   -- Hier anschliessend text wieder löschen oder print nach der inneren Schleife aufrufen
      end
   end
end

So sollte es funktionieren.
 
OP
W

whiterussian_ch

Geocacher
Vielen Dank!

War fast perfekt. Nach dem print musste ich noch text wieder auf den leeren String zurücksetzen, also so:

Code:
function TESTIteration(tbl)
   local text = ""
   for num,element in pairs(tbl) do  -- Hier musst Du auch die Tabelle von tbl in fruechte_table umbenennen
      -- num ist nach jedem Durchgang die Nummer des Tabellenelements (1, 2, 3...),
      -- element is fruechte_table[1], fruechte_table[2] usw.
      for index, inhalt in pairs(element) do
         text = text.."Attribut: "..index.." = "..inhalt.." "
         -- index ist nach jedem Durchgang geschmack, farbe, schale, inhalt ist sauer, rot, hart
         print(text)   -- Hier anschliessend text wieder löschen oder print nach der inneren Schleife aufrufen
         text = ""
      end
   end
end
 
Oben