Kurze Frage , Kurze Antwort


  • Mod

    Skym0sh0 schrieb:

    Zur Not machst dus wie die Standardbibliothek und machst halt Templates aus den Parametern:

    Das sollte nicht der Notfall, sondern der Normalfall sein. Ich bin gerade nur etwas verwirrt, ob der TE einen legitimen Grund hat, das nicht so zu machen, oder ob er das einfach nur nicht kennt.



  • SeppJ schrieb:

    Skym0sh0 schrieb:

    Zur Not machst dus wie die Standardbibliothek und machst halt Templates aus den Parametern:

    Das sollte nicht der Notfall, sondern der Normalfall sein. Ich bin gerade nur etwas verwirrt, ob der TE einen legitimen Grund hat, das nicht so zu machen, oder ob er das einfach nur nicht kennt.

    Sollte es echt der Normalfall sein? 😕
    Ich mein, man müsste die Funktion ja dann allgemein halten.

    Und eigentlich fehlen dann noch type_traits und sowas...



  • PS: Bitte benutze aussagekräftige Threadnamen, die den Inhalt beschreiben, nicht irgendwelche Metainformationen. Vor allem, da hier wohl kaum von kurzer Frage und kurzer Antwort die Rede sein dürfte.

    Sorry, kurze Frage und kurze Antwort war noch auf die Ursprüngliche Frage :

    kurze Frage:

    Funktionen wie std::begin(XY) für ein normales Array, kann ich für "passed Arrays" nicht verwenden, oder stelle ich mich nur zu doof?

    gedacht, hat sich bisschen weiterentwickelt sorry.

    SeppJ schrieb:

    Skym0sh0 schrieb:

    Zur Not machst dus wie die Standardbibliothek und machst halt Templates aus den Parametern:

    Das sollte nicht der Notfall, sondern der Normalfall sein. Ich bin gerade nur etwas verwirrt, ob der TE einen legitimen Grund hat, das nicht so zu machen, oder ob er das einfach nur nicht kennt.

    Ähm ja, wei ich das "einfach NOCH nicht kenne" 🙂

    Zeiger sind Iteratoren.
    begin liefert bei einem Array einen Zeiger zurück.

    Danke, das hilft mir jetzt erst mal weiter.

    @SeppJ :

    Entspricht irgendwas hiervon dem, was du suchst?

    Ja, das ist hilfreich, jedoch habe ich zur Syntx eine Frage :

    void array_pointer_overload(int (*)[3]) {cout << "Pointer auf Array Überladung, 3 int\n";}
    
    und 
    
    array_pointer_overload(&p_3);
    

    // array_pointer_overload erwartet jetzt einen Pointer auf ein Array mit 3 Ints... right? darum wird &p_3 und nicht p_3 (wäre nur ein Pointer auf auf ein int array , da der Name nur auf einen Pointer auf den Anfang zerfällt. ) immer noch right ?

    So, aber wie um alles könnte ich Elemente des Arrays mit dieser Funktionsdefinition in der Funktion benuzten?

    void array_pointer_overload(int (*)[3]){
         // Gib z.B: Element 2 aus : 
         // bräuchte ich da nicht  void array_pointer_overlaod(int (*)[3]irgendwas)
    

    Freitag Vormittags steh ich evtl. noch ein bisschen aufm Schlauch....



  • bzw. :

    void array_pointer_overload(int (*irgendwas)[3]){
    ..
    


  • void array_pointer_overload(int (*test)[3])
    {
        for(int i : *test)
        {
            cout << i << '\n';
        }
    }
    


  • Und wie ändert man da z.B. den wert [2] ?



  • Das wäre doch dann

    *(*test+2) = 45 ?? Das macht es Syntax Technisch nicht gerade leichter?



  • (*test)[2] = new_val;
    

    Referenzen auf Arrays sind da aber angenehmer, da spart man sich die Dereferenzierung.



  • wie würde das dann aussehen?



  • So oder :

    void array_pointer_overload(int (&test)[3], int item) {
    
    	std::cout << "with ref: \n"; 
    
    	std::cout << test[item];
    }
    


  • Kann ich eine Do While schleife in einer Do while schleife haben?

    Beispiel:

    do 
    {
    <restlicher code>
    do
    {
    <mehr restlicher code>
    }while (X != 1)
    }while (y != 1)
    


  • Wieso nicht. Probiers doch einfach aus.


  • Mod

    Skym0sh0 schrieb:

    SeppJ schrieb:

    Skym0sh0 schrieb:

    Zur Not machst dus wie die Standardbibliothek und machst halt Templates aus den Parametern:

    Das sollte nicht der Notfall, sondern der Normalfall sein. Ich bin gerade nur etwas verwirrt, ob der TE einen legitimen Grund hat, das nicht so zu machen, oder ob er das einfach nur nicht kennt.

    Sollte es echt der Normalfall sein? 😕
    Ich mein, man müsste die Funktion ja dann allgemein halten.

    Und eigentlich fehlen dann noch type_traits und sowas...

    Andersrum: Wenn man eine allgemeine Funktion wünscht (oder die Funktion sowieso schon allgemein ist*), dann ist dies der normale Weg.

    *: Ich weiß nicht, wie es euch geht, aber ich habe andauernd den Fall, dass ich bei einer Funktion Eigenschaften wie "eigentlich ist es ganz egal, welche Art von Daten sie verarbeitet, Hauptsache irgendwie iterierbar" oder ähnliches bemerke+. Dann kann und werde ich diesen Umstand auch nutzen. Vielleicht programmiere ich auch unterbewusst abstrakter als die meisten anderen Leute.
    +: Normalerweise nicht im Nachhinein, sondern schon im Voraus, wenn ich mir die Aufgabe der Funktion überlege und wie sie dies ungefähr umsetzt. Aber es ist auch schon vorgekommen, dass ich die Abstraktion erst im Nachhinein bemerkt habe.



  • Again, kurze Frage zum "zeichen für zeichen" einlesen :

    char buffer[20]
    std::ifstream datei("test.txt", std::ios_base::in);
    
    for (int i = 0; i < ...){
    
       buffer[i] = datei.get();
         //oder
       datei.get(buffer[i]);
    }
    

    Egal, oder ist eine Verison vorzuziehen?



  • Nachtrag:

    oder wenn ich die Länge des Textes weiß, Variante 3:

    char *cp = new char [len] ;
    
     datei.getline(cp, len);
    


  • int_type get();
    
    1. Reads one character and returns it if available. Otherwise, returns Traits::eof() and sets failbit and eofbit.
    basic_istream& get(char_type& ch);
    
    1. Reads one character and stores it to ch if available. Otherwise, leaves ch unmodified and sets failbit and eofbit. Note that this function is not overloaded on the types signed char and unsigned char, unlike the formatted character input operator>>.
    1. liefert dir im Fehlerfall eof zurück, 2) ändert im Fehlerfall buffer[i] nicht.
      Ich würde 2) verwenden, weil man dann einfach schön den Stream prüfen kann.
    if (!datei.get(buffer[i]))
      error();
    


  • cpp_beg schrieb:

    Nachtrag:

    oder wenn ich die Länge des Textes weiß, Variante 3:

    char *cp = new char [len] ;
     
     datei.getline(cp, len);
    

    Vorausgesetzt du verwendest ordentliches RAII und kein new.



  • Ich check das mit dem RAII nicht ganz. Hab mir den Wikipedia Artikel schon durchgelesen, aber wie wäre das in oben geannten Bspl. angewandt?



  • beg_offl schrieb:

    Ich check das mit dem RAII nicht ganz. Hab mir den Wikipedia Artikel schon durchgelesen, aber wie wäre das in oben geannten Bspl. angewandt?

    Zum Beispiel mit dem Nutzen von std::vector oder std::unique_ptr<char[]>.



  • Nathan schrieb:

    int_type get();
    
    1. Reads one character and returns it if available. Otherwise, returns Traits::eof() and sets failbit and eofbit.
    basic_istream& get(char_type& ch);
    
    1. Reads one character and stores it to ch if available. Otherwise, leaves ch unmodified and sets failbit and eofbit. Note that this function is not overloaded on the types signed char and unsigned char, unlike the formatted character input operator>>.
    1. liefert dir im Fehlerfall eof zurück, 2) ändert im Fehlerfall buffer[i] nicht.
      Ich würde 2) verwenden, weil man dann einfach schön den Stream prüfen kann.
    if (!datei.get(buffer[i]))
      error();
    

    Würde dann folgendes Reichen um eine Datei Zeichen für Zeichen einzulesen? Das ist Fehlerprüfungstechnisch etwas dünn oder??

    std::fstream orig("orig.txt", std::ios_base::in);
    
    char c;
    
    while( orig.get(c) ){
    
    	std::cout << c;
    }
    

Anmelden zum Antworten