tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
8
ZUGRIFFE
961
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Krieg noch ne Macke mit dem Scheiss C++ !

    Damals noch in PHP alles no Problem, da hats Spass gemacht mit Array
    zu arbeiten.

    In C++ bekomm ich das einfach nicht richtig auf die Reihe und verliere echt die Lust.

    Also was ich nicht auf die Reihe bekomme ist die Anzahl der Elemente dieses Arrays
    zu erhalten:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    
      
      int c = 300;
      
      int *t;
      t = new int[c];
      
      for(int i=0; i<c;i++)
      t[i]=i;
      
      int u = sizeof(t)/sizeof(int);
      Application->MessageBox(IntToStr(u).c_str(), &quot;Elemente&quot;, MB_OK);

    Die Messagebox spuckt einen Wert von 1 aus, ist natürlich falsch !
    Wo ist das Problem ?
     

  2. #2
    Thomas Kuse Thomas Kuse ist offline Mitglied Rubin
    Registriert seit
    Aug 2001
    Beiträge
    1.411
    Zitat Zitat von Kleiner Wicht
    Krieg noch ne Macke mit dem Scheiss C++ !

    Damals noch in PHP alles no Problem, da hats Spass gemacht mit Array
    zu arbeiten.
    Ohne auf deinen Quellcode zu schauen, weiss ich sofort, dass das Problem nicht an der Sprache C++ und schon gar nicht am Compiler liegt!
    Junge Junge Junge, sowas kann ich leiden...

    Vor allem ist das kein C++ sondern C!
    Mit C++ benutzt man die STL mit vector, map etc. da gibt es dann auch richtige count-Funktionen für die Anzahl von Elementen.



    Info zu sizeof:
    http://msdn.microsoft.com/library/de...f_operator.asp
     

  3. #3
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    So So, ABER:

    Anscheinend bist Du nicht in der Lage folgendes zu Begreifen:

    1. Array - statisch
    2. Array - dynamisch

    1. Statisches Array
    -----------------------------
    Code :
    1
    2
    3
    4
    5
    6
    7
    
     
     int a_static[]={1,2,3,4,5};
     int anzahl=sizeof(a_static)/sizeof(int);
     
     cout<<anzahl<<endl;
     
     //die Anzahl der Elemente wird hier korrekt ausgegeben !


    2.Dynamisches Array
    -------------------------------
    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
     
     int e = 5;
     int *inhalt;
     inhalt = new int[e];
     
     for(int a=0; a<e ; a++)
     {
        inhalt[a] = a;
     }
     
     int anzahl=sizeof(inhalt)/sizeof(int);
      cout<<anzahl<<endl;
     
     delete(inhalt);
     inhalt = NULL;


    So bei dem ersten statischen Array wird die Anzahl der Elemente korrekt ausgegeben.
    WESHALB und WIESO bei einem DYNAMISCHEN ARRAY die ANZAHL der ELEMENTE nicht ausgegeben werden kann, ich nicht wissen

    @THOMAS KUSE
    Ohne überheblich zu werden, weiß ich, das DUUUU es auch nicht weißt,
    weshalb bei einem Dynamischen Array die Anzahl der Elemente so nicht
    ausgegeben werden kann.
    Niemand zwingt dich auf Quellcode anderer zu schauen


    Ich hoffe das es wenigstens ein Mensch auf diesem Planeten gibt,
    der weiß warum es nicht funktioniert.
    Ein Beispiel wie es funktioniert wäre auch sehr schön, fals das überhaupt
    möglich ist.

    MfG
     

  4. #4
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

    Wo ist das Problem ?
    1. Array - statisch
    2. Array - dynamisch
    Genau da liegt dein Problem.
    Wie soll der Compiler zur Übersetzungszeit die Groeße eines dynamischen
    Arrays zur Kompilezeit ermitteln koennen (denn genau das macht der sizeof
    operator). Wenn man mal nachdenkt ist das logisch gell?
    Also du bekommst da die Größe des Pointers zurück. Du kannst den
    sizeof Opertaotr nur auf Datenstrutkruen richtig anwenden wenn sie
    statisch angelegt werden bzw wenn sie aufm Stack liegen. Diese Größen
    koennen nämlich zur Kompilierzeit ermittelt werden (übrigens zählt
    da auch die Groeße deines integer Zeigers dazu denn der wird auch auf
    statisch(zur Übersetzungszeit) angelegt, das auf was er zeigt wird aber
    dynamisch allokiert). Du hast mehrere Möglichkeiten:

    1.) Du legst das Array aufm Stack an.
    2.) Du deklarierst dir eine konstante Variable size die die Arraygröße angibt
    3.) Du benutzt wie Thomas Kuse schon sagte die Container aus der stl.

    @Thomas
    Ohne auf deinen Quellcode zu schauen, weiss ich sofort, dass das Problem nicht an der Sprache C++ und schon gar nicht am Compiler liegt!
    Das hat der Threadersteller beides auch nie behauptet. Er ist bzw war
    lediglich etwas frustriert da er den background von sizeof nicht kannte...

    Vor allem ist das kein C++ sondern C!
    Wieso soll das kein C++ sein? In Java z.B. gibt es auch Möglichkeiten
    dynamische Arrays anzulegen und diese zu
    verwenden, deswegen proprammiert man aber immer noch in Java.
    Und ich glaube kaum das
    Code :
    1
    
    for(int i=0; i<c;i++)
    oder
    Code :
    1
    
    Application->MessageBox(IntToStr(u).c_str(), &quot;Elemente&quot;, MB_OK);
    in C geht.
    unge Junge Junge, sowas kann ich leiden...
    Immer easy bleiben
    Mit C++ benutzt man die STL mit vector, map etc. da gibt es dann auch richtige count-Funktionen für die Anzahl von Elementen.
    Man kann sie benutzen aber wieso sollte man wenn es angebracht ist
    nicht auch Arrays benutzen koennen? Die Zugriffszeiten sind viel schneller
    (konstanter Aufwand) als die eines Vektors bzw einer Liste.
    Natürlich ist eine Liste bzw ein Vektor sicherer und auch leichter
    zu verwalten, aber wenn keine Notwendigkeit besteht eine
    dynamisch anwachsende Datenstruktur zu verwenden, kann man
    meiner Ansicht nach auch Arrays verwenden ohne sich von der
    Programmiersprache abzuwenden
    Aber prinzipiell gilt nat. wenn man eine Liste braucht und in C++ entwickelt
    sollte man auf die stl zurückgreifen und bei der verwendung von strings
    in C++ natürlich prinzipiell.

    Gruß

    RedWing
    Geändert von RedWing (25.11.05 um 01:05 Uhr)
     
    "I'm not deaf, I'm ignoring you"
    ----

  5. #5
    Kleiner Wicht Kleiner Wicht ist offline Mitglied Silber
    Registriert seit
    Jan 2005
    Beiträge
    60
    Okay, wusste nicht das sizeof beim Kompilieren ermittelt,
    wie groß das Array mal später sein wird.

    Selbst ein angeblich Dynamisches Array ist in gwisser Hinsicht statisch.
    Ist ebend doch nich alles so Dynamisch wie ich immer dachte.

    Aus den 3 Möglichkeiten, gefällt mir Möglichkeit 2, diese verwende ich schon ne
    ganze Weile, dachte aber ich kann mir das spaaren, und ermittle mit sizeof die
    größe des reservierten Speichers (Array), aber puuste Kuchen, nich.

    Und auf den ganzen nicht Programmierer-Kram beim angeblichen Programmieren,
    fahre ich sowieso nicht ab.

    Okay Danke für die ausführliche Anleitung, damit kann ich ein Anfänger leben.

    NICHT in C -> Application->MessageBox(IntToStr(u).c_str(), &quot;Elemente&quot;, MB_OK);

    bis die Tage
     

  6. #6
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,
    vielleicht noch zur Info:

    Man muss die Begriffe statisch und dynamisch etwas differenzierter
    betrachten:
    In Bezug auf Datenstrukturen bedeutet
    statisch:
    die Größe einer Datenstruktur ist statisch, d.h. sie kann nicht wachsen
    oder schrumpfen
    dynamisch:
    die Größe einer Datenstruktur kann dynamisch
    anwachsen bzw schrumpfen (darunter fällt ein vector oder eine list)

    In Bezug auf Festlegungen bedeutet
    statisch: alles was vor der Laufzeit festgelegt und allokalisiert werden
    kann (darunter fällt dein Zeiger auf das Array)
    dynamisch:
    alles was während der Laufzeit ermittellt
    werden und allokalisiert werden kann (darunter fällt dein Array selber)


    Gruß

    RedWing
     
    "I'm not deaf, I'm ignoring you"
    ----

  7. #7
    Cusco Cusco ist offline Mitglied Brokat
    Registriert seit
    May 2005
    Beiträge
    383
    Was ist ein vector für ein Typ?
     

  8. #8
    deepthroat deepthroat ist gerade online Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.

    Ein Vector allgemein ist ein dynamisches Array. Speziell in C++ ist mit vector normalerweise ein std::vector aus der C++ Standard Template Library gemeint. Ein std::vector ist eine Template Klasse, also im Grunde ein "unfertiger" Typ der erst noch zur Kompilierzeit komplettiert wird.

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  9. #9
    Registriert seit
    Oct 2003
    Beiträge
    1.706
    Hallo,

    der Begriff Vektor bezeichnet allgemein ein Array. Egal ob dynamisch oder statisch...
    Die Terminologie kommt daher, das ein Array der Größe n in C++/C einem Vektor aus dem R^n
    aus der Mathematik entspricht...

    Der stl vector ist in erster Linie ein dynamisch wachsendes Array. Um diesen vector
    auf verschiedene Datentypen anzuwenden, verwendet man wie deepthroat schon
    erwähnte den Templatemechanismus...

    //edit: Hier findest du die API Doku zum stl vector:
    http://www.sgi.com/tech/stl/table_of_contents.html

    Gruß

    RedWing
    Geändert von RedWing (24.01.06 um 19:33 Uhr)
     
    "I'm not deaf, I'm ignoring you"
    ----

Ähnliche Themen

  1. Wie lösche ich array-elemente?
    Von delphinhawe im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 08.08.10, 09:52
  2. Array Elemente zählen
    Von EddieG im Forum C/C++
    Antworten: 8
    Letzter Beitrag: 25.03.10, 19:28
  3. array elemente mit for ausgeben
    Von Denniz im Forum Flash Plattform
    Antworten: 3
    Letzter Beitrag: 28.03.07, 23:01
  4. MYSQL Elemente in Array
    Von DelphiDell im Forum PHP
    Antworten: 2
    Letzter Beitrag: 24.12.05, 17:50
  5. array-elemente vernichten
    Von deepgreen im Forum PHP
    Antworten: 2
    Letzter Beitrag: 29.12.01, 20:12