Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Pointer-Fragen...

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: [ 1 ] > 2 < [ 3 ]
010
29.04.2004, 12:45 Uhr
Pablo
Supertux
(Operator)


Gut, nicht direkt auf die Bits, (ich wollte sagen auf die Bytes), aber man kann Masken benutzen
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
011
29.04.2004, 14:06 Uhr
0xdeadbeef
Gott
(Operator)



C++:
unsigned *p, bits;

/* ... */

*p |= (1 << bits);
*p &= ((unsigned) -1) - (1 << bits);


--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
012
29.04.2004, 14:59 Uhr
~Unwissende
Gast


...aaaaalso, jetzt nochmal gaaaaaaaaaaaaaanz langsam für mich (zum mitdenken, den meine geistigen Fähigkeiten verhalten sich im Moment umgegekehrt proportional zur Umgebungstemperatur...)
Also gut, hier nochmal Code; dieses Mal hab ich meine Vermutungen gleich in den Quelltext reingeschrieben, auch wenns vielleicht unübersichtlich wird... :

C++:

UINT8 RAM_test(UINT32 *adr, UINT32 rng, FILE *fp)
//*adr ist ein ach-so-geliebtes-Pointerchen auf die sogenannte Base-Adress,
//also eine Start-Adresse, ab da wird halt der RAM getestet...
// rng ist die Gesamtanzahl der Datenworte (jeweils 32Bit/4Bytes),
//also 32MB/4B=8M Datenworte
{
    UINT32        i, ii, i_fail;
    UINT32        *v_p;
    UINT32        test_pattern;
    UINT32        rc;
    UINT32        bit_sample;
    UINT8        ret_rc;
    UINT8        break_fl;

    ret_rc = 0;
    // RAM-Test: Schreiben und Lesen ab Basisadresse
    if(fp)
    fprintf(fp,"\nRAM-Test Start (Please get RAM base address at the  end of the test!)\n");
    i_fail = 0;
    break_fl = 0;
    v_p = adr;
             //so, ab hier wird mir unheimlich...das heißt doch: der Pointer v_p zeigt nun auf die gleiche Speicherzelle wie der Pointer adr, ODER?
    for(i=0; i<rng; i++)
//alle Datenworte werden durchgemacht
    {
        test_pattern = 0;
        bit_sample = 0;
        *v_p = 0;
//wird hier der Inhalt, auf den der Pointer v_p zeigt "0" gesetzt???
das heißt doch auch, dass der Inhalt, auf den der Pointer adr zeigt, der gleiche sein muss, also "0"?!??! Wir haben ja 2 Pointer auf eine Zelle...
        if((rc = *v_p) != 0)
        {
            sprintf(c_textpegel,
                "Clear Offs = 0x%x, read 0x%.08x - expected 0\n",
                i*4, *v_p);
//hier wird nochmal getest, ob der Inhalt, auf den v_p zeigt, wirklich "0" ist...

        } else
        {
            test_pattern = 0;
            for(ii=0; ii<32; ii++)
            {
                // set bit nr. ii
                bit_sample = 1 << ii;
                *v_p |= bit_sample;
                test_pattern |= bit_sample;
// und hier wird jetzt in die Datenwörter reingegangen..und mit einer Bitmaske den Inhalt, auf den der Pointer v_p zeigt, "0" gesetzt, ODER?

                if((rc = *v_p) != test_pattern)
                {
                    sprintf(c_textpegel,
                        "Offs = 0x%x, read 0x%.08x - expected 0x%.08x\n", i*4, *v_p, test_pattern);                                                  }
            }
        }
        v_p++;
    }  
}


So, also, wenn das heute noch jemand blickt, dann bin ich echt froh


Bearbeitung von Pablo:

Du hast vergessen, cpp tag zu schliessen


Dieser Post wurde am 29.04.2004 um 15:20 Uhr von Pablo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
013
29.04.2004, 15:34 Uhr
ao

(Operator)


Also bis zu der Schleife über die Bit-Patterns hast du's völlig richtig begriffen.


Zitat:
~Unwissende postete

C++:
            for(ii=0; ii<32; ii++)
            {
                // set bit nr. ii
                bit_sample = 1 << ii;
                *v_p |= bit_sample;
                test_pattern |= bit_sample;
// und hier wird jetzt in die Datenwörter reingegangen..und mit einer Bitmaske den Inhalt, auf den der Pointer v_p zeigt, "0" gesetzt, ODER?

                if((rc = *v_p) != test_pattern)
                {
                    sprintf(c_textpegel,
                        "Offs = 0x%x, read 0x%.08x - expected 0x%.08x\n", i*4, *v_p, test_pattern);                                                  }
            }




Die Variable bit_sample hat in den Schleifendurchläufen nacheinander die Werte
0x00000001,
0x00000002,
0x00000004
usw. bis
0x80000000,
es ist also immer genau ein Bit gesetzt.

Die untersuchte Speicherzelle wird jedesmal mit bit_sample verodert, d.h. *v_p hat nacheinander die Werte
0x00000001,
0x00000003 (1 verodert mit 2),
0x00000007 (3 verodert mit 4),
0x0000000F (7 verodert mit 8)
usw. bis
0xFFFFFFFF (0x7FFFFFFF verodert mit 0x80000000).

