Ergebnis 1 bis 10 von 10

Thema: [C++] Vector-Struct Problem

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Die Compilerausgabe ...\main.cpp|32|error: incompatible types in assignment of `char*' to `char[10]'| bezieht sich auf folgende Quelltextzeile: vWeightList[0].chDate = chDate;

    Hier willst du einem Array vom Typ char was zuweisen. Da chDate prinzipiell die Adresse von chDate[0] darstellt und diese durch die Kompilierung schon fest steht, kannst du sie konventionell nicht ändern.

    Ein Lösungsansatz wäre die Daten einzeln zu verschieben oder einen Datentyp zu deklarieren, der die Adresse mit beinhaltet.

  2. #2
    @Niji:

    Du verstehst nicht wie man mit C-Feldern umgeht. Du versuchst ein Feld in ein anderes zu kopieren, indem du die Adresse, unter der das erste Feld erreichbar ist, zu der Adresse, unter der das zweite Feld erreichbar ist, änderst.
    So interpretiert es nämlich der Compiler, obwohl deine tatsächliche Intention die ist, die Werte der Elemente des ersten Feldes gleich denen des zweiten zu setzen.

    Der folgende Code zeigt wie man auf verschiedene Weisen eine tatsächliche Kopie eines Feldes erzielt:
    Code:
    #include <cstdlib>
    // ...
    char feld[10];
    char copy[10];
    
    // Möglichkeit 1 (elementweise Kopie)
    for (int i = 0; i < 10; ++i)
        copy[i] = feld[i];
    
    // Möglichkeit 2 (binäre Kopie mit memcpy)
    memcpy(copy, feld, 10);
    
    // Das wird nicht funktionieren!
    copy = feld;
    //...
    Übrigens (mir ist nicht klar, ob es dir bewusst ist): Es ist egal, ob du den Parametertyp als 'char*', 'char[]', oder 'char[10]' deklarierst. In allen Fällen handelt es sich um einen Zeiger auf einen 'char' und die optionale Deklaration der Länge dient höchstens dem Leser als Dokumentation: "Ah, hier erwartet er ein Feld aus 'char's mit der Länge 10".

    Zum weiteren Code will ich mich erstmal nur soweit äußern, dass er auf den ersten Blick wenig Sinn macht, angesichts dessen, was du mit dem Stack anstellst und deiner Menülogik. Ich denke, da gibt es noch weitere, nicht weniger gravierende Verständnisprobleme und vermute, dass du nach der Lösung des aktuellen Problems, noch mit weiteren konfrontiert sein wirst.

  3. #3
    PHP-Code:
    //nicht wirklich php code :P
    class CWeight {
        private:
            
    struct sWeightEntry {
                
    char chDate[10];
                
    float fWeight;
                
    sWeightEntry(const char *datefloat weight) : // Konstruktor
                    
    fWeight(weight// setzen von lokalem fWeight auf weight
                
    {
                    
    memcpy(chDatedatesizeof(chDate)); // kopieren der Array
                    
    chDate[9] = '\0'// sicherheitshalber
                
    }
            };
        public:
            
    // oeffentliche Variablen
            
    vector<sWeightEntryvWeightList;

            
    // oeffentliche Funktionen definieren

            
    void AddWeight(const char *chDatefloat fWeight) {
                
    cout << chDate << " : " << fWeight << "\n";
                
    vWeightList.push_back(sWeightEntry(chDatefWeight));
            }
    }; 

    Geändert von Drakes (12.07.2009 um 19:22 Uhr)

  4. #4
    Vielen lieben Dank!

    Da hab ich wohl noch einiges zu lernen

    Auf jeden Fall funktioniert es jetzt und ich kann jetzt weiter C++ üben

    Danke auch für die schnellen Antworten

    lg

  5. #5
    Ich würde noch den memcpy-Aufruf folgendermaßen schreiben...
    Code:
    memcpy(chDate, date, std::min(sizeof(date), sizeof(chDate)));
    ...denn memcpy erfordert, dass beide Blöcke mindestens die übergebene Länge haben.

    Wenn man davon ausgeht, dass es nullterminierte C-Strings sind (was die Parameter date und chDate sein können und im Grunde sind), wäre strlen angebrachter.

    Eigentlich gibt es aber überhaupt keinen Grund, wieso du hier nicht Strings anstelle von C-Strings verwenden solltest.
    Code:
    #include <string>
    //...
    
    // in einen string einlesen
    char buffer[10];
    std::cin.width(10); // maximal 9 buchstaben + die terminierende Null einlesen
    std::cin >> buffer;
    std::string s = buffer;
    
    // einen string initialisieren
    std::string t = "Hello World!";
    
    // einen string kopieren
    t = s;
    
    // einen string ausgeben
    std::cout << s.c_str();
    
    //...

    Geändert von Kyuu (12.07.2009 um 22:48 Uhr)

Stichworte

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •