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

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

1

04.07.2009, 12:30

Zeiger, Speicher und Plattformunabhängigkeit

Hi

Also ich muss jetzt doch nochmal fragen, wie das mit Plattformunabängigkeit
und zugriffen mit Pointern aussieht. Angenommen, ich möchte drei typen
(die ich vorher nicht kenne ) direkt hintereinander im Speicher haben.

Ich würde das wie folgt machen:

C-/C++-Quelltext

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
28
29
30
31
32
33
34
35
36
37
38
39
40
using namespace std;




template<typename T1, typename T2, typename T3>
void* Alc(T1** p1, T2** p2, T3** p3)
{
    if(sizeof(char) != 1)
        return NULL;

    void*   ptr = new char[sizeof(T1) + sizeof(T2) + sizeof(T3)];

    *p1 = reinterpret_cast<T1*>(ptr);
    *p2 = reinterpret_cast<T2*>(ptr) + sizeof(T1);
    *p3 = reinterpret_cast<T3*>(ptr) + sizeof(T1) + sizeof(T2);

    **p1 = 'D';
    **p2 = 577;
    **p3 = 101;
    return ptr;
}



int main()
{
    // Unsere 3 typen die nachher im speicher hintereinander liegen sollen.

    char*   meinAnfangsbuchstabe;
    int*    meinAlter;
    int*    meineArmlaenge;

    if(!Alc(&meinAnfangsbuchstabe, &meinAlter, &meineArmlaenge))
        cout << "Operation nicht möglich !";
    cout << "Mein Anfangsbuchstabe: " << *meinAnfangsbuchstabe << "\nMein Alter: " << *meinAlter << "\nMeine Armlaenge: " << *meineArmlaenge;

    cin.get();

    return 0;
}


Eigentlich müsste das doch jetzt überall funktionieren... oder sind Prozessoren bzw Betriebssysteme so unterschiedlich ?

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

2

04.07.2009, 12:54

Naja, wenn du z.B. zuerst ein char speicherst und danach ein int, dann ist der int "unaligned" (seine Adresse ist kein Vielfaches seiner Größe). Damit ist das Verhalten undefiniert.
Zudem ist das Ergebnis von reinterpret_cast ebenfalls undefiniert. Das einzige, dessen du dir sicher sein kannst, ist dass wenn du es wieder zurück castest, du wieder den Originalwert bekommst.

Ich denke, auch hier finden wir eine Lösung ;)
Sag uns, was du erreichen willst.
Wie wäre es mit boost::tuple?

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

3

04.07.2009, 13:40

Einfach wäre es die Daten in Inline-Assembler zu definieren, dann liegen sie ohne Padding im Speicher.

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

4

04.07.2009, 14:48

Das will er garantiert nicht, denn dann wäre die Plattformunabhängigkeit endgültig dahin.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

6

04.07.2009, 15:12

Wenn Daten im Speicher unaligned sind, dann führt das nicht zwangsläufig zu undefiniertem Verhalten, sondern der Zugriff auf die Daten ist einfach langsamer. So hat man uns das jedenfalls letztens in der Info-Vorlesung erklärt.
<< an dieser Stelle ist eine Signatur verstorben >>

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

7

04.07.2009, 15:26

Soweit ich weiß, unterstützen manche CPUs sowas gar nicht. Aber das sind wohl eher exotischere CPUs. Trotzdem ist es keine schöne Lösung, das geht auf jeden Fall besser.

K-Bal

Alter Hase

Beiträge: 703

Wohnort: Aachen

Beruf: Student (Elektrotechnik, Technische Informatik)

  • Private Nachricht senden

8

04.07.2009, 16:04

Zitat von »"the[V«

oid"]Wenn Daten im Speicher unaligned sind, dann führt das nicht zwangsläufig zu undefiniertem Verhalten, sondern der Zugriff auf die Daten ist einfach langsamer. So hat man uns das jedenfalls letztens in der Info-Vorlesung erklärt.


Du warst ernsthaft bei Info UND hast aufgepasst? :D

9

04.07.2009, 16:06

Zitat

C-/C++-Quelltext

1
2
    if(sizeof(char) != 1)
        return NULL;

wozu? sizeof(char) ist durch den standard mit 1 definiert.

@K-Bal
ich hab in Info ständig aufgepasst und den infolehrer korrigiert (und in der berufsschule hab ich mir vorgenommen es genauso zu machen^^)

Databyte

Alter Hase

  • »Databyte« ist der Autor dieses Themas

Beiträge: 1 040

Wohnort: Na zu Hause

Beruf: Student (KIT)

  • Private Nachricht senden

10

04.07.2009, 16:53

Naja also... ich denke es hat sowieso keinen sinn um den heißen brei herrumzureden...;)
Also ich hatte eigentlich vor eine Scriptsprache zu programmieren.
Ich sehe da eigentlich auch kein Problem, bis auf das ich gerne was OOP-mäßiges hätte ;)
Das Problem dabei ist allerdings, die Objekte wieder ordentlich aufzuräumen... zwar gibts da mehrere möglichkeiten aber ich habe irgendwie
keine Lust das so richig zu programmieren ;)
Weiteres großes Problem ist die Komunikation zwischen dem Programm,
der Scriptsprache und dem Script.... naja egal....

Im endergebniss läuft es wieder darauf hinaus, dass ich mir eine fertige script-sprache suchen muss :)
und ja: ich habe mir Lua, Pyton, ruby angeguckt und obwohl ich sagen muss,
dass mir Luabind in hinsicht des C++-Designes sehr gut gefallen hat, kann ich mich einfach nicht für Lua begeistern...
Die einzige Scriptsprache die ich bis jetzt gefunden habe, die mir wirklich gefällt ist UnrealScript... aber da sehe ich leider keine möglichkeit die zu benutzen...
Mich interessiert jetzt noch welche anderen script-sprachen es gibt... es kann ja nicht mit den da oben gewesen sein...
ist noch niemand auf die idee gekommen C++ als eine Scriptsprache zu programmieren (also natürlich angepasst ) ;) ?
Was mich nämlich richtig stört sind diese wörter wie "end" und "begin" und co.
ich möchte einfach nur meine Klammern haben {} ;)

Werbeanzeige