- 12V Akku mit 280 Ah bauen         
Ergebnis 1 bis 9 von 9

Thema: memory löschen mit c

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332

    memory löschen mit c

    Anzeige

    E-Bike
    Hallo Zusammen,

    die folgende Routine soll mir einen Kartenbereich das Bit 0 löschen, andere Bits sollen stehen bleiben.
    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++;
                }
            }
    }
    Verwende ich diese Zeile, wird der Speicher korrekt gelöscht.

    Code:
            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.
    Kaum macht man es richtig, schon funktioniert's ...

  2. #2
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    Wo ist das Problem? Die obere Funktion sollte korrekt arbeiten.

    mfG
    Markus
    Tiny ASURO Library: Thread und sf.net Seite

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    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 ...

  4. #4
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    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

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    die Definition kommt aber auf das selbe raus.

    Code:
    #define        MAPSIZE_XY                                                300
    #define        MAPSIZE_XY_MM                                        10000
    #define         MAX_COORDIANTE                                    90000
    #define         MAP_FACTOR                                                33                // 1 Grid = 33  mm
    Der Code
    Code:
                *(pointer[offset]) &= 0xfe;
    gibt diesen Fehler ?!

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

    Diese Zeile ist hingegen o.k.
    Code:
                *(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.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken kSCADA3.jpg  
    Geändert von Ritchie (29.08.2012 um 22:18 Uhr)
    Kaum macht man es richtig, schon funktioniert's ...

  6. #6
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

    hier noch etwas seltsameres

    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++;
                }
            }
    }
    Hat diese Ausgabe:
    Hallo 1
    Hallo 2
    Gruss R.
    Kaum macht man es richtig, schon funktioniert's ...

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    Hi,

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

    Code:
            while( offset < 90000)
                {
                *(pointer + offset) &= 0xfe;
                offset++;
                }
    Jetzt arbeitet es wie erwartet.
    Miniaturansichten angehängter Grafiken Miniaturansichten angehängter Grafiken kSCADA4.jpg  
    Kaum macht man es richtig, schon funktioniert's ...

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    20.08.2008
    Ort
    Karlsruhe
    Alter
    36
    Beiträge
    1.225
    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

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    07.11.2004
    Beiträge
    332
    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 ...

Ähnliche Themen

  1. Memory Lock Bits
    Von dj5am im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 1
    Letzter Beitrag: 09.11.2011, 18:31
  2. 1 kanal memory baustein
    Von hasee im Forum Elektronik
    Antworten: 2
    Letzter Beitrag: 20.03.2008, 22:07
  3. External Memory Controller
    Von someone80 im Forum ARM - 32-bit-Mikrocontroller-Architektur
    Antworten: 0
    Letzter Beitrag: 17.12.2007, 11:10
  4. Memory dump und ändern
    Von for_ro im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 2
    Letzter Beitrag: 11.11.2007, 12:07
  5. Memory Erweiterung für µC
    Von Mobius im Forum Eigene fertige Schaltungen und Bauanleitungen
    Antworten: 2
    Letzter Beitrag: 16.08.2005, 17:21

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen