Hypercell ein ] Hypercell aus ] Zeige Navigation ] Verstecke Navigation ]
c++.de  
   
Forentreff 2012     
Bücher-Shop mit Amazon (Buchkategorien)C++ : Referenzen zu C++ : C++ Builder : Visual C++ : C# : Java : Spieleprogrammierung : Systemprogrammierung Linux : Software-Entwicklung : .NET : Compilertechnik : Algorithmen & Datenstrukturen : Objektorientierung : Entwurfsmuster : UML : eXtreme Programming : Scrum : Projektmanagement : Software-Testing : Datenbanken : Tom DeMarco : Dilbert : User Friendly
C/C++ Forum :: C++ (auch C++0x und C++11) ::  LPWSTR     Zeige alle Beiträge auf einer Seite Auf Beitrag antworten
Autor Nachricht
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 09:10:26 01.02.2012   Titel:   LPWSTR            Zitieren

Kann mir jemand erklären, wieso die Größe vom Array so berechnet wird:
C/C++ Code:
1
2
3
4
5
6
7
8
9
1
2
3
4
5
6
7
8
9
    LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
    L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" , L"R:" ,
    L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };

   

    int i = sizeof( LPWSTR );
    int k = sizeof( drive );
    uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
C/C++ Code:
1
2
3
4
5
6
7
8
9
LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" , L"R:" ,
L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };



int i = sizeof( LPWSTR );
int k = sizeof( drive );
uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
C/C++ Code:
1
2
3
4
5
6
7
8
9
    LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
    L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" , L"R:" ,
    L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };

   

    int i = sizeof( LPWSTR );
    int k = sizeof( drive );
    uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );


Es liefert den richtigen Wert zurück. Ich kann aber das nicht nachvollziehen.
LordJaxom
Mitglied

Benutzerprofil
Anmeldungsdatum: 23.11.2005
Beiträge: 5553
Beitrag LordJaxom Mitglied 09:15:56 01.02.2012   Titel:              Zitieren

Ein Array kennt seine Größe in Bytes.

Die Größe eines Arrays geteilt durch die Größe eines Elements ergibt die Anzahl.

Achtung:
Ein Array zerfällt schnell zu einem Zeiger. Also nur wenn das Array im Scope vollständig bekannt ist, funktioniert das. Sonst erhälst Du nur die Größe eines Zeigers geteilt durch die Größe eines Zeigers.

Beispiel:
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
1
2
3
4
5
6
7
8
9
10
11
12
int[] array = { 1,2,3,4,5 };

void func(int[] param)
{
    sizeof(param); // ergibt _NICHT_ 5 * sizeof(int)
}

int main()
{
    sizeof(array); // ergibt 5 * sizeof(int);
    func(array);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
int[] array = { 1,2,3,4,5 };

void func(int[] param)
{
sizeof(param); // ergibt _NICHT_ 5 * sizeof(int)
}

int main()
{
sizeof(array); // ergibt 5 * sizeof(int);
func(array);
}
C/C++ Code:
1
2
3
4
5
6
7
8
9
10
11
12
int[] array = { 1,2,3,4,5 };

void func(int[] param)
{
    sizeof(param); // ergibt _NICHT_ 5 * sizeof(int)
}

int main()
{
    sizeof(array); // ergibt 5 * sizeof(int);
    func(array);
}
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 09:49:41 01.02.2012   Titel:              Zitieren

wie ich in meinem Fall verstehe:

ich habe einen 32 bit pointer(LPWSTR) auf jeden Element in Array, insgesamt 26.

drive =104(26*4)
size(LPWSTR) = 4

26 Elemente mit 4 Byte pointer.Richtig so?
Ethon
Mitglied

Benutzerprofil
Anmeldungsdatum: 28.01.2011
Beiträge: 1114
Beitrag Ethon Mitglied 10:13:11 01.02.2012   Titel:              Zitieren

Es müsste du sizeof(WCHAR) und nicht durch sizeof(LPWSTR) geteilt werden, da die Elemente ja vom Typ WCHAR sind.
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9602
Beitrag _matze Mitglied 10:25:02 01.02.2012   Titel:              Zitieren

EDIT: erst denken, dann posten. :rolleyes:

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?


Zuletzt bearbeitet von _matze am 11:08:08 01.02.2012, insgesamt 1-mal bearbeitet
koschka
Mitglied

Benutzerprofil
Anmeldungsdatum: 18.01.2012
Beiträge: 85
Beitrag koschka Mitglied 11:00:56 01.02.2012   Titel:              Zitieren

also : sizeof(*LPWSTR) gibt mir error C2275 zurück
sizeof(WCHAR) is die Zeichengröße und ist gleich 2. Aber sizeof(drive)/2 ist nicht gleich 26 der Größe vom Array(sizeof(drive)=104 beim Debuggen)

Mein Code kompiliert richtig und liefert richtiges ergebnis zurück.
sizeof(drive) ist bei mir 104
sizeof(LPWSTR) = 4
Weil der Pointer 4 Byte groß ist wahrscheinlich. Also 4 * 26 Elemente im Array.
_matze
Mitglied

Benutzerprofil
Anmeldungsdatum: 31.07.2007
Beiträge: 9602
Beitrag _matze Mitglied 11:11:16 01.02.2012   Titel:              Zitieren

Ethon schrieb:
Es müsste du sizeof(WCHAR) und nicht durch sizeof(LPWSTR) geteilt werden, da die Elemente ja vom Typ WCHAR sind.


koschka hat Recht, die Elemente sind vom Typ Zeiger auf WCHAR.

_________________
Wie viele atheistische Babys hat man schon aus Versehen - oder gar mit Absicht! - getauft?
krümelkacker
Mitglied

Benutzerprofil
Anmeldungsdatum: 10.08.2010
Beiträge: 1581
Beitrag krümelkacker Mitglied 14:43:48 01.02.2012   Titel:   Re: LPWSTR            Zitieren

koschka schrieb:

Kann mir jemand erklären, wieso die Größe vom Array so berechnet wird:
C/C++ Code:
LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
    L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" ,
        L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };

    int i = sizeof( LPWSTR );
    int k = sizeof( drive );
    uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
