tutorials.de Buch-Aktion 05/2012
Seite 4 von 4 ErsteErste 1234
ERLEDIGT
NEIN
ANTWORTEN
48
ZUGRIFFE
2100
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #46
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    malloc bekommt, wie du ja weißt, nur die Byteanzahl, die es besorgen soll.
    Wenn das 16 ist, können das zB. 16 chars (je 1 Byte), oder 2 doubles (je 8 Byte) sein.
    Und weil malloc nicht weiß, welche Variablenart das wird (und sich dafür auch überhaupt nicht interessiert), liefert es nur die Adresse. Kein char* oder double*, sondern einheitlich
    (void*: Adresse von unbestimmter Variablenart).

    Wenn man dieses void* dann einem double* oÄ. zuweist, kann (nur kann) das
    je nach Compiler eine Warnung bringen. Das Programm funktioniert trotzdem,
    aber die Warnung ist lästig. Deswegen der Cast, um die zu verhindern.
    Googlehupf bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  2. #47
    Googlehupf Googlehupf ist offline Mitglied Silber
    Registriert seit
    Jun 2011
    Beiträge
    76
    Danke dir.

    Code cpp:
    1
    
    arrayValues=(double *)malloc(sizeof(complex)* *len);

    EDIT:
    Das ist verwirrend... der Stern ist erst nach der ) und beim len ist der stern eh normal vorm len.
    Was macht der Stern den nach ')'?
    Geändert von Googlehupf (16.12.11 um 18:48 Uhr) Grund: Löschen/Ergänzung
     

  3. #48
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Stimmt.
    Je nach Compiler können es auch mal mehr als 16 Byte sein,
    aber das hat auf den Code keine Auswirkungen.
    Kein Grund zum Sorgenmachen,

    edit: Der erste Stern ist das math. Multiplizieren,
    der zweite wegen dem Pointer, um nicht die Adresse, sondern den Wert selbst zu bekommen.
    Googlehupf bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  4. #49
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.516
    Expliziter Cast bedeutet, das wir dem Compiler mitteilen, das wir ihn zwingen, dort einen bestimmten Typen zu verwenden.

    Ein Void-Pointer ist für den Compiler etwas anderes als ein Pointer auf eine Struktur. Da du als L-Wert einen Pointer auf eine Struktur hast, als R-Wert von malloc() aber ein Void-Pointer zurück kommt, zwingen wir (casten) zum Datentypen Pointer auf Struktur.

    Prinzipiell ist es bei einem Void-Pointer egal, ob man ihn explizit castet oder nicht. Der Compiler wird sich darum kümmern, dass dies implizit (also ohne Zwang durch den Programmierer) geschieht. Es ist aber sauberer, und wenn man nach ISO-89 compiliert (wenn ich mich richtig erinnere) wird der Code dadurch auch besser zu verstehen, denn:

    In ISO-89 (man vergebe mir bitte, wenn ich das falsch in Erinnerung habe) müssen die Variablen vor dem eigentlichen Programm-Code definiert werden. Das sieht das bspw. so aus, wie du es in deinem letzten Post gemacht hast. Erst kommen die Variablen, dann der logische Code. Wenn man eine Latte von Variablen definiert hat, und anschließend ein paar Zeilen Code kommen, und später erst die Speicher-Allokation, dann muss man immer im Sourcecode nach oben zur Variablen-Definition scrollen, um zu prüfen, auf welchen Typ denn nun der Pointer eigentlich zeigt.

    Solltest du keinen expliziten Cast durchführen, bekommst du bim Compilen eine Warnung.

    Hier habe ich noch mal eine Seite raus gesucht, in der die Einzelheiten erklärt werden: http://www.willemer.de/informatik/cpp/pointer.htm
    Googlehupf bedankt sich. 
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

Ähnliche Themen

  1. Antworten: 64
    Letzter Beitrag: 17.12.10, 20:23
  2. [C#] In ListBox soll jeder Wert einmalig sein
    Von RescueThePinguins im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 07.01.10, 22:56
  3. Antworten: 2
    Letzter Beitrag: 31.08.08, 03:02
  4. DataGridView - Linker Grauer Bereich soll weg
    Von Athor im Forum .NET Windows Forms
    Antworten: 2
    Letzter Beitrag: 20.11.07, 14:36
  5. linker frame soll größe beibehalten.
    Von sunflower84 im Forum HTML & XHTML
    Antworten: 10
    Letzter Beitrag: 27.07.05, 16:00