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

13.05.2017, 11:23

Pointer = Array oder nur variable??

Hallo ich nochmal^^

Ich weiß um ehrlich zu sein nicht ganz, wie sauber ich es hinbekommen kann abzufragen, ob ein übergebener Zeiger ein Zeiger auf das Start-Element eines Arrays ist oder nur einfach eine normale variable?

Mein Ansatz war persönlich am Anfang, stumpf zu kucken, ob die nächsten [x = 3] Elemente auch vom Typ [Y] sind und dann einfach es als [Array of Y] intern zu handhaben, also print(*(c + i)) --> so ungefähr?

Was meint ihr dazu?

Gute Idee oder eher unsauber/ bzw. nur dämlich^^

Wäre super Tipps und Ratschläge zu bekommen!

Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von »ProgFrog« (13.05.2017, 11:46)


Nimelrian

Alter Hase

Beiträge: 1 216

Beruf: Softwareentwickler (aktuell Web/Node); Freiberuflicher Google Proxy

  • Private Nachricht senden

2

13.05.2017, 11:46

Wenn man mit C-Arrays arbeitet (Grundsätzlich nicht empfohlen, lieber die STL mit std::vector und std::array nutzen) übergibt man meist neben dem Pointer auch noch die Größe des Arrays als zusätzlichen Parameter

C-/C++-Quelltext

1
2
3
4
5
6
void fun_does_something_with_array(int* arr, size_t size) {
  for (size_t i = 0; i < size, ++i) {
    int val = arr[i];
    // ...
  }
}


Du kannst übrigens auch nicht einfach schauen, ob *(x+offset) einen bestimmten Typ hat. Das sind einfach Bytes. Je nach Typ werden die dann nur anders interpretiert.
Ich bin kein UserSideGoogleProxy. Und nein, dieses Forum ist kein UserSideGoogleProxyAbstractFactorySingleton.

3

13.05.2017, 11:51

Hmm, aber was wenn ich nur den pointer habe und ich einfach in der Funktion selbst herausfinden will, ob es sich um 1 variable oder ein ganzes Array handelt?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

4

13.05.2017, 11:53

Das solltest du auf gar keinen Fall so prüfen! Nimm die Lösung von Nimelrian.
Ein Pointer ist übrigens eine Variable die eine Adresse auf eine Speicherstelle enthält. Keine Ahnung warum das nie so deutlich gesagt wird.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

5

13.05.2017, 11:54

Hmm, aber was wenn ich nur den pointer habe und ich einfach in der Funktion selbst herausfinden will, ob es sich um 1 variable oder ein ganzes Array handelt?

Das merkst du dann ja über die Längenvariable.

6

13.05.2017, 11:56

Das kann ich ja nicht über die Längenvariable merken, wenn ich NUR ein RAW-POINTER übergeben bekomme, gibt es da gar keine Möglichkeit?

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

7

13.05.2017, 12:02

Du bekommst ja einen Pointer auf einen Gewissen Typ, z.B.: struct Person* person. Wenn du z.B. aus einem char Array einen anderen Typen machen willst must du casten (bzw. in die neue Datenstruktur kopieren (memcpy)) und den Typ kennen. Das kannst du nicht automatisch erkennen.

Beschreib doch mal einfach deinen Use Case, dann können wir dir besser helfen.

8

13.05.2017, 12:04

Ich will ja keinen neuen Typen bauen, sondern nur HERAUSFINDEN, ob der Zeiger der da antanzt, ein Zeiger auf einen dynamisch reservierten Speicherblock ist (Array) oder nur ein Zeiger auf einen primitiven Typen, also kein Array darstellt, sprich wenn es ein einfacher Typ sein sollte, dann müsste *(c + 1) irgendwie Müll ergeben und nicht noch ein Element drin sein, was den gleichen Typen hat.

DeKugelschieber

Community-Fossil

Beiträge: 2 641

Wohnort: Rheda-Wiedenbrück

Beruf: Software-Entwickler

  • Private Nachricht senden

9

13.05.2017, 12:09

Das geht nicht. Es gibt nur Speicher. Nichts sagt dir ob die Daten die an irgendeiner Stelle liegen sinnvoll sind bzw. das Ende eines Arrays markieren.

Nox

Supermoderator

Beiträge: 5 272

Beruf: Student

  • Private Nachricht senden

10

13.05.2017, 12:12

Um nochmal dieFrage von DeKugelschieber zu wiederholen. Was willst du denn eigentlich implementieren. Sprich wozu brauchst du diese Information? Prinzipiell kann man bei einem Raw ptr nicht viel annehmen ohne Zusatzinfos. Eine Variante ist RTTI System. Ggf ist dynamic_cast auch daswas du suchst. ABER wenn du uns sagt warun du diese Anforderung hast, können wir ggf einen besseren Ansatz vorschlagen.
PRO Lernkurs "Wie benutze ich eine Doku richtig"!
CONTRA lasst mal die anderen machen!
networklibbenc - Netzwerklibs im Vergleich | syncsys - Netzwerk lib (MMO-ready) | Schleichfahrt Remake | Firegalaxy | Sammelsurium rund um FPGA&Co.

Werbeanzeige