Frage von lolman110, 54

Computercraft Hilfe: Wie kann ich per Table mehrere Farben gleichzeitig ausgeben?

Hallo liebe Community:

Ich bin gerade dabei ein großes Reaktorkontrollprogramm zu schreiben.

Meine Frage ist wie folgt:

Ich habe folgenden Table zum vergleich bzw. zur Zuordnung der Farben

tableColors = {
          [1] = "White", 
          [2] = "Orange", 
          [4] = "Magenta", 
          [8] = "LightBlue", 
          [16] = "Yellow", 
          [32] = "Lime", 
          [64] = "Pink", 
          [128] = "Gray", 
          [256] = "LightGrey", 
          [512] = "Cyan", 
          [1024] = "Purple", 
          [2048] = "Blue", 
          [4096] = "Brown", 
          [8192] = "Green", 
          [16384] = "Red", 
          [32768] = "Black" 
          }

Ich benutze ihn um das eingehende Redstonesignal aus einem BundledCable in einen Text umzuwandeln.

Es ist aber leider auch möglich, das Zahlen, die dazwischen liegen ausgegeben werden (z.B. 3 wenn Weiß und Orange an sind)

Wie kann ich das ausgeben?

Ich habe bereits folgenden Code zum ausgeben einer Farbe:

index = tonumber(rs.getBundledInput(side))
print("Input: "..tostring(rs.getBundledInput(side)).." ("..tableColors[index]..")")

Der Output wäre hier z.B.

"8192 (Green)"

Ich hätte aber auch gerne das z.B wenn weiß und Orange an sind, ausgegeben wird:

"3 (White, Orange)"

Ich habe aber ehrlich gesagt keine lust alle (Mehr als 65.000) Kombinationen zu hardcoden

Könnt ihr mir da helfen?

Danke im Voraus

-Marius (lolman110) Ja ich weiß, der Name ist beschissen xD

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von DragonFireX, 26

Probier das hier mal aus:

colorString = ""

for i,v in pairs(tableColors) do
if colors.test(rs.getBundledInput(side), i) then
colorString = colorString + v
end
end

print("Input: ("..colorString..")")

MfG

Kommentar von lolman110 ,

Danke schonmal für dieses Codesnippet es gibt allerdings Folgende Probleme:

http://pastebin.com/sBiQ5Lpx
Main:45: attempt to call nil
(Mit deinem Code)

http://pastebin.com/9vzVPgBT
Main:45: attempt to call nil
(Mit meinem Vorherigen Code nach Überarbeitung aufgrund der anderen Kommentare)

Die Sache ist, dass in beiden Codes nichts nil sein sollte da in beiden Codes mein Table ja schließlich definiert ist.

Kommentar von DragonFireX ,

Hier ist der überarbeitete funktionierende Code, war ausversehen noch bei C++ weil ich gerade auf der Arbeit saß^^

colorString = ""
side = ""

for i,v in pairs(tableColors) do
if colors.test(rs.getBundledInput(side), i) then
colorString = colorString .. ";" .. v
end
end

print("Input: ("..colorString..")")

MfG

Kommentar von lolman110 ,

Danke! Ich musste ein kleines Bisschen was für meine Bedürfnisse verändern, aber es funktioniert!

Kommentar von DragonFireX ,

Kein Problem :-)

Antwort
von maximilianus7, 30

du arbeitest mit einer bit-maske, die nur ein 1-er bit enthält, beginnend mit 1=0000 0000 0000 0001.  

in einer schleife machst du ein xor mit dieser maske auf den eingangsindex, wenn > 0 dann hat man die betreffende farbe tabColors[maske], dann einen linkssshift auf die maske und nächster schleifendurchlauf.

http://bitop.luajit.org

Kommentar von 3v1lH4x0R ,

Oder... einfach ein and? Geht's noch?

Kommentar von maximilianus7 ,

stimmt:  and ist richtig,

Kommentar von lolman110 ,

Danke, aber ehm wie gesagt ich bin blutiger Anfänger in lua. Ich weiß also nicht ganz genau was du mir damit sagen willst :/

Kommentar von maximilianus7 ,

ich kann gar kei lua. es geht um bit-operationen (gugel!), lua unterstützt das sprachlich nicht, sondern durch ein importiertes paket (siehe link von mir).

ausgangspunkt sind die indizies der farbtabelle: das sind alles 2er-potenzen. die binärdarstellung (gugel) dieser indizies bestehen aus lauter 0-bits bis auf eines. bei einer farb-kombination hast du mehrere 1-er bits.

Kommentar von lolman110 ,

Bdenke das ich hier einen Mod für Minecraft verwende.

Ich wüsste nicht wie ich dadrauf Zusatzpakete installieren soll. Die einzige Möglichkeit ist das es schon installiert ist ich werde es versuchen. Danke schonmal.

Antwort
von PerfectMuffin, 29

Kannst du arithmetische UNDs verwenden?

Natürlich könntest du auch versuchen, den jeweils größten Wert von deiner Zahl abzuziehen und wenn sie nicht negativ wird annehmen, dass die Farbe dabei ist.

Kommentar von lolman110 ,

Ich habe auch schon an das abziehen gedacht. Da ich aber neu bin was lua angeht, bzw. blutiger Anfänger, weiß ich leider nicht auf Anhieb, wie ich das mit dem Abziehen realisieren soll.

Und aritmethische Unds würden Zahlen zusammen zählen im Table sind es aber glaube ich keys o.Ä,  Die kann ich nicht aritmethisch addieren. Aber Danke schonmal ich werde dem mal einen Versuch geben!

Kommentar von lolman110 ,

hmm ich weiß auch nicht wie ich das mit aritmethischen Unds realisieren könnte...

Kommentar von PerfectMuffin ,

UND ist nicht Plus.

Und ist im Prinzip eine logische Operation, false&false=false, false&true=false true&true=true

Wenn du zwei Zahlen 00110011 und 10101010 addierst, bekommst du 11011101

wenn du diese Zahlen aber mit arithmetischem UND verrechnest, bekommst du 00100010

Dehalb verwendet man UND gerne um auf einzelne Bits zu testen.

Kommentar von maximilianus7 ,

du hast auch von arithmetischen UND gesprochen, du meintest bitweise UND

Kommentar von PerfectMuffin ,

Wäre besser gewesen, bitweise zu sagen, ja. Ich wollte es nur vom logischen UND trennen.

Kommentar von lolman110 ,

Wie implementiere ich dieses UND denn dann? wie gesagt Blutiger Anfänger :/

Kommentar von PerfectMuffin ,

Jede Sprache sollte eins haben.

Und und bitshift.

Unter C-Sprachen ist es & oder &&

in höheren sprachen meist einfach AND

Bitshift kenne ich aber nur als <<, >> und >>> aus den C-Sprachen.

Keine passende Antwort gefunden?

Fragen Sie die Community