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

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

11

28.04.2005, 22:27

Ja,sorry ist ein Schreibfehler gewesen,natürlich hat pcZeiger den gleichen
Wert und Adresse von cWert1.Nur nach der Verschiebung kommt der Hammer.Mal sehen habe mal in einen C++ Forum selbst,auch einmal gepostet,vielleicht hat da jemand eine Lösung für mein Problem.

mfg Bonsai ;)

12

28.04.2005, 22:36

du willst wohl einfach nicht verstehen dass das kein problem ist oder?

dein compiler wird einfach alles auf 4-byte ausrichten.
das heißt dass zwischen zwei 1-byte variablen 3-byte frei bleiben.
ich gehe aber mal schwer davon aus dass das bei arrays nicht der fall ist.
wenn du nun dein prog auf einem anderen rechner startest dann ist das egal.
geht genauso.

ich gehe auch davon aus das dein compiler eine möglichkeit bietet
diese optimierung zu deaktivieren sofern es denn eine ist.
was fürn compiler benutzt du denn?
beim vc++ könntest du es z.b. mit
#pragma pack(1)
versuchen einfach mal an den anfang der datei schreiben.

peace
23h

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

13

28.04.2005, 22:53

Hi 0x00000023

erstmal Danke,für die Hilfe.Ich verwende VC++ 6.0 Standard.Das mit den Arrays werde ich mal testen.Aber gut wenn es da keine schwierigkeiten gibt,dann kriege ich das schon hin.
Ich prob. das mal mit den

#pragma pack(1)

aus.Ich danke dir für die Hilfe.

mfg Bonsai :)

14

28.04.2005, 22:59

jo klar kein stress.

aber ich hab da noch ein paar neuigkeiten für dich:

ich hab mal schnell das gl. prog. mit vc.net gebaut:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
int main(){
    using namespace std;
    UCHAR       a = 1;
    UCHAR       b = 2;
    UCHAR       *c = &a;

    cout<<"a: "<<(unsigned int)&a<<endl;
    cout<<"b: "<<(unsigned int)&b<<endl;
    cout<<"c: "<<(unsigned int)c<<endl;
    getch();
    return 0;
}


ausgabe ist das hier:

a: 1244899
b: 1244898
c: 1244899

wie du siehst ist hier alles so wie du es erwarten würdest.
also ich wunder mich schon etwas das der vc 6 das so komplett
anders machen soll als der vc 7

#pragma pack() wird warhscheinlich sowieso nix bringen weil das glaub ich
nur für structs & classes wirkt aber nicht sicher ^^

15

28.04.2005, 23:05

übrigens noch was, lol, du musst pcZeiger--; machen nicht ++;
liegt daran wie der stack aufgebaut ist.
das solltest du vielleicht beachten und es nochmal versuchen.
verusch das mal mit deinem obrigen code und schau obs dann geht,
es KÖNNTE sein.

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

16

28.04.2005, 23:09

jup hattest recht,mit

#pragma pack(1) das hat nichts gebracht.Habe das ganze jetzt mit Arrays getestet,und da macht er das ganze normal.Irgendwie komisch,
aber ich werden mal das mit dem namespace auch mal ausprobieren.
Mal sehen was dabei rauskommt.Und das mit dem pcZeiger-- teste ich
auch gleich mal mit.Danke dir.

17

28.04.2005, 23:10

äh...das mit dem namespace war nur für "cout" ^^
hat ABSOLUT NIX mit deinem problem zu tun

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

18

29.04.2005, 09:03

Beim Anlegen von Speicher hat der Compiler ein Alignment i.d.R. 4 Bytes nach den er alles ausrichtet. Das stimmt aber nicht ganz, da es auch drauf ankommt in welcher Reichenfolge du Speicher reservierst:

Kuck dir folgende drei Beispiele an und überleg dir wie groß der reservierte Speicher sein wird. Tip: int = 4 Bytes, short = 2 Bytes und char = 1 Byte.

Beispiel 1:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>

class CEntity
{ 
    public:
        CEntity() { }

    public:
        char m_cValue3;
        int m_iValue1;
        short m_sValue2;
};

