PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] memory löschen mit c



Ritchie
28.08.2012, 20:27
Hallo Zusammen,

die folgende Routine soll mir einen Kartenbereich das Bit 0 löschen, andere Bits sollen stehen bleiben.


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++;
}
}
}

Verwende ich diese Zeile, wird der Speicher korrekt gelöscht.



pointer = m_mappointer;
memset(pointer,0,
MAPSIZE_XY * MAPSIZE_XY); // Karte wieder zuruecksetzen


Ich will aber nicht komplett löschen, sondern nur das bit 0.

Ich bekomme die "Krise"...

Gruss R.

markusj
28.08.2012, 22:12
Wo ist das Problem? Die obere Funktion sollte korrekt arbeiten.

mfG
Markus

Ritchie
29.08.2012, 11:39
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.

markusj
29.08.2012, 12:23
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

Ritchie
29.08.2012, 21:06
Hi,

die Definition kommt aber auf das selbe raus.



#define MAPSIZE_XY 300
#define MAPSIZE_XY_MM 10000
#define MAX_COORDIANTE 90000
#define MAP_FACTOR 33 // 1 Grid = 33 mm


Der Code


*(pointer[offset]) &= 0xfe;

gibt diesen Fehler ?!

./source/nav.cpp:229: error: invalid type argument of `unary *'

Diese Zeile ist hingegen o.k.


*(pointer + offset) &= 0xfe;


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.

Ich will den Speicher nicht löschen, da hier auch bereits gefunden Objekte dann gelöscht werden würde.

Gruss R.

Ritchie
29.08.2012, 21:27
Hi,

hier noch etwas seltsameres



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++;
}
}
}


Hat diese Ausgabe:


Hallo 1
Hallo 2


Gruss R.

Ritchie
29.08.2012, 21:35
Hi,

so hat es dann jedenfalls funktioniert. Ich habe den Schleifentyp geändert.



while( offset < 90000)
{
*(pointer + offset) &= 0xfe;
offset++;
}


Jetzt arbeitet es wie erwartet.

markusj
30.08.2012, 09:03
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

Ritchie
30.08.2012, 19:27
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.