Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 07:44

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C++] Write to a Pointer

Discussion on [C++] Write to a Pointer within the C/C++ forum part of the Coders Den category.

Reply
 
Old 03/15/2012, 16:09   #16
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Quote:
Originally Posted by Metin2Spieler97 View Post
Das ARRAYSIZE-Makro macht auch nicht viel anderes als sizeof zu benutzen.
Richtig.
Code:
#define ARRAYSIZE(a) \
  ((sizeof(a) / sizeof(*(a))) / \
  static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
jacky919 is offline  
Old 03/15/2012, 16:10   #17
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
Also sind wir uns nun einig, dass mein erster Post richtig war? ;O
ms​ is offline  
Old 03/15/2012, 16:28   #18
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Das Nutzen des Makros in Kombination mit einem Zeiger würde nicht funktionieren.
jacky919 is offline  
Old 03/15/2012, 19:55   #19


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Nein, sind wir nicht.

Das richtige ArraySize Makro funktioniert sehr wohl mit Pointern, es wirft da nämlich nen Compiler-Fehler, dass die Aktion nicht erlaubt ist :P
Während ein selbstdefiniertes Makro mit sizeof die Größe des Pointers nutzen und damit rechnen würde.

Quote:
char *c und char c[] sind als Parameter genau das selbe.
In C vielleicht, in C++ nicht.

Zumindest VS sieht es einfach so, dass es selbst die Größe zu erkennen hat.
MrSm!th is offline  
Old 03/16/2012, 17:02   #20
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
Dass ein Pointer und ein Array zwei verschiedene Sachen sind ist klar.

Ich bin mir aber ziemlich sicher, dass als Parameter char *c und char c[] genau das selbe ist.
ms​ is offline  
Old 03/16/2012, 17:17   #21
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Bis darauf, dass bei dem Pointer ARRAYSIZE nicht richtig funktionieren würde, ist es dasselbe.
jacky919 is offline  
Old 03/16/2012, 17:21   #22
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
Was wiederrum eine Eigenart von Visual C++ wäre, da sizeof ja nicht die Länge eines Arrays als Parameter herausfinden kann.

Ich glaube wir drehen uns hier im Kreis.
ms​ is offline  
Old 03/16/2012, 17:52   #23
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Habe dir Unrecht getan
Wenn ARRAYSIZE mit einem formalen Parameter genutzt wird, gibt es wirklich die Größe des Zeigers zurück.
jacky919 is offline  
Old 03/17/2012, 15:11   #24


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,904
Received Thanks: 25,394
Wir hatten beide Recht.

Um euch beim ARRAYSIZE Makro zu korrigieren:

Wie ich bereits sagte, es ist nicht einfach als sizeof(array)/sizeof(array[0]) definiert, deshalb gibt es keine Rechenfehler bei Pointern, die man diesem Makro übergibt.
Stattdessen wirft es einen Compiler-Fehler, da er die größe des Arrays nicht herausfinden kann.

M2S du hattest insofern Recht, dass es bei Parametern nicht möglich ist, da kommt dann wirklich die Meldung, er könne die Größe nicht von char [] herleiten, genau wie bei char * (habs mit char Arrays getestet). Bei statisch deklarierten Arrays wiederum funktioniert es. Das gilt aber für jegliche Arten von Arrays als Parametern, selbst, wenn man die größe explizit mit char param[42] angibt, kann er sie nicht herleiten (da musste ich den Umweg gehen und eine lokale Variable erstellen und den Inhalt aus dem Parameter kopieren).

Bei lokalen/globalen Variablen funktioniert es wie erwartet mit beiden Varianten, char var[42] oder auch char var[], wobei bei letzterem ja dann die Größe automatisch erkannt wird.

Übrigens ist das ganze keine Eigenart von VS, sondern ein wohldefiniertes Verhalten des ARRAYSIZE Makros, welches im WinDDK definiert ist.
Genauer gesagt gibt es 2 Varianten, eine Version für C und eine für C++. Erstere verhält sich so, wie ihr es bereits gesagt habt, zweitere ist folgendermaßen definiert:

Code:
template <typename T, size_t N>
char (*RtlpNumberOf( UNALIGNED T (&)[N] ))[N];

#define RTL_NUMBER_OF_V2(A) (sizeof(*RtlpNumberOf(A)))
MrSm!th is offline  
Old 03/18/2012, 11:01   #25
 
elite*gold: 0
Join Date: Aug 2009
Posts: 127
Received Thanks: 27
heißt also quasi wenn ich die Größe nicht jedesmal als Parameter mitgeben will muss ich in der Funktion eine Variable erstellen die den Parameter kopiert, deren größe auslesen und damit arbeiten hab ich das jetzt richtig verstanden?
theredvex is offline  
Old 03/18/2012, 11:05   #26
 
elite*gold: 50
Join Date: Mar 2010
Posts: 1,373
Received Thanks: 521
Verwnde std::vector
jacky919 is offline  
Old 03/18/2012, 12:50   #27
 
elite*gold: 115
Join Date: Oct 2007
Posts: 9,390
Received Thanks: 12,344
Quote:
Originally Posted by theredvex View Post
heißt also quasi wenn ich die Größe nicht jedesmal als Parameter mitgeben will muss ich in der Funktion eine Variable erstellen die den Parameter kopiert, deren größe auslesen und damit arbeiten hab ich das jetzt richtig verstanden?
Nein, du musst einfach zu dem Pointer auch noch die Länge des Arrays übergeben.

Also aus

Code:
int f(char *c)
{
    //...
}
das hier machen.

Code:
int f(char *c, size_t s)
{
    //...
}
Egal ob du als Parameter char *c oder char c[] oder char c[5] nimmst, es ist immer ein Pointer. Ohne die Länge zu wissen kannst du das Array nicht kopieren weil du dann ja nicht weiß, wie groß es überhaupt ist.

Oder du benutzt eben std::vector, dann brauchst du keinen zusätzlichen Parameter für die Länge.
ms​ is offline  
Reply


Similar Threads Similar Threads
Please write Pointer
08/27/2010 - 4Story - 9 Replies
Please write the table cheat in Cheat Engine for here this 4story Welcome to 4story Online
Frage: Wie findet man zB UG Pointer?Speed pointer?
03/30/2010 - Kal Online - 2 Replies
kann mir einer sagen wie man UG/Speed pointer finden kann usw^^´ß#



All times are GMT +2. The time now is 07:44.


Powered by vBulletin®
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2024 elitepvpers All Rights Reserved.