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

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

11

21.11.2013, 14:56

Nicht unbedingt. Padding und Alignment kann einem einen Strich durch diese Rechnung machen.

Aber nicht bei Arrays.

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

12

21.11.2013, 15:05

Archi, ist mit Liste nicht in den allermeisten Fällen eine verkettete Liste gemeint? Durch diese Iteriert man doch ganz anders. Du meintest wohl ein Array(list) oder Vector?

Jap. Ein typisches Array ist ja nur eine Hintereinanderreihung (also eine Liste wenn man will) von Speicher. Erbsenzähler. :P
Die nächste Adresse ist nur n bytes entfernt, wobei n = sizeof(TYPE).
Wenn ich also einen Pointer hochzähle, dann weiß der Compiler anhand des Typs des Pointers (z.B. int bei int*) dass er sizeof(TYPE) Bytes addieren muss, um zur nächsten Speicheradresse zu kommen. Bei int wären es z.B. 4 bytes. So kann bspw. über eine Liste iteriert werden.

Nicht unbedingt. Padding und Alignment kann einem einen Strich durch diese Rechnung machen.

Wie David schon sagt, AFAIK nicht bei Arrays.
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

NachoMan

Community-Fossil

Beiträge: 3 885

Wohnort: Berlin

Beruf: (Nachhilfe)Lehrer (Mathematik, C++, Java, C#)

  • Private Nachricht senden

13

21.11.2013, 15:39

@Archi: Da bei der Programmierung ist nichts wichtiger ist als Präzision gibt es keine Erbsenzähler unter den Programmierern. Zumindest solang es um genau darum geht. Im Studium hätte man dir sicher auch einen Punkt abgezogen wenn du diesen Fehler gemacht hättest oder?
@TigerClaw25: Um die OOP richtig zu verstehen benötigst du viel Zeit, Übung und Lesestoff. Letzteres kann ich dir anbieten: http://openbook.galileocomputing.de/oop/ (ja, ich poste es so oft, weil ich es echt klasse find!)
"Der erste Trunk aus dem Becher der Erkenntnis macht einem zum Atheist, doch auf dem Grund des Bechers wartet Gott." - Werner Heisenberg
Biete Privatunterricht in Berlin und Online.
Kommt jemand mit Nach oMan?

Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

14

21.11.2013, 16:00

@Archi: Da bei der Programmierung ist nichts wichtiger ist als Präzision gibt es keine Erbsenzähler unter den Programmierern. Zumindest solang es um genau darum geht. Im Studium hätte man dir sicher auch einen Punkt abgezogen wenn du diesen Fehler gemacht hättest oder?

Abgesehen davon das so etwas nie abgefragt wird (jedenfalls noch nie abgefragt wurde) bezweifle ich es. Hier gibt es nur Java und C#, da ist eine List / ArrayList automatisch als Array angesehen. Und Präzision würde ich nicht als das wichtigste bei der Programmierung bezeichnen, aber vllt. haben wir falsche Vorstellungen von der Bedeutung des Wortes.^^
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Schorsch

Supermoderator

Beiträge: 5 145

Wohnort: Wickede

Beruf: Softwareentwickler

  • Private Nachricht senden

15

21.11.2013, 16:32

Die Diskussion geht auch denke ich am Thema vorbei;) Präzision hin oder her. Bei uns im Studium hätte das übrigens eine reelle Frage sein können. Wir haben statt C# eher C++;) Dass man das mit Listen jedoch auch falsch verstehen kann kann ich nachvollziehen. Schnell denkt man da möglicherweise an eine std::list und dann sieht die Welt schon wieder anders aus. Die Iteratoren dort haben aber den ++ Operator überladen. So kannst du std::iteratoren zum Beispiel hochzählen, wobei dort nicht einfach eine Speicherstelle hochgezählt wird, sondern der Iterator auf das nächste Element gesetzt wird. Je nach Typ deines Containers können die Elemente ja völlig anders angeordnet sein. Da kümmert sich dann der Iterator von allein drum. Bei Arrays kann man wie schon angesprochen bei einem einfachen Zeiger von einem Iterator sprechen und diesen auch ganz normal erhöhen wie gewohnt. Da bei Arrays die Elemente hintereinander im Speicher liegen funktioniert das ohne weiteres. Aber auch hier kann man abstrahieren, wie es bei der C++ Standardbibliothek gemacht wird.
„Es ist doch so. Zwei und zwei macht irgendwas, und vier und vier macht irgendwas. Leider nicht dasselbe, dann wär's leicht.
Das ist aber auch schon höhere Mathematik.“

BlueCobold

Community-Fossil

Beiträge: 10 738

Beruf: Teamleiter Mobile Applikationen & Senior Software Engineer

  • Private Nachricht senden

16

21.11.2013, 17:44

Nicht unbedingt. Padding und Alignment kann einem einen Strich durch diese Rechnung machen.

Aber nicht bei Arrays.
Habe ich auch nicht behauptet. Speziell bei Structs und Klassen ist das Problem üblich.

Wie David schon sagt, AFAIK nicht bei Arrays.
Erm, ja, ich seh's auch wenn es nur einer schreibt. Ich habe aber nie über Arrays geredet und Du auch nicht nur über diese. Es ist dann halt wichtig das im Kopf zu haben. "Über eine Liste" ist genau genommen sogar falsch. Es geht bei Vektoren, bei Listen aber nicht.
Teamleiter von Rickety Racquet (ehemals das "Foren-Projekt") und von Marble Theory

