Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

23.07.2008, 16:04

[Erledigt] memset - unklarheit bezüglich dem Verhalten...

Guten Tag zusammen

Kann mir jemand erklären wieso das ich bei folgedem Test Programm

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <iostream>

using namespace std;

int main()
{
    int* pWert = new int[8];
    int Wert[8];
    memset(pWert, 12, (sizeof(int) * 8));
    memset(Wert, 12, (sizeof(int) * 8));
    
    cout<<pWert[2]<<endl;
    cout<<Wert[2]<<endl;
    delete[] pWert;
    return(0);
}

Folgendes Ergebniss erhalte:

202116108
202116108

Ich hätte jetzt 12 erwartet... mit 0 wird aber auch tatsächlich 0 ausgegeben.

Noch ne andere Frage am Rande:
Wenn ich eine Datei mittels

Quellcode

1
File* logfile = fopen("logfile.log", "w");

geöffnet habe, kann ich dann diese wärend des gesammten Programms gehöffnet lassen und erst bei beendigung des Programms schliessen?
Oder ist sowas unsauber? Es würde mir einige Zeilen erparren, da ich dann einfach ohne jedensmal zu öffnen ins log reinschreiben könnte und den stream nur einmal am Ende des Programms wieder schliessen müsste.

Gruss neptun

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

2

23.07.2008, 16:14

Memset macht in etwa sowas:

C-/C++-Quelltext

1
2
3
4
5
int foo[ 8 ];
unsigned char* p = ( unsigned char* )foo;

for ( int i = 0; i < 8*sizeof(int); ++i )
    p[ i ] = 12;


Die Ausgabe passt also.

Zu 2:
Ja, kannst du machen.
@D13_Dreinig

3

23.07.2008, 16:31

Ich verstehe es noch nicht... so müsste das Ergebniss ja klar 12 sein. Wieso wird nicht 12 ausgegeben?

Zu 2:
Ok, ich werds umsetzen :)

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

4

23.07.2008, 16:39

Zitat von »"neptun"«

Ich verstehe es noch nicht... so müsste das Ergebniss ja klar 12 sein. Wieso wird nicht 12 ausgegeben?


Nein, das Ergebnis muss klar 202116108 sein. Dein int wird nämlich in 4 Byte aufgesplittet und jedes Byte bekommt den Wert 12. Im Prinzip sähe das dann so aus:

C-/C++-Quelltext

1
2
3
b1 b2 b3 b4
--------------
12 12 12 12


Wenn dein int den Wert 12 haben sollte dürfte nur Byte 4 diesen Wert haben:

C-/C++-Quelltext

1
2
3
b1 b2 b3 b4
-------------
00 00 00 12


Wenn du nun die Bytes zu einem int zurückkonvertirst

C-/C++-Quelltext

1
( b1 << 24 ) | ( b2 << 16 ) | ( b3 << 8 ) | b4


bekommst du:

C-/C++-Quelltext

1
2
3
4
5
12 << 24 = 12 * 256 * 256 * 256 = 201326592 +
12 << 16 = 12 * 256 * 256 = 786432 +
12 << 8 = 12 * 256 = 3072 +
12
= 202116108


Stimmt also alles...

Das von dir gewünschte Verhalten kannst du ganz einfach nachbilden:

C-/C++-Quelltext

1
2
3
4
5
6
template< typename T >
void SetArray( T* buffer, const T& value, unsigned size )
{
    while ( --size )
        buffer[ 0 ] = value, ++buffer;
}
@D13_Dreinig

5

23.07.2008, 16:46

Jetzt ist mir alles klar :)
Danke für die Erklärung!

Werbeanzeige