Frage zu Arrays



  • Hallo zusammen.

    Wenn ich als Beispiel ein Adressbuch habe, beinhalten meine Angaben sowoll Text als auch Zahlen.
    Kann ich diese Angaben auch in einem Array Speichern?
    Also gemischt mit Zahlen und Text-Angaben.

    Oder kann das Array dann nur ein Sting Array sein?

    Oder muss ich zwei Arrays verwenden?
    Eins für Text und eins für Zahlen.

    Habe zwar schon im Internt einiges gelesen,
    aber zumeinst wird nur Text oder Zahlen in einem Array gespeichert.
    Aber was ist mit einem gemischten Array?
    Geht das erst garnicht?

    Bitte um kurze Aufklärung
    Danke



  • Weder noch.

    Du machst eine Klasse Adresse, die die nötigen Attribute beinhaltet (Strasse, Nr, etc.). Im Array für das Adressbuch speicherst du dann Objekte der Klasse Adresse.



  • Vielen Dank für die schnelle Antwort.

    Ich glaube ich verstehe was du so ungefähr meinst.

    Aber wie baue ich sowas als Script auf?

    Kannst du mir einen kleines Beispiel dazu geben?
    Also Scriptschnipsel.

    Nur damit ich schon mal ein Ansatz habe.



  • Hier ein Beispiel:

    using namespace System;
    using namespace System::Collections::Generic;
    
    ref struct Adresse
    {
        property String^ Strasse;
        property int Postleitzahl;
        property String^ Ort;
    };
    
    int main(array<System::String ^> ^args)
    {
        auto zuhause = gcnew Adresse;
        zuhause->Strasse = "Time Square 57";
        zuhause->Postleitzahl = 10036;
        zuhause->Ort = "New York City";
    
        auto adressen = gcnew List<Adresse^>;
        adressen->Add(zuhause);
    
        for each (auto adresse in adressen)
        {
            Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
        }
    
        return 0;
    }
    

    Von Script spricht man eher im Zusammenhang mit Script-Srpachen, wie JavaScript, Ruby, Python oder ähnlich, bei C++/CLI ist es einfach Code.

    Anzumerken ist noch, dass C++/CLI eigentlich nur einen Zweck hat, und zwar die native Welt mit der managed .NET zu verbinden. Sie ist nicht geeignet, um Programmieren zu lernen oder für Projekte, wo die Interoperabilität nicht der Kernpunkt ist. Dafür hat die Sprache/Environment einfach zuviele Fallstricke und Dinge, die man wissen muss. Für .NET bietet sich C# an, für native z. B. C++.



  • Danke für deine Infos und Meinung.
    Gebe dir auch recht.
    Aber möchte dennoch C++ und C++/CLI lernen.

    Danke für dein Code, der wird mir schon weiter helfen.



  • Moch eine Frege.

    Jetzt sind wie Angaben schon festgelegt, aber wie fürge ich Adressen hinzu?

    Weil wenn ich ein Adressbruch Programmieren möchte muss der Anwänder ja sogesehen Adressen hinzufügen können.



  • Hier ein erweitertes Beispiel:

    using namespace System;
    using namespace System::Collections::Generic;
    
    ref struct Adresse
    {
        property String^ Strasse;
        property int Postleitzahl;
        property String^ Ort;
    };
    
    int main(array<System::String ^> ^args)
    {
        auto zuhause = gcnew Adresse;
        zuhause->Strasse = "Time Square 57";
        zuhause->Postleitzahl = 10036;
        zuhause->Ort = "New York City";
    
        auto adressen = gcnew List<Adresse^>;
        adressen->Add(zuhause);
    
        while (true)
        {
            Console::Write("Neue Adresse hinzufügen? Ja ('j') oder Nein ('n'): ");
            auto hinzufuegenJaNein = Console::ReadLine();
            if (hinzufuegenJaNein->StartsWith("j"))
            {
                auto neueAdresse = gcnew Adresse;
    
                Console::Write("Gib die Strasse ein: ");
                neueAdresse->Strasse = Console::ReadLine();
    
                Console::Write("Gib die Postleitzahl ein (nur Zahlen erlaubt): ");
                auto postleitzahlEingabe = Console::ReadLine();
                auto postleitzahl = 0;
                if (int::TryParse(postleitzahlEingabe, postleitzahl))
                {
                    neueAdresse->Postleitzahl = postleitzahl;
                }
                else
                {
                    Console::WriteLine("Die Eingabe wurde nicht akzeptiert, die Adresse wird nicht hinzugefügt");
    
                    continue;
                }
    
                Console::Write("Gib den Ort ein: ");
                neueAdresse->Ort = Console::ReadLine();
    
                adressen->Add(neueAdresse);
            }
            else if (hinzufuegenJaNein->StartsWith("n"))
            {
                break;
            }
            else
            {
                Console::WriteLine("Die Eingabe wurde nicht akzeptiert, bitte erneut eingeben");
            }
        }
    
        for each (auto adresse in adressen)
        {
            Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
        }
    
        return 0;
    }
    


  • Danke nochmal

    Habe mir den Code angesehen und verstehe jetzt wie es gemacht wird.



  • Habe den letzten Code mal in Visual Studio c++ 2010 in einer CLR-Konsolenanwendung nachgebaut (reingesetzt).

    Bekommen aber diesen Fehler beim Start:

    1>------ Erstellen gestartet: Projekt: Beispiel-Adressbuch, Konfiguration: Debug Win32 ------
    1> Beispiel-Adressbuch.cpp
    1>Beispiel-Adressbuch.cpp(65): error C3539: "auto": Ein Vorlagenargument darf keinen Typ aufweisen, der "auto" enthält.
    1>Beispiel-Adressbuch.cpp(65): error C2682: "safe_cast" kann nicht verwendet werden, um "Adresse ^" in "int" zu konvertieren.
    1> Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    1>Beispiel-Adressbuch.cpp(67): error C2227: Links von "->Strasse" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist 'int'
    1>Beispiel-Adressbuch.cpp(67): error C2227: Links von "->Postleitzahl" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist 'int'
    1>Beispiel-Adressbuch.cpp(67): error C2227: Links von "->Ort" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.
    1> Typ ist 'int'
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Bitte um Hilfe



  • Cospieler schrieb:

    1>Beispiel-Adressbuch.cpp(65): error C3539: "auto": Ein Vorlagenargument darf keinen Typ aufweisen, der "auto" enthält.

    Du musst dort statt auto einen konkreten Typ angeben.

    Cospieler schrieb:

    1>Beispiel-Adressbuch.cpp(65): error C2682: "safe_cast" kann nicht verwendet werden, um "Adresse ^" in "int" zu konvertieren.

    Toa. Steht eh da? Was soll man dazu noch sagen? Schaut auch schräg aus, ein Zeiger auf ein Struct in einen int basteln.

    Cospieler schrieb:

    1>Beispiel-Adressbuch.cpp(67): error C2227: Links von "->Strasse" muss sich ein Zeiger auf Klassen-/Struktur-/Union-/generischen Typ befinden.

    ... und das links vom -> ist bei dir offenbar eben kein Zeiger auf ...

    Üblich ist es übrigens, den zu den Fehlermeldungen passenden Code zu zeigen.
    Vielleicht hilft https://tty1.net/smart-questions_de.html .

    theta schrieb:

    Anzumerken ist noch, dass C++/CLI eigentlich nur einen Zweck hat, und zwar die native Welt mit der managed .NET zu verbinden. Sie ist nicht geeignet, um Programmieren zu lernen oder für Projekte, wo die Interoperabilität nicht der Kernpunkt ist. Dafür hat die Sprache/Environment einfach zuviele Fallstricke und Dinge, die man wissen muss. Für .NET bietet sich C# an, für native z. B. C++.

    frei nach Cospieler schrieb:

    ich weiß als anfänger alles besser und tu sowieso, was mir in den sinn kommt, spart euch also bitte eure ratschläge, ich weiß was ich tue!

    Narr! Lern C++. 👍
    oder, Wutzmode: Dummer stümperhafter Narr! Lern C. 👍

    PS: aja, das übliche. Datentypen für Ganzzahlen sind nicht für Postleitzahlen geeignet.
    PPS: ... für Hausnummern übrigens auch nicht.



  • An Swordfish

    Denn Fehlerbericht kann ich auch lesen und brauche dazu keine Übersetzung und wer lesen kann, habe ich folgendes am 10.05.2017 geschrieben:

    "Habe den letzten Code mal in Visual Studio c++ 2010 in einer CLR-Konsolenanwendung nachgebaut (reingesetzt)."

    Also im Klartext den Code von theta der er am 05.05.2017 um 13:47:02Uhr bereit gestellt wurde.

    Und bezüglich nachlabern was man lernen sollte, kannst dir auch ersparen.

    Ich muss hier keinen kunt tun was ich vorher an Sprachen gelernt habe.

    Was ich hier suche sind klare Lösungswege und keine Krümel.
    Wo man sich klar gedanken zu machen kann wie es theta gemacht hat.
    Wo man sehen kann wie es richtig gemacht wird, damit der Code funktioniert.

    OK, wenn theta im Code sich vertann hat, dann ist es so.
    Dann braucht man nicht drauf rum hakken sondern klar sagen wie der Code auszusehen hat. Um Fehler zu erkennen.

    Also bitte klare und verständliche Lösungen, wie der Code zu ändern ist damit der Fehler weg ist.
    Damit auch die jenigen es lernen können die es noch nicht können.
    Also zeigen mit Code Beispielen.



  • Ich fürchte VS 2010 kann noch kein auto bzw. es hat dort eine andere Bedeutung. Das heisst man muss den Typen explizit angeben.

    Beispiel: Anstatt auto zuhause = gcnew Adresse; einfach Adresse^ zuhause = gcnew Adresse; schreiben.



  • Danke theta
    für deine Info und bemühen.
    Es würde mich freuen auch weiterhin von dir zu hören.
    Bei meinen nächsten Fragen die bestimmt noch kommen werden.

    Ich habe es alleine so gelöst bekommen:

    using namespace System;
    using namespace System::Collections::Generic;
    
    ref struct Adresse
    {
        property String^ Strasse;
        property int Postleitzahl;
        property String^ Ort;
    };
    
    int main(array<System::String ^> ^args)
    {
        auto zuhause = gcnew Adresse;
        zuhause->Strasse = "Time Square 57";
        zuhause->Postleitzahl = 10036;
        zuhause->Ort = "New York City";
    
        auto adressen = gcnew List<Adresse^>;
        adressen->Add(zuhause);
    
        while (true)
        {
            Console::Write("Neue Adresse hinzufügen? Ja ('j') oder Nein ('n'): ");
            auto hinzufuegenJaNein = Console::ReadLine();
            if (hinzufuegenJaNein->StartsWith("j"))
            {
                auto neueAdresse = gcnew Adresse;
    
                Console::Write("Gib die Strasse ein: ");
                neueAdresse->Strasse = Console::ReadLine();
    
                Console::Write("Gib die Postleitzahl ein (nur Zahlen erlaubt): ");
                auto postleitzahlEingabe = Console::ReadLine();
                auto postleitzahl = 0;
                if (int::TryParse(postleitzahlEingabe, postleitzahl))
                {
                    neueAdresse->Postleitzahl = postleitzahl;
                }
                else
                {
                    Console::WriteLine("Die Eingabe wurde nicht akzeptiert, die Adresse wird nicht hinzugefügt");
    
                    continue;
                }
    
                Console::Write("Gib den Ort ein: ");
                neueAdresse->Ort = Console::ReadLine();
    
                adressen->Add(neueAdresse);
            }
            else if (hinzufuegenJaNein->StartsWith("n"))
            {
                break;
            }
            else
            {
                Console::WriteLine("Die Eingabe wurde nicht akzeptiert, bitte erneut eingeben");
            }
        }
    
        /*
    	Die Zeilen in diesem Kommentar sind falsch:
    
    	for each (auto adresse in adressen)
        {
            Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
        }
    
    	Die Zeilen gegen diese ausgetauscht:
    	*/
    
    	for(int i=0; i<adressen->Count; ++i)
    		 Console::WriteLine(i+" {0}, {1} {2}", adressen[i]->Strasse, adressen[i]->Postleitzahl, adressen[i]->Ort);
    
    	Console::WriteLine("");
    	Console::WriteLine("Eine Taste betätigen um zu beenden.");
    	Console::ReadLine();
    
        return 0;
    }
    


  • Swordfish schrieb:

    oder, Wutzmode: Dummer stümperhafter Narr! Lern C. 👍

    👍



  • Cospieler schrieb:

    ...

    Dann liegt es wohl an auto im Zusammenhang mit for each und ist wohl ein Bug von VS2010.

    Das dürfte auch funktionieren:

    for each (Adresse^ adresse in adressen)
    {
        Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
    }
    


  • Cospieler schrieb:

    Ich muss hier keinen kunt tun was ich vorher an Sprachen gelernt habe.

    Ne. Gott sei dank nicht.

    Cospieler schrieb:

    Also bitte klare und verständliche Lösungen, wie der Code zu ändern ist damit der Fehler weg ist.

    auf welchem niveau behältst du bei dieser herangehensweise besser auch für dich 👍

    "Du musst dort statt auto einen konkreten Typ angeben." hab ich dir auch schon gesagt. mehr hat theta auch nicht gesagt. baby.



  • An theta

    Danke für die Info.

    Habe den Code wie folgt geändert, getestet und läuft.

    using namespace System;
    using namespace System::Collections::Generic;
    
    ref struct Adresse
    {
        property String^ Strasse;
        property int Postleitzahl;
        property String^ Ort;
    };
    
    int main(array<System::String ^> ^args)
    {
        auto zuhause = gcnew Adresse;
        zuhause->Strasse = "Time Square 57";
        zuhause->Postleitzahl = 10036;
        zuhause->Ort = "New York City";
    
        auto adressen = gcnew List<Adresse^>;
        adressen->Add(zuhause);
    
        while (true)
        {
            Console::Write("Neue Adresse hinzufügen? Ja ('j') oder Nein ('n'): ");
            auto hinzufuegenJaNein = Console::ReadLine();
            if (hinzufuegenJaNein->StartsWith("j"))
            {
                auto neueAdresse = gcnew Adresse;
    
                Console::Write("Gib die Strasse ein: ");
                neueAdresse->Strasse = Console::ReadLine();
    
                Console::Write("Gib die Postleitzahl ein (nur Zahlen erlaubt): ");
                auto postleitzahlEingabe = Console::ReadLine();
                auto postleitzahl = 0;
                if (int::TryParse(postleitzahlEingabe, postleitzahl))
                {
                    neueAdresse->Postleitzahl = postleitzahl;
                }
                else
                {
                    Console::WriteLine("Die Eingabe wurde nicht akzeptiert, die Adresse wird nicht hinzugefügt");
    
                    continue;
                }
    
                Console::Write("Gib den Ort ein: ");
                neueAdresse->Ort = Console::ReadLine();
    
                adressen->Add(neueAdresse);
            }
            else if (hinzufuegenJaNein->StartsWith("n"))
            {
                break;
            }
            else
            {
                Console::WriteLine("Die Eingabe wurde nicht akzeptiert, bitte erneut eingeben");
            }
        }
    
        /*
    	Die Zeilen in diesem Kommentar sind falsch:
    
    	for each (auto adresse in adressen)
        {
            Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
        }
    
    	Die Zeilen gegen diese ausgetauscht:
    	*/
    
    	for each (Adresse^ adresse in adressen)
    	{
    		Console::WriteLine("{0}, {1} {2}", adresse->Strasse, adresse->Postleitzahl, adresse->Ort);
    	}
    
    	/*
    	Die Zeilen gehen auch:
    	for(int i=0; i<adressen->Count; ++i)
    		 Console::WriteLine(i+" {0}, {1} {2}", adressen[i]->Strasse, adressen[i]->Postleitzahl, adressen[i]->Ort);
    	*/
    
    	Console::WriteLine("");
    	Console::WriteLine("Eine Taste betätigen um zu beenden.");
    	Console::ReadLine();
    
        return 0;
    }
    

    An Swordfish

    Will mit dir das Beleidigungsniveau nicht weiter fahren.

    Nur eins dazu, jeder fängt mal klein an und du gehst leider direkt von einem viel zu großen Wissenstand aus.
    Darum kann ich nur sagen das thetas Erklärungen viel einfacher zu verstehen sind.
    Das ist der feine Unterschied zwischen euch beiden.
    Mag sein das du helfen möchtest, ist auch gut so.
    Aber dann passe bitte deine Wortwahl dem Niveau an.
    Damit auch anderen eine bessere Change gegeben werden kann, ein Erfolg zu sehen.

    Ich verstehe auch deine Ansage zu C und C++.
    Habe auch in C programmiert, aber in eclipse.
    Und nur kleine Projekte.
    Mag sein das der Übergang zu C++ noch zu früh ist.
    Aber lass es mich doch einfach versuchen.
    Wenn ich es nicht schaffe, werde ich mich weiter nur mit C beschäftigen.

    Und ja, ich lese nicht nur Bücher.

    Also lasse uns bitte unser Streitigkeiten vergessen und neu starten OK?



  • Cospieler schrieb:

    Habe auch in C programmiert, aber in eclipse.
    Mag sein das der Übergang zu C++ noch zu früh ist.
    Wenn ich es nicht schaffe, werde ich mich weiter nur mit C beschäftigen.

    Diese Aussagen erwecken bei mir den Eindruck, dass du glaubst, man muss zuerst C programmieren lernen, um sich dann an C++ heranwagen zu können/dürfen.

    Dies halte ich für grundfalsch - C ist nicht C++, auch wenn C und C++ Überschneidungen haben und eine sehr gute Interoperabilität aufweisen. Aber der moderne Stil mit C++ zu programmieren, deckt sich überhaupt nicht mit den Dingen, die man in C üblicherweise anwendet (umgekehrt auch).

    Acuh die Annahme - von der ich nicht weiss, ob du sie auch getroffen hast -, man müsse in C++ zuerst manuelle Speicherverwaltung lernen, mit C-Arrays und C-Strings herumhantieren, um später gut C++ programmieren zu können, ist ein anderer, weit verbreiteter Irrtum. Das Gegenteil ist der Fall!

    Soviel zu C und C++. Dass du in den zitierten Aussagen C++ und nicht C++/CLI erwähnst, lassen mich zudem annehmen, dass du C++ und C++/CLI für dieselbe Sprache hältst. Das ist keineswegs der Fall. Der Unterschied zwischen C++ und C++/CLI ist sogar noch viel grösser als zwischen C und C++. Und auch hier ist eine sehr gute und gewünschte Interoperabilität vorhanden.

    So, und zum Lernen der Programmierung ansich denke ich, dass man es sich einfacher oder schwieriger machen kann. Du wählst eher die harte Tour, weil die Umgebung rund um C++/CLI einfach wahnsinnig viele Fallstricke bietet, funktioniert aber auch - im besten Fall lernt man noch viele zusätzliche Dinge, weil man länger im "Sumpf" rumwaten muss. 😉



  • An Theta

    Danke für deine Meinung.

    Also, warum ich mich damals für C entschieden hatte, war das ich in manch anderen Foren, gelesen hatte das man in C anfangen sollte bevor man in C++ einsteigt.
    Aber da hat jeder seine eigene Meinung.
    Daraufhin habe ich einfach mal mit C angefangen mit kleinen Projekten.
    Aber jetzt interessiere ich mich halt für C++/CLI und lese auch Bücher darüber.
    Aber manches ist nicht so gut beschrieben und darum kam ich in dieses Forum.

    Ja habe schon verstanden das C++ nicht gleich C++/CLI ist und meinte eigentlich auch C++/CLI nicht C++ im der letzten Nachricht.
    Aber die Ausmaße wie sicher tatsächlich die Codesprachen sind.
    Kann ich mir noch kein Bild machen, nur von Hören sagen.
    Darum will ich mir mein eigenes Bild machen und habe einfach mal angefangen in C++/CLI.

    Auch mit Arrays habe ich schon einige Erfahrungen gemacht.



  • 👍


Anmelden zum Antworten