Willkommen auf SPPRO, auch dir wird man zu Unity oder zur Unreal-Engine raten, ganz bestimmt.[/Sarkasmus]

TigerClaw25

unregistriert

17

21.11.2013, 18:24

Bei mir ist eben auch das Problem, dass ich manchmal zu viel hinterfrage. Beispielsweise verwendet man im SDL Game Buch einen Texturmanager, zum laden, zeichnen und animieren der Bilder. In der Game.h wird dann eine Insanz des Objekts erzeugt, aber nicht als Zeiger, sondern so: TextureManager m_textureManager;

Versteh nicht, warum manchmal Zeiger verwendet werden und manchmal nicht. In diesem Fall wäre es doch auch ok einen Zeiger zu verwenden ... übrigens verwendet der Autor im Buch zum Laden von Bildern die sogenannten Maps,, sodass Bilder 1x geladen und dann per IF entsprechend animiert werden können. Den Sinn habe ich nur nicht verstanden.

-------------------------------------------------------------------
EDIT: Oder das Thema Singleton: Im TexturManager.h habe ich eine Singleton-Klasse. Diese wird dann in der Game.cpp wie folgt aufgerufen: TheTextureManager::Instance()->draw("animate", 0, 0, 128, 82, m_pRenderer);

In Kalistas Buch aber rufe ich diese wie folgt auf: Game::Instance()->draw("animate", 0, 0, 128, 82, m_pRenderer);
Hat das damit zutun, dass in Kalistas Buch ein Templater verwendet wird? Normalerweise liefert die Singleton Klasse bzw. die FUnktion einen Zeiger auf die Klasse zurück, die ich auch erzeuge oder?

Kalistas Buch: class CLOgfile : Public TSingleton<CLogfile> also erbt die Klasse von der Singletonklasse. In dem SDL Buch aber steht nichts mit vererben, denn ich rufe meine FUnktionen direkt mit der Klasse auf, in der sich die Singfletonfunktion befindet, kapiere es nicht.

Meine Vermutung. Wenn ich einen TExturmanager habe, über den ich in meiner Games-Klasse die Daten laden möchte, verwende ich einfach den Texturmanager selbst. In Kalistas Buch möchte ich aber eine neue Instanz einer anderen Klasse erzeuge wie CLogfile, die von Singleton erben soll. Im SDL Buch aber erbt die Klasse Games nichts von Texturmanager, da ich den Texturmanager direkt verwende. Einziges Problem, ich muss mit typedef einen Bezeichner erstellen oder?

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
41
42
43
44
45
#ifndef __TextureManager__
#define __TextureManager__

#include <iostream>
#include <string>
#include <map>
#include "SDL.h"
#include <SDL_image.h>

class TextureManager
{
public:
    bool load(std::string fileName,std::string id,
        SDL_Renderer* pRenderer);

    // draw
    void draw(std::string id, int x, int y, int width, int
        height, SDL_Renderer* pRenderer, SDL_RendererFlip flip =
        SDL_FLIP_NONE);
    // drawframe
    void drawFrame(std::string id, int x, int y, int width, int
        height, int currentRow, int currentFrame, SDL_Renderer*
        pRenderer, SDL_RendererFlip flip = SDL_FLIP_NONE);

    std::map<std::string, SDL_Texture*> m_textureMap;
    
    // Singleton
    static TextureManager* Instance()
    {
        if(s_pInstance == 0)
        {
            s_pInstance = new TextureManager();
            return s_pInstance;
        }
        return s_pInstance;
    }

private:
    TextureManager(){}
    static TextureManager* s_pInstance;

};

typedef TextureManager TheTextureManager;
#endif /* defined(__TextureManager__) */


C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
...............
else
    {
        std::cout << "SDL init fail\n";
        return false; // SDL init fail
    }
    std::cout << "init success\n";
    m_bRunning = true; // everything inited successfully,
    
    
    // Lade über TextureManager (Singleton) mit ID als MAP
    TheTextureManager::Instance()->load("animate-alpha.png", "animate", m_pRenderer);

    return true;    
}
...............


Hier verwende ich direkt ohne Deklaration oder ähnliches direkt den Texturmanager. In Kalistas Buch wird es aber somgezeigt, dass die Klasse CLogfile von CSingleton erbt, liegt wahrscheinlich daran, dass ich eine Instanz einer anderen Klasse erstelle und nicht von der Singleton selbst. Das ich aber Texturmanager einfach so in der Games.cpp verwenden kann wundert mich ...

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »TigerClaw25« (21.11.2013, 18:50)


Architekt

Community-Fossil

Beiträge: 2 481

Wohnort: Hamburg

Beruf: Student

  • Private Nachricht senden

18

21.11.2013, 19:40


Wie David schon sagt, AFAIK nicht bei Arrays.
Erm, ja, ich seh's auch wenn es nur einer schreibt. Ich habe aber nie über Arrays geredet und Du auch nicht nur über diese. Es ist dann halt wichtig das im Kopf zu haben. "Über eine Liste" ist genau genommen sogar falsch. Es geht bei Vektoren, bei Listen aber nicht.

Oller Griesgram ;)
Der einfachste Weg eine Kopie zu entfernen ist sie zu löschen.
- Stephan Schmidt -

Werbeanzeige