Fehler bei char Felder



  • 1>c:\dokumente und einstellungen\neo\desktop\c++\übungen\aufgabe_listen15\aufgabe_listen15.cpp(63) : warning C4996: 'scanf': This function or variable may be unsafe. Consider using scanf_s instead. To disable deprecation, use _CRT_SECURE_NO_WARNINGS. See online help for details.
    1>        c:\programme\microsoft visual studio 9.0\vc\include\stdio.h(306): Siehe Deklaration von 'scanf'
    1>c:\dokumente und einstellungen\neo\desktop\c++\übungen\aufgabe_listen15\aufgabe_listen15.cpp(72) : error C2440: '=': 'char [50]' kann nicht in 'char' konvertiert werden
    1>        Es gibt keinen Kontext, in dem diese Konvertierung möglich ist
    

    Hier die Fehlermeldung.

    Also das ist ja das Problem ich weis nicht wie ich das umgehen kann. Ich will ja auf jedenfall den Char wert zuweisen. Muss ich das umcasten oder was kann ich da tun und vor allem wie?



  • Ich dachte, das wäre aus meinem Beitrag hervorgegangen. Hast du auch die anderen Vorschläge von mir berücksichtigt?

    So ginge es, wobei du evtl. noch schauen musst, dass die Dimension übereinstimmt.

    pTop->Ortskennung[i] = Ort;
    


  • Nexus schrieb:

    Ich dachte, das wäre aus meinem Beitrag hervorgegangen. Hast du auch die anderen Vorschläge von mir berücksichtigt?

    So ginge es, wobei du evtl. noch schauen musst, dass die Dimension übereinstimmt.

    pTop->Ortskennung[i] = Ort;
    

    Nein so geht es nicht.

    Also einiges habe ich geändert so wie die Bibliotheken und das print f aber das mit std:: habe ich nicht gemacht da ich das nicht kenne und nicht weis wie es verwendt wird.

    Ich will ja zb ereichen das fld[1][0]= die erste Ortskennung bekommt und fld[1][1] die zweite.
    in der ersten Zeile stehen die Zahlen 0-9.



  • Zeig mal bitte das nun auf C++ abgeänderte Programm und die Fehlermeldung.



  • Ist jetzt oben rein editiert



  • ChrisTucker schrieb:

    1>c:\dokumente und einstellungen\neo\desktop\c++\übungen\aufgabe_listen15\aufgabe_listen15.cpp(72) : error C2440: '=': 'char [50]' kann nicht in 'char' konvertiert werden
    1> Es gibt keinen Kontext, in dem diese Konvertierung möglich ist[/code]

    Hier die Fehlermeldung.

    Also das ist ja das Problem ich weis nicht wie ich das umgehen kann. Ich will ja auf jedenfall den Char wert zuweisen. Muss ich das umcasten oder was kann ich da tun und vor allem wie?

    In dem du auf std::string umstellst. Wenn du dich mit C quälen willst musst du dich auch mit den C-String funktionen rumquälen (Da gibt es keine Zuweisung mit = für Arrays und extra Funktionen zum Zuweisen/Kopieren von Zeichenliteralen).

    cu André



  • Also verstehe ich das richtig das ich es gar nicht anderst lösen kann?

    Was muss ich denn da dann alles genau ersetzen? wie muss dass aussehen wär toll wenn mir jm. sagen könnte in welchen Zeilen welche änderungen rein müssen oder mir mal ein Beispiel geben könnte für das std::



  • Sorry, vorher hab ich dir etwas Falsches erzählt. Das kommt davon, wenn man kaum mit char-Arrays arbeitet ;). Man würde die Zuweisung zweier C-Strings mit strcmp() erledigen.

    ChrisTucker schrieb:

    wär toll wenn mir jm. sagen könnte in welchen Zeilen welche änderungen rein müssen

    Abgesehen davon, dass wir hier nicht dein Programm neu schreiben wollen, würde dir das auch gar nichts bringen. Am besten suchst du dir dazu ein gutes Tutorial. In guten Büchern sollte std::string eigentlich auch angesprochen werden.

    Trotzdem ein kleines Beispiel:

    std::string Str1 = "Hallo";
    std::string Str2;
    Str2 = Str1;       // Zuweisung geht :P
    

    Ich weiss, ist nicht gerade das spektakulärste aller Beispiele, mehr Informationen gibts z.B. hier (trotzdem wär ein Tutorial/Buch ratsam am Anfang).



  • Ich blicks gerade nicht. des strcmp funktioniert nur mit strings oder sollte ich meinen Fehler damit beheben können.

    Also zeitlich bräucht ich jetzt ne schnelle Lösung.

    Deswegen nochmal die frage läst sich das nur mit strings lösen? Weil da müsste ich mcih erst rein arbeiten.

    Hab jetztmal strcmp verwendet kommt genau die gleiche Fehlermeldung!



  • ChrisTucker schrieb:

    ...strcmp funktioniert nur mit strings oder sollte ich meinen Fehler damit beheben können...

    "string" != "string"
    Mal sind "C-Strings" (= char-Arrays mit 0-Terminierung) gemeint und manchmal die Klasse aus der Standardlib std::string.

    Du kannst zwar das Eine mit dem Anderen "verknüpfen", aber sie sind nicht beliebig zu mischen.

    Gruß,

    Simon2.



  • ChrisTucker schrieb:

    Hab jetztmal strcmp verwendet kommt genau die gleiche Fehlermeldung!

    Dann hast du es falsch verwendet. Zeig mal wie du es eingesetzt hast.

    Aber generell würde ich in C++ zu std::string raten, dann kannst du die char-Arrays quasi vergessen.



  • Zuerst so

    pTop->Ortskennung[i][e] = i;
    

    und dann habe ich es darauf geändert

    strcmp(pTop->Ortskennung[i][e],i)
    

    Aber vielleicht reden wir jetzt auch aneinander vorbei!



  • hat noch niemand gesagt, dass strcmp nicht zur "zuweisung" ist, sondern als abkürzung für stringcompare steht?

    zum "zuweisen" von C-strings (aka null-terminated-byte-strings, ntbs) verwendet man strcpy bzw. strncpy, wobei sichergestellt werden muss, dass man nicht mehr zeichen kopiert, als platz zur verfügung steht. und am ende muss man natürlich den angeforderten speicher wieder freigeben.

    all das erspart man sich mit std::string .



  • ChrisTucker schrieb:

    Also zeitlich bräucht ich jetzt ne schnelle Lösung.

    Dennoch ist es nicht unsere Aufgabe dir deinen Code umzuschreiben, und es gibt nun wirklich genug Tutorials in denen man strings erklärt bekommt. Grundsätzlich musst du hier auch 2 unterschiedliche Programmierstile verstehen.

    Unter C verwendet man char-Arrays und char-Pointer, sogenannte C-Strings. Diese können nur über separate Funktionen (#include <cstring>) sinnvoll manipuliert werden.

    Unter C++ setzt man in der Regel auf die Klasse std::string (std:: weil die Klasse im Namensraum std liegt) die auch den Zuweisungsoperator etc. von haus aus mitbringt.

    Die Themen Namensräume und std::string sollten in JEDEM guten C++ Buch mit als allererstes erklärt werden. Es ist aber auch nicht unsere Aufgabe dir alles bis ins letzte Detail zu erklären, es wurde schon auf Tutorials etc. verwiesen. Kostenlos sind auch die beiden englischen Bücher von Bruce Eckel erhältlich.

    So, dennoch eine wirklich kurze Erklärung:

    Namensräume
    Namensräume dienen dazu Namenskonflikte zu vermeiden. Die C++ Standardbibliothek ist im Namensraum std.

    #include <string>
    #include <iostream>
    
    int main()
    {
      std::string text = "Hallo";
      text += " Welt"; // Addition ist möglich
      std::cout << text << std::endl; // Auch cout, endl liegt im Namensraum std;
    }
    

    Dies kann man auch wie folgt schreiben. Dabei ist aber zu beachten das man using namespace NIE im Header verwenden sollte.

    #include <string>
    #include <iostream>
    
    using namespace std; // Holt den Namensraum std in den globalen Namensraum
    
    int main()
    {
      string text = "Hallo";
      text += " Welt"; // Addition ist möglich
      cout << text << endl; // Auch cout, endl liegt im Namensraum std;
    }
    

    Wozu braucht man nun Namensräume? Nehmen wir mal folgendes typedef für ein char[20] hinein, wie es erst vor kurzen hier aufgetaucht ist:

    #include <string>
    
    typedef char string[20];
    
    // using namespace std; <-- Nicht möglich Namenskonflikt!
    
    int main()
    {
      string a;      // Eigentlich char a[20];
      std::string b; // std::string aus <string>
    }
    

    cu André



  • queer_boy schrieb:

    hat noch niemand gesagt, dass strcmp nicht zur "zuweisung" ist, sondern als abkürzung für stringcompare steht?

    Genau solche Verwechslungen passieren eben, wenn man schon ewig keine char-Arrays mehr benutzt hat 😃
    Tut mir leid wegen der daraus entstandenen Unklarheiten. Hier noch einmal einige wichtige Funktionen der beiden Datentypen im Vergleich ( std::string bietet meistens mehrere Lösungsmöglichkeiten an):

    char-Arrays (nullterminierte C-Strings) (C)

    char Text[30];
    
    // Zuweisung
    strcpy(Text, "Hallo");
    
    // Anhängung
    strcat(Text, " wie geht es?");			
    
    // Vergleich	
    if (!strcmp(Text, "Hallo wie geht es?"))
    	/* ... */;
    

    std::string-Klasse (C++)

    std::string String;
    
    // Zuweisung
    String = "Hallo";
    String.assign("Hallo");
    
    // Anhängung
    String += " wie geht es?";
    String = String + " wie geht es?";
    String.append(" wie geht es?");
    
    // Vergleich
    String = "Hallo wie geht es?";
    if (!String.compare("Hallo wie geht es?"))
    	/* ... */;
    if (String == "Hallo wie geht es?")
    	/* ... */;
    

    Neben der vereinfachten Handhabung durch Memberfunktionen und Operatoren kann std::string im Gegensatz zu den statischen Arrays dynamisch vergrössert werden. Man muss sich auch nicht um die Speicherverwaltung kümmern, Pufferangaben kann man sich sparen. Ausserdem hat man die benötigten Funktionen gerade als Member der Klasse und nicht irgendwo global.


Anmelden zum Antworten