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

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

1

22.08.2008, 15:55

Stimmt der Code?

Hi,

ich muss exakt 4320 Bytes eines Speicherbereichs mit einem 12 Bit Wert füllen. Somit passen in 3 Bytes immer 2 Werte. Die 12 Bit Werte sind in der variablen "short s" gespeichert, der Zeiger auf den Speicher heisst pcMem. Der Wert in s soll jedes mal um 1 erhöht werden(also zuerst muss er in 1.5 bytes geschrieben werden, danach inkrementiert, dann in die nächsten 1.5 bytes geschrieben werden). Meine Frage also: Funktioniert mein Ansatz? Was mein ihr?

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
    short   s   =   0;
    char    *pcMem  =   new char[9*512];
    memset(pcMem, 0, 9*512);
    for(unsigned i = 0; i < 4320; i += 3, s += 2)
    {
        pcMem[i]    =   s & 0x00FF;
        pcMem[i+1]  =   s & 0x0F00 + ((s+1) & 0x000F);
        pcMem[i+2]  =   s & 0x0FF0;
    }


PS: Es geht nicht um Geschwindigkeit, der Code muss einfach nur Funktionieren.

Socke

2

22.08.2008, 16:05

Wenn du noch sagst, warum dein Array 4608 groß ist, du aber nur wesentlich weniger nutzt?

(1) std::memset ist überflüssig
(2) ++i rockt ;)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
short s(0);
char* ptr_temp(new char[9*512]);

for (std::size_t i(0); i < 4320; s += 2)
{
    ptr_temp[i++] = s & 0x00FF;
    ptr_temp[i++] = s & 0x0F00 + ((s+1) & 0x000F);
    ptr_temp[i++] = s & 0x0FF0;
}

delete [] ptr_temp;
Deine Byte-Logik da jetzt mal nicht kontrolliert.

Besser noch (schneller ...)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
short s(0);
char* ptr_temp(new char[9*512]);
const char* ptr_last(ptr_temp + 4320);

for (char* ptr_it(ptr_temp); ptr_it != ptr_last; s += 2)
{
    *ptr_it++ = s & 0x00FF;
    *ptr_it++ = s & 0x0F00 + ((s+1) & 0x000F);
    *ptr_it++ = s & 0x0FF0;
}

delete [] ptr_temp;
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

p0llux

Treue Seele

Beiträge: 101

Wohnort: Aachen

Beruf: HiWi (theo. Inf.)

  • Private Nachricht senden

3

22.08.2008, 16:19

@developer:

Ich würde mir solches C-Gemetzel sparen. Die Originalversion ist um einiges leichter zu lesen und mit einem gescheiten Compiler wird sie auch nicht schlechter sein.

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

4

22.08.2008, 16:25

Devil, die anderen Bytes, die ich nicht bearbeite, müssen vorhanden sein(die größe muss ein vielfaches von 512 sein), und das memset brauche ich deshalb, damit diese auf 0 gesetzt sind.

PS: Mein Code scheint nicht korrekt zu funktionieren, oder ich kann mit Hex Editoren nicht umgehen.

Socke

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

5

22.08.2008, 16:26

na sag uns halt mal wie der 12bit wert da aussehen soll, bzw. was du mit dem code da genau erzeugen willst...

Faule Socke

Community-Fossil

  • »Faule Socke« ist der Autor dieses Themas

Beiträge: 1 915

Wohnort: Schreibtischstuhl

  • Private Nachricht senden

6

22.08.2008, 16:39

@dot: Ich will ne FAT12 Tabelle schreiben. Und wie der 12 Bit wert aussehen soll... was meinst du damit? Es müssen halt 12 Bit Werte als Zahlen hintereinander geschrieben werden, die Zahl muss dabei mit jedem Wert um 1 erhöht werden. Dass einige Bytes "überstehen" kommt daher, dass die FAT immer nur Sektorweise geschrieben werden kann und alles was nach ihr kommt muss im nächsten Sektor liegen(1 Sektor = 512 Bytes in meinem Fall). Da ich das ganze zuerst in einer Datei speichere und danach auch noch andere Daten kommen(FAT ist zwei mal vorhanden), muss ich also darauf achten, dass die Tabelle eine Länge von 9 Sektoren hat(in 8 passt sie nicht), sonst würde ja die zweite Tabelle schon im Sektor der vorherigen beginnen und naja das resultat wären wohl fehlermeldungen.

Socke

7

22.08.2008, 17:16

@p0llux: Nein, Indexoperator wird nicht durch Zeiger ersetzt ... Hab 2008er Team Edition und dessen CodeAnalyst drüber geheizt. Der ist der selben Meinung wie ich. Zeiger rocken!
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

David_pb

Community-Fossil

Beiträge: 3 886

Beruf: 3D Graphics Programmer

  • Private Nachricht senden

8

22.08.2008, 22:55

Zitat von »"Deviloper"«

Zeiger rocken!


Nur bedingt...
@D13_Dreinig

grek40

Alter Hase

Beiträge: 1 491

Wohnort: Dresden

  • Private Nachricht senden

9

23.08.2008, 01:32

soweit ich die Anforderung verstanden hab muss man hier mal bisschen bitshiften...

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
short s = 0;
char* p = new char[x];

int i = 0;

while (i < 4320)
{
  p[i++] = s & 0x00ff;
  p[i] = (s & 0x0f00) >> 8;

  ++s;

  p[i++] |= (s & 0x000f) << 4;
  p[i++] = (s & 0x0ff0) >> 4;

  ++s;
}

10

23.08.2008, 17:05

Bin ich gerade verpeilt oder du ... du schreibst in p 2x nen Wert ;)
Devil Entertainment :: Your education is our inspiration
Der Spieleprogrammierer :: Community Magazin
Merlin - A Legend awakes :: You are a dedicated C++ (DirectX) programmer and you have ability to work in a team? Contact us!
Siedler II.5 RttR :: The old settlers-style is comming back!

Also known as (D)Evil

Werbeanzeige