int main()
{
    CEntity en;

    unsigned int size = sizeof( en );

    std::cout << size << std::endl;

    std::cin.get();

    return 0;   
}


Beispiel 2:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#include<iostream>

class CEntity
{ 
    public:
        CEntity() { }

    public:
        int m_iValue1;
        short m_sValue2;
        char m_cValue3;
};

int main()
{
    CEntity en;

    unsigned int size = sizeof( en );

    std::cout << size << std::endl;

    std::cin.get();

    return 0;   
}


Beispiel 3:

Quellcode

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>

#pragma pack(1)

class CEntity
{ 
    public:
        CEntity() { }

    public:
        char m_cValue3;
        int m_iValue1;
        short m_sValue2;
};

int main()
{
    CEntity en;

    unsigned int size = sizeof( en );

    std::cout << size << std::endl;

    std::cin.get();

    return 0;   
}


Du denkst wahrscheinlich, dass es immer 7 Byte sind!?

Ergebnis:
Beispiel 1: 12 Byte
Beispiel 2: 8 Byte
Beispiel 3: 7 Byte

Der Compiler kann in verschiedenen Grenzen ausrichten. Im ersten Fall muss er char nach int ausrichten und short muss ebenfalls ausgerichtet werden, da char ausgerichtet wurde. Das heißt int bestimmt das Alignment mit 4 Bytes, Ergebnis: 12 Bytes!

Beim zweiten Fall steht der Größte Wert als erstes in der Liste der Member, da sieben Byte aber nicht in die Alignment Grenze fallen, wird ein Speicher von 8 Byte reserviert.

Beim dritten Beispiel schaltest man mit #pragma pack(1) das Alignment ab und alles wird mit seinem originalen Wert reserviert, daher 7 Bytes.

Abschalten von Alignment ist keine gute Idee, wenn du für verschiedene Platformen entwickeln willst. Daher solltest du einfach deine Member immer nach Größe sortieren und so möglichsten wenig Speicher beanspruchen.

So ich hoffe ich habe überhaupt dein Problem erkannt und hoffe der kleine Ausflug in die Welt des Memory Alignment hat dir weiter geholfen.

Bonsai

Frischling

  • »Bonsai« ist der Autor dieses Themas

Beiträge: 37

Wohnort: Bayreuth

  • Private Nachricht senden

19

29.04.2005, 12:47

Hallo Weigo

Du hast vollkommen recht,mit dem Memory Alignment innerhalb einer
Klasse oder von Strukturen,da stimmt das so wie du es gesagt hast.
Auch kann ich hier mit Pragma Pack(1) das Alignment ausschalten.
Das selbe hat 0x00000023 gestern auch gesagt.
Nur habe ich das Prob. das auf der Lokalen Ebene drei UCHAR Datentypen
trotzdem einen 4Byte Abstand zueinander haben,wo ich keinen anderen
Datentyp (also int,oder short Wert) dazwischen oder davor oder dannach
habe.

Auf der anderen Seite,zugegeben,ist mein Beispiel oben eigentlich dumm,
weil wer würde schon auf lokaler Ebene einen Zeiger auf Lokale Variablen
scheiben.Ich denke soetwas würde eh nur Sinn im Heap machen,wenn überhaupt.

Aber ich danke auch dir für die ausführliche Erläuterung des Memory Alignments,das ist nämlich alles noch etwas Neuland für mich.
Aber ich finde es super das sich,hier auch Leute die Zeit nehmen anderen
zu helfen.

mfg Bonsai :huhu:

weigo

Treue Seele

Beiträge: 234

Wohnort: Deutschland

  • Private Nachricht senden

20

29.04.2005, 13:10

Kein Problem.
Ich bin froh, wenn ich jemanden helfen kann und ich denke, dass wenn ich mir eine Antwort überlege, dann muss ich das für mich selbst noch mal aufarbeiten und lerne dabei vielleicht wieder was Neues. Falls dann jemand noch Einwende hat oder alternative Ergänzungen, dann hat sich die Antwort sogar für einen selbst gelohnt.
In der Wirtschaftswissenschaft spricht man vom Egoisten Prinzip :)

Werbeanzeige