Wo ist das Problem? Die obere Funktion sollte korrekt arbeiten.
mfG
Markus
Hallo Zusammen,
die folgende Routine soll mir einen Kartenbereich das Bit 0 löschen, andere Bits sollen stehen bleiben.
Verwende ich diese Zeile, wird der Speicher korrekt gelöscht.Code:void Navigation::ResetWalkWay(void) { unsigned char *pointer; // Daten pointer unsigned long offset; if(m_mappointer != NULL ) // Besteht noch eine Karte im Speicher { pointer = m_mappointer; for(offset=0;offset < MAX_COORDIANTE;offset++); { *pointer &= 0xfe; pointer++; } } }
Ich will aber nicht komplett löschen, sondern nur das bit 0.Code:pointer = m_mappointer; memset(pointer,0, MAPSIZE_XY * MAPSIZE_XY); // Karte wieder zuruecksetzen
Ich bekomme die "Krise"...
Gruss R.
Kaum macht man es richtig, schon funktioniert's ...
Wo ist das Problem? Die obere Funktion sollte korrekt arbeiten.
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Laut meiner Datenübertragung arbeitet diese Funktion aber nicht so, wie sie sollte.
Das Bit0 bleibt anstehen. Ich werde das heute abend nochmals prüfen.
In meinem Programm lasse ich zyklisch den Status der Karte auf einem PC anzeigen.
Hier wird der Status ständig neu angezeigt. Füge ich die Löschfunktion ein (menset), wird
der Bildschirm auch korrekt dargestellt.
Bis jetzt bin ich davon ausgegangen, das ein Fehler in den oberen Zeilen sein muss.
Gruss R.
Kaum macht man es richtig, schon funktioniert's ...
Was mir auffällt: Du verwendest in deiner Funktion ein anderes Limit als beim Aufruf von memset. Außerdem könntest du anstelle des Pointer-Increments einen Array-Zugriff machen (pointer[offset] &= ...), ich rechne aber fast damit, dass der Compiler beide Varianten gleich übersetzt.
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Hi,
die Definition kommt aber auf das selbe raus.
Der CodeCode:#define MAPSIZE_XY 300 #define MAPSIZE_XY_MM 10000 #define MAX_COORDIANTE 90000 #define MAP_FACTOR 33 // 1 Grid = 33 mm
gibt diesen Fehler ?!Code:*(pointer[offset]) &= 0xfe;
./source/nav.cpp:229: error: invalid type argument of `unary *'
Diese Zeile ist hingegen o.k.
Leider ist der Effekt immer noch vorhanden. Bei einer neuberechnung eines neuen Zielpunkt wird der zu überwachende Korridor zwar neu berechnet und auch eingezeichnet. Nur wird der alte nicht gelöscht. Siehe Bild.Code:*(pointer + offset) &= 0xfe;
Ich will den Speicher nicht löschen, da hier auch bereits gefunden Objekte dann gelöscht werden würde.
Gruss R.
Geändert von Ritchie (29.08.2012 um 22:18 Uhr)
Kaum macht man es richtig, schon funktioniert's ...
Hi,
hier noch etwas seltsameres
Hat diese Ausgabe:Code:void Navigation::ResetWalkWay(void) { unsigned char *pointer; // Daten pointer long offset; if(m_mappointer != NULL ) // Besteht noch eine Karte im Speicher { pointer = m_mappointer; printf("Hallo 1\n"); for(offset=0; offset < 90000; offset++); { printf("Hallo 2\n"); *(pointer + offset) &= 0xfe; // pointer++; } } }
Gruss R.Hallo 1
Hallo 2
Kaum macht man es richtig, schon funktioniert's ...
Hi,
so hat es dann jedenfalls funktioniert. Ich habe den Schleifentyp geändert.
Jetzt arbeitet es wie erwartet.Code:while( offset < 90000) { *(pointer + offset) &= 0xfe; offset++; }
Kaum macht man es richtig, schon funktioniert's ...
Ich hatte auch pointer[offset] und nicht *pointer[offset] geschrieben ... Wie auch immer, das ist reichlich mysteriös, da beide Varianten (for/while) eigentlich aufs Gleiche rauskommen sollten.
Das Ergebnis aus Post #6 ist absurd, ich hätte 90000 Mal "Hallo 2" erwartet. Hast du evtl. Probleme mit sehr vollem Speicher, dass da Stack und Heap ineinander rein laufen?
mfG
Markus
Tiny ASURO Library: Thread und sf.net Seite
Hallo Markus,
ich würde auch sowas mit dem Stack vermuten. Jedoch hat dieser Rechner noch genügend Speicher frei. Kenn aber jetzt nicht die genauen Systemeinstellungen.
Ich hatte ja auch eine Unzahl von "Hallo 2" vermutet. Hier scheint es wirklich zu einem Abbruch gekommen zu sein.
@pointer[offset]
Klar, jetzt wo ich das lese, ist es mir auch klar wieso.
Gruss R.
Kaum macht man es richtig, schon funktioniert's ...
Lesezeichen