zu der Aufgabe etwas weiter unten Kundenverwaltung



  • AlleNamenBelegt schrieb:

    Bin ich damit denn schon irgendwie nah dran? oder weit daneben?

    Weit daneben. Du hast anscheinend schon die Aufgabenstellung nicht verstanden. Die muss man natürlich erstmal verstehen, bevor es losgehen kann. Versuch mal ein Beispiel aufzumalen, das zeigt, was wo wie im Speicher liegt und wie verknotet ist. ZB für zwei Kundendatensätze mit jeweils Vor/Nachnahme. Objekte als Kästchen zeichnen. Je nach inhalt (Zeichen, Zeiger) kannst Du Buchstaben reinpacken oder einen Pfeil dran malen (für Zeiger), die auf irgendwas zeigen.

    Beispiel:

    #include <cstring>
    #include <iostream>
    
    int main()
    {
      char * zeiger = new char[10];
      std::strcpy(zeiger,"test");
      // X
      std::cout << zeiger;
      delete[] zeiger;
    }
    
    Zum Zeitpunkt X sieht es so im Arbeitsspeicher aus:
    
       zeiger        ein char-Array
       +---+         +---+---+---+---+---+---+---+---+---+---+
       | * |         | t | e | s | t |\0 | ? | ? | ? | ? | ? |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+
         |             A
         +-------------+
    

    kk



  • int main()
    {
    char * zeiger = new char[10];
    std::strcpy(zeiger,"test");
    // X

    also aber da ist doch der name test vorgegeben? aber der kunde müsste ja sozu sagen dort was eintragen *verwirrt guck*


  • Mod

    AlleNamenBelegt schrieb:

    int main()
    {
    char * zeiger = new char[10];
    std::strcpy(zeiger,"test");
    // X

    also aber da ist doch der name test vorgegeben? aber der kunde müsste ja sozu sagen dort was eintragen *verwirrt guck*

    In Fachkreisen nennt man das ein Beispiel.



  • AlleNamenBelegt schrieb:

    also aber da ist doch der name test vorgegeben? aber der kunde müsste ja sozu sagen dort was eintragen *verwirrt guck*

    Das war auch nur ein kleines Beispiel um zu zeigen, wie so ein Bildchen aussehen kann. Ich hatte Dich ja gebeten, als Übung so ein Bildchen für ein Beispiel mit zwei Kundendatensätzen samt ihrer "Felder" selbst anzulegen. Das habe ich gemacht, weil ich glaube, dass diese Übung Dir weiterhelfen kann.

    kk



  • Den Code dazu habe ich nur so gezeigt. Darum ging es mir gar nicht. Ich würde an Deiner Stelle also versuchen, erst das Bild/Speicherlayout für ein Beispiel mit 2 Kundendatensätzen korrekt zu erstellen und dann erst darüber nachzudenken, was Du in C++ dafür schreiben musst...



  • Also so?

    int main()
    {
    
      char * nachname = new char[10]; <---- wieso wird da jetzt ne 10 rein? da vergibt man doch speicherplatz?
      char * vorname  = new char[10]
      std::strcpy(nachname,"mustermann");
      std::strcpy(vorname, "max");
    
      std::cout << nachname;
      std::cout << vorname;
      delete[] nachname;
      delete[] vorname;
    }
    
       +---+         +---+---+---+---+---+---+---+---+---+---+
       | * |         | m | u | s | t | e | r | m | a | n | n |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+
         |             A
         +-------------+ 
    
       +---+         +---+---+---+---+---+---+---+---+---+---+
       | * |         | m | a | x | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+
         |             A
         +-------------+
    


  • Wie gesagt, ich will keinen C++ Code im Moment von Dir sehen. Nur ein Bild, was zwei Kundendatensätze samt "Felder" zeigt. Laut Aufgabenstellung sollen die Zeiger selbst ja ein Feld bilden, was dynamisch (also ber new[] zB) angelegt werden soll. Das stimmt schonmal bei Dir nicht, weil Du die Zeiger als einzelne Objekte getrennt voneinander aufgemalt hast. Bei einem Feld/Array stehen die Elemnte direkt hintereinander im Speicher. Denk auch an den zusätzlichen Zeiger, der die Kundendatensätze verketten soll.


  • Mod

    Wenn du das ausprobierst: Kommt da bei der Ausgabe wirklich "mustermann" raus? Immer? Auch mit Compileroptimierungen (Release-Modus)?

    Denn eigentlich ist bei char-Arrays noch ein abschließendes Nullzeichen per Konvention vorgesehen um das Ende anzuzeigen, so dass du für "mustermann" 11 Zeichen benötigst.

    Warum die 10 und nicht z.B. für max eine sparsamere 4? Ja, kannste machen. Macht man normalerweise auch. Aber das ist ein kleines bisschen schwieriger und du stolperst derzeit noch bei den einfacheren Sachen. Mach dich lieber erstmal damit vertraut.



  • Also so?

    int main()
    {
    
      char * nachname, * vorname = new char[15]; 
    
      std::strcpy(nachname,"mustermann");
      std::strcpy(vorname, "max");
    
      std::cout << nachname;
      std::cout << vorname;
      delete[] nachname;
      delete[] vorname;
    }
    
       +---+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
       | * |         | m | u | s | t | e | r | m | a | n | n | m | a | x | 0 | 0 |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
         |             A
         +-------------+
    

    sorry das ich so schwer von Begriff bin 😞



  • Hehe, nein, so auch nicht.
    Zum ersten ist deine Variablendeklaration falsch:

    char * nachname, * vorname = new char[15];
    

    Diese Zeile deklariert die Variable nachname, sie hat einem zufälligen Wert und zeigt demnach auch auf einen zufälligen Bereich des Hauptspeichers. Sämtliche Zugriffe auf den Speicherbereich, auf den nachname zeigt, erzeugt undefiniertes Verhalten (weil man nicht weiß, auf was nachname denn jetzt genau zeigt).
    Die Variable vorname zeigt auf einen dynamisch erzeugten Speicherblock der Länge 15 und ist korrekt intialisiert.

    Zum zweiten kannst du nie davon ausgehen, dass du Speicher an einer bestimmten Adresse des Hauptspeichers bekommst bzw. dass zwei aufeinanderfolgende Speicheranforderungen direkt hintereinander im Hauptspeicher liegen.

    Dynamische Speicherverwaltung und Zeigerarithmetik sind für Anfänger nicht unbedingt einfach zu verstehen, man muss sich schon etwas damit auseinandersetzen.



  • krümelkacker schrieb:

    Wie gesagt, ich will keinen C++ Code im Moment von Dir sehen. Nur ein Bild, was zwei Kundendatensätze samt "Felder" zeigt. [...]

    AlleNamenBelegt schrieb:

    Also so?

    … nicht funktionierender C++ code …
    
    +---+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
       | * |         | m | u | s | t | e | r | m | a | n | n | m | a | x | 0 | 0 |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
         |             A
         +-------------+
    

    Ich sehe hier kein Feld aus Zeigern -- nur einen einzigen Zeiger. Das entspricht also nicht der Aufgabenstellung. Dazu kommt noch, dass man nicht weiß, wo der Nachname aufhört und der Vorname anfängt.



  • +---+ +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | * | | m | u | s | t | e | r | m | a | n | n | m | a | x | 0 | 0 |
    +-+-+ +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
    | A A
    +-------------+ +
    |
    |
    |
    |
    +
    |
    +-+-+
    | * |
    +-+-+



  • +---+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
       | * |         | m | u | s | t | e | r | m | a | n | n | m | a | x | 0 | 0 |
       +-+-+         +---+---+---+---+---+---+---+---+---+---+---+---+---+---+---+
         |             A                                       A        
         +-------------+                                       +
                                                               |
                                                               |
                                                               |
                                                               |
                                                               +
                                                               |
                                                             +-+-+
                                                             | * |
                                                             +-+-+
    


  • #include <iostream>
    #include <cstring> 
    
    using namespace std;
    
    int main()
    {    
    
    char *nachname= new char[];
    char *vorname= new char[];
    char *straße= new char[];
    char plz[6];
    char *wohnort= new char[];
    char geburtsdatum[11];
    
    cout<<"Nachname?";
    cin>>nachname;
    std::strcpy(nachname);
    
    cout<<"Vorname?";
    cin>>vorname;
    std::strcpy(vorname); 
    
    cout<<"Straße?";
    cin>>straße;
    std::strcpy(straße);
    
    cout<<"PLZ?";
    cin>>plz;
    
    cout<<"Wohnort?";
    cin>>wohnort;
    std::strcpy(wohnort);
    
    cout<<"Geburtsdatum?";
    cin>>geburtsdatum;
    
    std::cout << nachname;
    std::cout << vorname; 
    std::cout << straße;
    cout<<plz;
    std::cout << wohnort; 
    cout<<geburtsdatum;
    
    delete[] nachname;
    delete[] vorname;
    delete[] straße;
    delete[] wohnort;
    
    system("PAUSE");
    
    }
    


  • Jetzt fängst du an zu raten... der C++ Code lässt sich nicht kompilieren, und so wird´s nix. Mach dir besser erst Gedanken über deine Lösung und setze das dann um, anstatt deinen C++ Code solange herumzuschieben, bis er halbwegs vernünftig funktioniert.

    Beantworte (dir selbst!) doch bitte folgende Fragen:

    - welche Zeigervariablen habe ich?
    - welche Zeigervariable zeigt auf welche Adresse? Wie groß ist der reservierte Speicherbereich, auf den sie zeigt?


  • Mod

    Versuchst du wirklich das Thema zu verstehen oder rätst du nur solange bis es zufällig richtig ist?

    Das was du jetzt hast ist jedenfalls ganz weit von der richtigen Lösung weg und dürfte dir total um die Ohren fliegen. Wenn es überhaupt compiliert, was mich überraschen würde.



  • ich bin einfach nur total überfordert...bin kurz davor auf zu geben, da ich kein bisschen dahinter komme



  • Lass Dir ruhig Zeit, gib Dir Mühe, lies Dir nochmal die Aufgabenstellung durch, denk drüber nach, wie das Speicherlayout aussehen soll, wenn zwei Kunden "im Speicher stehen". Bevor Du nicht mal zum richtigen Speicherlayout gekommen bist, macht sämtlicher C++ Code IMHO keinen Sinn. Warum solltest Du auch etwas anfangen zu programmieren, wenn Du nicht weißt, was da eigentlich rauskommen soll?

    Nirgends in der Aufgabenstellung steht übrigens, dass die Zeichenketten der einzelnen Eigenschaften alle in einem Feld gespeichert werden sollen. So ist das nicht gedacht. Die einzelnen Zeichenketten für Name, Vorname usw sollen nach Bedarf einzeln im Speicher reserviert werden. Die einzelnen Zeiger, die sich die Anfagsadressen der im Speicher reservierten char-Felder merken und ggf auch etwas anderes, sollen aber hintereinander im Speicher stehen (Feld). Der Lehrer will ein Feld aus Zeigern sehen, die wiederum auf char-Felder zeigen (oder auch nicht, wenn zB kein Geburtsdatum bekannt ist).



  • AlleNamenBelegt schrieb:

    int main()
    {    
    char *nachname= new char[];
    char *vorname= new char[];
    char *straße= new char[];
    …
    }
    

    Weißt Du, es macht nicht so richtig Spass, wenn man sich wiederholen muss. 😞 Du musst auch mal'n bissel aufpassen, was man Dir so sagt. C++ Code kannst Du erstmal vergessen, bevor Du nicht weißt, was das Programm eigentlich machen soll. Und dass C++ kein ß in Bezeichnernamen mag, habe ich auch schonmal gesagt.

    Irgendwie habe ich den Eindruck, dass Du im Unterricht gar nicht aufgepasst hast. Problem ist ja nicht nur die Sprache C++ sondern generell eine Programmiererfahrung, die quasi Null ist. Die Aufgabe ist aber auch fies, IMHO. Also eine schlechte Kombination. 😞

    viel Erfolg noch!
    Ich geh jetzt erstmal ins Freibad...

    kk



  • ich habe jetzt die komplette Aufgabe erledigt wie ich denke....allerdings möchte ich die nicht öffentlich posten...hinterher geht hier einer aus meiner klasse hin und denkt er kopiert sich das ganze....

    allerdings habe ich noch ein wenig flüchtigkeitsfehler drin....da mein compiler ein wenig am mosern ist...nur habe ich das wirklich nicht mehr gefunden....
    ich hab eben ordentlich kaffee getrunken und mich hochkonzentriert da ran gesetzt,.... wie mache ich es jetzt am besten, dass jemand darüber schauen kann ohne das es für die ganze welt zugänglich ist?


Anmelden zum Antworten