Es wird also nichts auf 0 gesetzt (wie du geschrieben hast).

Schreibst du diesen Code gerade oder sollst du ihn verstehen?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
014
29.04.2004, 16:04 Uhr
~Unwissende
Gast


Hallo, danke für die Antwort
ahaaaaaa, nach dem letzten Schleifendurchgang (die Schleife mit der Laufvariable ii) hat ist der Inhalt, auf den v_p zeigt: 1111 1111 1111 1111 1111 1111 1111 1111 (32Bit, binär ausgedrückt).....

Muss den Code verstehen, und das ist echt hart, das Prog besteht glaub aus über 30 Dateien und ich soll eigentlich nur diesen popligen RAM-Test verstehen... und "irgendwas" einbauen, das den Verlauf des Tests aneizeigt. Also mache ich halt einen einfachen Zähler (das Prog ist schon schwer genug...)
Ach ja: A propos Zähler, bin grad am Überlegen:
also, das ist ja die äußere Schleife

C++:
for(i=0; i<rng; i++)


Bei 32MB RAM sind das also 32MB/4B= 8M Datenworte, d.h. 8*1024*1024, also um die 8Mio. Schleifendurchgänge
Die innere Schleife

C++:
for(ii=0; ii<32; ii++)


wird ja auch nochmal 32Mal durchgegangen, also das ergibt jetzt schon einmal
8M*32= etwa 268Mio Schleifendurchgänge.
Nun wird dieser Test aber doppelt ausgeführt, das ergibt also 268*2Mio Schleifendurchgänge= etwa 536Mio Durchgänge...
Der Test dauert ungefähr 2h...
*rechenrechen*
Also pro Sekunde etwa 536Mio/12oMinuten*60Sekunden=74565Durchgänge....
ganz schön viel, oder hab ich mich etwa´verrechnet???


Ok, eigentlich gehört das nicht in dieses Forum, vielleicht gibts ja mal ein Mathe-Forum....
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
015
29.04.2004, 19:05 Uhr
ao

(Operator)



Zitat:
~Unwissende postete
Der Test dauert ungefähr 2h...


Uff!

Nur mal so aus Neugier: Was ist denn das für eine Anwendung, die einen bitweisen Speichertest über 32 MB erfordert? Hoch sicherheitskritisch?

Darfst du was optimieren?

ao
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
016
29.04.2004, 21:29 Uhr
ao

(Operator)


Und wieder ich. Ich hab die Routine mal ausprobiert, und auf meinem PC (P4) braucht sie gerade mal 4 Sekunden.

Was hast du für ne Hardware, die dafür zwei Stunden braucht?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
017
30.04.2004, 11:59 Uhr
~Unwissende
Gast


Bin im Praxissemester und ich soll einen Speichertest erweitern. Nur die GUI erweitern...Optimieren des Speichertests, das wäre dann die advanced-Aufgabe, ich versuche das im Moment, dass das vielleicht die E-Techniker machen, bin ja nur eine kleine Informatikerin
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
018
30.04.2004, 12:07 Uhr
Windalf
Der wo fast so viele Posts wie FloSoft...
(Operator)


wiso soll das ein(e) e-techniker(in) besser können als ein(e) informatikerin.
das ja totaler blödsinn. wer von den beiden sollte den wohl den programmiersprachen näher stehen?
--
...fleißig wie zwei Weißbrote
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
019
30.04.2004, 13:44 Uhr
ao

(Operator)



Zitat:
~Unwissende postete
... bin ja nur eine kleine Informatikerin

Noch! Noch bist du eine Praktikantin und kannst in so einem Praxissemester kaum was verlieren, aber einiges gewinnen.

Später, im Beruf, gibts keine E-Techniker oder Informatikerinnen mehr. Dann gibts nur noch Entwickler(innen), und es kommt kaum noch drauf an, welchen Abschluss du hast, sondern nur noch darauf, was du kannst.

Es ist keine Schande, etwas nicht zu wissen oder nicht gleich zu verstehen. Frag deine Kollegen, oder frag hier im Forum. Praktikanten müssen Fragen haben, das ist normal.

Aber eins solltest du nicht tun: Reflexartig zurückzucken, wenn es technisch wird. Objektiv betrachtet ist dieser Code von der einfachen Sorte, und deine gestandenen Kollegen gehen mit sowas jeden Tag um. Wenn du dich hier schon "zierst", macht das keinen guten Eindruck (zumal das Semester gerade erst begonnen hat, oder?).

Ich will dir keine Angst machen; ich kann mir nicht vorstellen, dass sie alle nur drauf lauern, "dass das Mädel sich blamiert" (obwohl es vielleicht auch solche gibt). Aber ganz sicher ist jemand da, der darauf achtet, wie du dich anstellst.

Zeigs ihnen! Und leg dir einen anderen Namen zu :-)

ao

Dieser Post wurde am 30.04.2004 um 19:13 Uhr von ao editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: [ 1 ] > 2 < [ 3 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: