Fehlermeldung *** glibc detected *** python: free(): invalid

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Benutzeravatar
jens
Python-Forum Veteran
Beiträge: 8502
Registriert: Dienstag 10. August 2004, 09:40
Wohnort: duisburg
Kontaktdaten:

Das mit dem i und y ist IMHO auch ein wenig kompliziert... Warum nicht einfach so:

Code: Alles auswählen

...
                for i in range((LED_COUNT), -1, -1):
                                strip.setPixelColor(i, color)
                                strip.setPixelColor(i+1, Color((FARBE), 0, 0))
                                strip.setPixelColor(i+2, Color((FARBE2), 0, 0))
                                strip.show()
                                time.sleep(wait_ms/ZEIT)
                                strip.setPixelColor(i+2, Color(0, 0, 0))
...
Der Sinn ist mir allerdings nicht klar..

GitHub | Open HUB | Xing | Linked in
Bitcoins to: 1JEgSQepxGjdprNedC9tXQWLpS424AL8cd
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: jetzt überschreitest Du mit setPixel nicht mehr in negative Richtung sondern um zwei Elemente in positive Richtung. Das Programm ist also noch genauso kaputt wie vorher, nur dass die Auswirkungen scheinbar nicht sofort offensichtlich werden.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: jetzt überschreitest Du mit setPixel nicht mehr in negative Richtung sondern um zwei Elemente in positive Richtung. Das Programm ist also noch genauso kaputt wie vorher, nur dass die Auswirkungen scheinbar nicht sofort offensichtlich werden.
Ja richtig. Jetzt laufen nach der ersten LED immer zwei LEDs dunkler vor, und die erste LED ist nicht so hell wie sie sein sollte.
Ich verstehe es einfach nicht und das frustriert mich.

Aber die Fehlermeldung taucht jetzt nicht mehr auf. ^^

Mein Gedanke ist es schon gewesen, einfach 4 Listen zu schreiben (jeweils von 0 - 14, 1 - 15 und von 14 - 0, 15 - 1). Und die durch die Schleifen einfach laufen lassen. Für eine Richtung wird das bestimmt funktionieren.

Nachher werde ich nochmal die Schleife schriftlich durch gehen. Sollte ich es nicht mehr hin bekommen, ist das Testprojekt

Zu Turbo Pascal/Qbasic Zeiten, bzw. etwas später hatte ich mal ein ähnliches Schleifenproblem. Ich glaube mich erinnern zu können dass i nachdem Ablauf der Schleife mit dem letzten Schleifenwert bei erneuert Ausführung des Programm etwas unerwartetes (und für mich nicht offensichtliches) gemacht hat.
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: Du hast das Problem, dass Du eine Funktion (setPixelColor) mit ungültigen Parametern aufrufst. Du kannst entweder Deine Schleifen so umschreiben, dass das nicht mehr passiert, was aber schwierig sein kann und Gefahr läuft, dass nicht mehr exakt das erwartete Ergebnis herauskommt, oder Du gehst den einfachen Weg und prüfst bei jedem Aufruf die Korrektheit der Parameter:

Code: Alles auswählen

def set_pixel_color(strip, num, color):
    if 0 <= num < LED_COUNT:
        strip.setPixelColor(num, color)
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: Du hast das Problem, dass Du eine Funktion (setPixelColor) mit ungültigen Parametern aufrufst. Du kannst entweder Deine Schleifen so umschreiben, dass das nicht mehr passiert, was aber schwierig sein kann und Gefahr läuft, dass nicht mehr exakt das erwartete Ergebnis herauskommt, oder Du gehst den einfachen Weg und prüfst bei jedem Aufruf die Korrektheit der Parameter:

Code: Alles auswählen

def set_pixel_color(strip, num, color):
    if 0 <= num < LED_COUNT:
        strip.setPixelColor(num, color)
Ahhhh, Ohhhh und Häää...!!! :lol:

Ahhhh = Problem halb verstanden. Den einfachen Weg habe ich schon in so manchen Scripten gelesen.
Ohhhh = Die Funktion habe ich soweit verstanden.
Hääää = Wie sehen die falschen Parameter aus, bzw. wo durch entstehen sie?

Also müsste ich vor jedem (strip.setPixelColor)-Aufruf die Funktion aufrufen, oder reicht es die Funktion direkt an den Anfang von der Schleife aufzurufen?
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: Die Funktion ist statt der anderen setPixel-Funktion. Und wodurch die falschen Parameter entstehen, hatten wir hier ja schon mehrfach. Geh doch einfach mal von Hand Deine Schleifen durch und versuch zu verstehen, wie die LED-Nummern aus den Schleifenvariablen entstehen.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sorry für meine späte Antwort. Musste erstmal ein bisschen Abstand zu diesem Projekt nehmen.
Was haltet Ihr von dieser Lösung?

Code: Alles auswählen

#!/usr/bin/env python
import time
from neopixel import *


# LED strip configuration:
LED_COUNT      	= 15      		# Number of LED pixels.
LED_PIN        	= 18      		# GPIO pin connected to the pixels (must support PWM!).
LED_FREQ_HZ    	= 800000	   	# LED signal frequency in hertz (usually 800khz)
LED_DMA        	= 5      		# DMA channel to use for generating signal (try 5)
LED_BRIGHTNESS 	= 255    	 	# Set to 0 for darkest and 255 for brightest
LED_INVERT     	= False  	 	# True to invert the signal (when using NPN transistor level shift)

ZEIT = 800.0
FARBE = LED_BRIGHTNESS/4
FARBE2 = FARBE/4


# Define functions which animate LEDs in various ways.
def ledOff(strip, color):
	for i in range((LED_COUNT)):
	  strip.setPixelColor(i, Color(0, 0, 0))
	  strip.show()

def ledKittfadein(strip, color, wait_ms=50):
	for i in range(0, 255, 10):
		for j in range(strip.numPixels()):
			strip.setPixelColor(j, Color( i, 0, 0))
			strip.show()
			time.sleep(wait_ms/20000)
	for i in range(255, -1, -5):
		for j in range(strip.numPixels()):
			strip.setPixelColor(j, Color( i, 0, 0))
			strip.show()
			time.sleep(wait_ms/20000)
	ledOff(strip, color)
	  
def ledKitt(strip, color, wait_ms=50):
#      for x in range(1, LED_COUNT, 1):
		for i in range(14, 0, -1):
			y=i
			strip.setPixelColor(i, color)
			y=y+1
			strip.setPixelColor(y, Color((FARBE), 0, 0))
			strip.setPixelColor((y+1), Color((FARBE2), 0, 0))
			strip.show()
			time.sleep(wait_ms/ZEIT)
			strip.setPixelColor((y+1), Color(0, 0, 0))
			
		for j in range(0, 14, 1):
			z=j
			strip.setPixelColor(j, color)
			z=z+1
			strip.setPixelColor(z, Color(255, 0, 0))
			strip.setPixelColor((z-1), Color((FARBE), 0, 0))
			strip.setPixelColor((z-2), Color((FARBE2), 0, 0))
			strip.show()
			time.sleep(wait_ms/ZEIT)
			strip.setPixelColor((z-1), Color(0, 0, 0))
			strip.setPixelColor((z-2), Color(0, 0, 0))
# Main program logic follows:
if __name__ == '__main__':
	# Create NeoPixel object with appropriate configuration.
	strip = Adafruit_NeoPixel(LED_COUNT, LED_PIN, LED_FREQ_HZ, LED_DMA, LED_INVERT, LED_BRIGHTNESS)
	# Intialize the library (must be called once before other functions).
	strip.begin()
	print 'Press Ctrl-C to quit.'
	ledKittfadein(strip, Color(255, 0, 0))
	while True:
		ledKitt(strip, Color(255, 0, 0))
Sirius3
User
Beiträge: 17741
Registriert: Sonntag 21. Oktober 2012, 17:20

@JenselBensel: Sternchenimporte sind schlecht, Deine Einrückungen sind uneinheitlich (eingerückt wird immer mit 4 Leerzeichen), Du hast etliche unnötige Klammern, aber das schlimmste ist, das Grundproblem hat sich nicht geändert.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

Sirius3 hat geschrieben:@JenselBensel: Sternchenimporte sind schlecht,


Das habe ich so übernommen, mich aber auch nach dem Sinn gefragt. :K
Deine Einrückungen sind uneinheitlich (eingerückt wird immer mit 4 Leerzeichen),
Unerklärlich. Hab 4 Leerzeichen als Tab in Notepad++. :K
Du hast etliche unnötige Klammern,
Ich denke Du meinst die Klammern bei y+1 bzw. z-1, z-2...

aber das schlimmste ist, das Grundproblem hat sich nicht geändert.[/quote]

Ja stimmt. Jetzt taucht der Fehler erst beim beenden auf.
Aber nicht mehr im laufenden Betrieb. :lol:

Ich schreib jetzt mal meine Denkweise bei dem Script auf. Im Kopf schein ich so nicht darauf zu stoßen.
BlackJack

@JenselBensel: Lässt Du Dir Tabs mit vier Leerzeichen im Editor anzeigen oder verwendest Du dort tatsächlich *vier Leerzeichen* pro Ebene? Letzteres sollte man machen.

Es gibt auch noch Klammern um Konstanten die überflüssig sind.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

BlackJack hat geschrieben:@JenselBensel: Lässt Du Dir Tabs mit vier Leerzeichen im Editor anzeigen oder verwendest Du dort tatsächlich *vier Leerzeichen* pro Ebene? Letzteres sollte man machen.
Meistens lasse ich mir die vier Leerzeichen mit Tabs anzeigen. Letzteres mache ich eher selten oder nur in der Linux Shell.
Es gibt auch noch Klammern um Konstanten die überflüssig sind.
Ok, das versuche ich gleich mal raus zubekommen.
JenselBensel
User
Beiträge: 13
Registriert: Freitag 29. Mai 2015, 11:13

BlackJack hat geschrieben: Es gibt auch noch Klammern um Konstanten die überflüssig sind.

Zeile 21 :D
Antworten