C/C++ Code:
LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" ,
L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };

int i = sizeof( LPWSTR );
int k = sizeof( drive );
uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );
C/C++ Code:
LPWSTR drive[] = {L"A:", L"B:", L"C:", L"D:", L"E:", L"F:", L"G:", L"H:" ,
    L"I:" , L"J:" , L"K:" , L"L:" , L"M:" , L"N:" , L"O:" , L"P:" , L"Q:" ,
        L"R:" , L"S:" , L"T:" , L"U:" , L"V:" , L"W:" , L"X:" , L"Y:" , L"Z:" };

    int i = sizeof( LPWSTR );
    int k = sizeof( drive );
    uint8_t nDrives = sizeof( drive ) / sizeof( LPWSTR );

Es liefert den richtigen Wert zurück. Ich kann aber das nicht nachvollziehen.

drive ist vom Typ LPWSTR[26], weil Du drive als LPWSTR-Array deklarierst und in der Initialisierungsliste 26 Elemente auftauchen.

sizeof(LPWSTR) gibt die Größe (in Bytes) eines Objekts vom Typ LPWSTR zurück.

sizeof(drive) gibt die Größe (in Bytes) eines Objekts vom Typ LPWSTR[26] zurück.

Ein Array ist eine Aneinanderreihung von einzelnen "Subobjekten" ohne Lücken dazwischen. ==> sizeof(T[N]) = N*sizeof(T)

sizeof(drive) ist also 26*sizeof(LPWSTR). Und sizeof(LPWSTR) kürzt sich bei der Division raus, so dass 26 übrig bleibt.
C++ Forumbot
Forumbot

Benutzerprofil
Anmeldungsdatum: 29.02.2004
Beiträge: 16160
Beitrag C++ Forumbot Forumbot 15:40:32 01.02.2012   Titel:              Zitieren

Dieser Thread wurde von Moderator/in rüdiger aus dem Forum Rund um die Programmierung in das Forum C++ (auch C++0x, bzw. C++11) verschoben.

Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?


Dieses Posting wurde automatisch erzeugt.

_________________
Besuchen Sie unsere Bücherecke.
http://www.c-plusplus.de/bucher.php
Mit jeder Bestellung unterstützen Sie das Forum.
314159265358979
Mitglied

Benutzerprofil
Anmeldungsdatum: 09.03.2010
Beiträge: 4623
Beitrag 314159265358979 Mitglied 19:25:46 01.02.2012   Titel:              Zitieren

Warum nicht einfach:
C/C++ Code:
std::size_t size = sizeof array / sizeof *array;
C/C++ Code:
std::size_t size = sizeof array / sizeof *array;
C/C++ Code:
std::size_t size = sizeof array / sizeof *array;
C/C++ Forum :: C++ (auch C++0x und C++11) ::  LPWSTR   Auf Beitrag antworten

Zeige alle Beiträge auf einer Seite




Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben.
Sie können auf Beiträge in diesem Forum antworten.
Sie können Ihre Beiträge in diesem Forum nicht bearbeiten.
Sie können Ihre Beiträge in diesem Forum nicht löschen.
Sie können an Umfragen in diesem Forum nicht mitmachen.

Powered by phpBB © 2001, 2002 phpBB Group :: FI Theme

c++.de ist Teilnehmer des Partnerprogramms von Amazon Europe S.à.r.l. und Partner des Werbeprogramms, das zur Bereitstellung eines Mediums für Websites konzipiert wurde, mittels dessen durch die Platzierung von Werbeanzeigen und Links zu amazon.de Werbekostenerstattung verdient werden kann.

Die Vervielfältigung der auf den Seiten www.c-plusplus.de, www.c-plusplus.info, www.c-sar.de, www.c-plusplus.net und www.baeckmann.de enthaltenen Informationen ohne eine schriftliche Genehmigung des Seitenbetreibers ist untersagt (vgl. §4 Urheberrechtsgesetz). Die Nutzung und Änderung der vorgestellten Strukturen und Verfahren in privaten und kommerziellen Softwareanwendungen ist ausdrücklich erlaubt, soweit keine Rechte Dritter verletzt werden. Der Seitenbetreiber übernimmt keine Gewähr für die Funktion einzelner Beiträge oder Programmfragmente, insbesondere übernimmt er keine Haftung für eventuelle aus dem Gebrauch entstehenden Folgeschäden.