Verschiedene Fragen



  • Habe wieder ein paar fragen::D
    1. Wie funktioniert der g++ compiler unter linux in verbindung mit mehreren Dateien (habe dafür nichts gefunden 🙄 )
    2. Was ist "intelligenter":

    //1. 
    int *last=arr+len-1;
    for(;arr<last;arr++)
    {
        //Irgendwas
    }
    
    //2.
    int *last=arr;
    for(;arr<last+len-1;arr++)
    {
        //Irgendwas
    }
    

    Ich denke mal 1., weil beim zweiten muss er das ganze bei jedem durchlauf ausrechnen
    .
    3. Für was genau sind cin.clear() und cin.sync() gut?

    Hoffe das war das richtige forum, weil es drei relativ unterschiedliche fragen sind:D



  • FUNPAQ schrieb:

    1. Wie funktioniert der g++ compiler unter linux in verbindung mit mehreren Dateien (habe dafür nichts gefunden 🙄 )

    Du compilierst erst alle Dateien. Entweder einzeln oder vielleicht geht auch:

    gcc -c 1.cc 2.cc *.cc
    

    Dann linkst du sie zusammen:

    gcc *.o
    

    3. kannst du bestimmt in irgendeiner Doku im Internet nachschlagen.

    Gruß
    Entyl Sa



  • es gibt auch die möglichkeit ein make zu definieren:

    Ziel: benötigte Dateien
    durchzuführende Befehle //braucht tap einschub!

    bsp:

    test: test.o misc.o
    g++ test.cpp -o test.o

    misc.o: misc.cpp
    g++ -c misc.cpp

    cin.sync und cin.clear brauchst du um den Eingabebuffer (von der tty1) zu synchronisiern bez. zu leeren.

    Edit:

    der Tabeinschub wird nicht dargestellt, jeweils in der Zeile unter dem zeil:, bruacht es einen tab einschub

    Edit2:

    muss das nicht ins Linux/Unix forum?



  • Zu 2.

    Theoretisch ist die 1. Variante "besser". Allerdings macht es, glaube ich, keinen Unterschied was du hernimmst, wenn dein Compiler intelligent genug ist (und auch so eingestellt ist ;)) zu erkennen, dass bei der zweiten Variante sich die Bedingung nicht ändert (wovon ich jetzt mal ausgehe). Außerdem macht dieser kleine Unterschied (auch wenn der Compiler nicht so intelligent wäre) so gut wie nichts aus. Die Zeit, die der Rechner zum Berechnen braucht ist dermaßen minnimal, dass du schon sehr sehr sehr viele Durchläufe bei der Schleife brauchst, damit der Unterschied überhaupt bemerkt werden kann. Wobei ein Mensch wahrscheinlich auch dann gar keinen Unterschied erkennen wird.



  • Sorry, das DSL Modem ist kaputt gegangen und somit hatte ich erstmal keine Internet mehr 😮

    Erstmal thx für eure zahlreichen antworten.

    Jedoch tauchten mal wieder einige Fragen in der Zwischenzeit auf 😃 .
    Wie muss ich mir so was vorstellen:

    char *string[]={"Der erste String.",
    		     "Ein weiterer String.",
    		     "usw."};
    

    Ich würde das so sehen, nachdem char *name="Hallo" auf "H" zeigen würde, wird das auch so bei diesem Array (char *string[]) sein. Sprich:
    string[1] auf "D"
    string[2] auf "E"
    string[3] auf "u"
    Wie kann ich diese aber ausgeben? Normalerweise so:

    cout<<string[1]<<endl;
    

    ... weil die Ausgabe Streams so überladen wurden. Aber was passiert da genau, besser gesagt woher weiß "der" wo die anderen Buchstaben im Speicher liegen.
    Ich weiß ein wenig blöd erklärt, ich hoffe aber wisst was gemeint ist :D...

    Meine zweite Frage ist einfacher:
    Wenn man in Dateien schreib kann man das ja in zwei Modis machen.
    1. Formatiert: Braucht man z.B. wenn man einen HTML Editor schreibt.
    2. Binär: Das verstehe ich nicht ganz bei mir im Buch heißt es, das die Dateien so eingelesen werden wie sie dem Programm vorliegen. Da verstehe ich "1010001". Wenn ich die Datei aber z.B. mit dem Editor öffne stehen da nur komische Zeichen.
    Liegt das einfach nur daran das die einzelnen Bits ("1010001") im Editor als ASCII Zeichen dargestellt werden?



  • FUNPAQ schrieb:

    woher weiß "der" wo die anderen Buchstaben im Speicher liegen.

    Da der nächste Buchstabe im Speicher direkt hinter dem ersten liegt usw. so kann er den nächsten Buchstaben finden in dem er einfach die Adreese hochzählt. das macht er so lange bis er eine 0 (oder als char '\0') findet, dann weis er das der c_string hier zuende ist.



  • Zu 2.
    Deine Annahme ist richtig. Der Editor wandelt den Inhalt der Datei in ASCII-Zeichen um oder besser gesagt, er stellt den Inhalt als ASCII-Zeichen dar.



  • THX, für eure Antworten 😃

    @Mirauder_Mo
    ich dachte aber immer das die in einem Array gespeicherten Variablen hinter einander abgespeichert werden würden. Also z.B.
    int arr[5];
    arr[0] -> Adresse 1000
    arr[1] -> Adresse 1004
    arr[2] -> Adresse 1008
    arr[3] -> Adresse 10012
    arr[4] -> Adresse 10016

    Wie wäre das dann bei char* string[] 😕

    char *string[]={"Der erste String.",
                 "Ein weiterer String.",
                 "usw."};
    

    string[0] -> Adresse 1000
    string[1] -> Adresse (1000+sizeof(string[1]))
    string[2] -> Adresse (1000+sizeof(string[1])+sizeof(string[2]))



  • FUNPAQ schrieb:

    ich dachte aber immer das die in einem Array gespeicherten Variablen hinter einander abgespeichert werden würden.

    Genau so ist es, und dein Beispiel mit den int Array ist realitätsnah, bis darauf das nach 1008 (tausendacht) nicht 10012 (zehntausendzwölf) kommt 😃

    string[0] -> Adresse 1000
    string[1] -> Adresse (1000+sizeof(string[1]))
    string[2] -> Adresse (1000+sizeof(string[1])+sizeof(string[2]))
    

    Das ist natürlich unsinn. Und wenn, dann müsste es so aussehen.

    string[0] -> Adresse 1000
    string[1] -> Adresse (1000+sizeof(string[0]))
    string[2] -> Adresse (1000+sizeof(string[0])+sizeof(string[1]))
    

    Aber du hast ja ein Array von char * und da liegen die Zeiger direkt hintereinander. ungefähr so:

    char * arr[5];
    arr[0] -> Adresse 1000 (z.B. mit dem Wert 1012)
    arr[1] -> Adresse 1004 (z.B. mit dem Wert 1016)
    arr[2] -> Adresse 1008 (z.B. mit dem Wert 1020)
    
    Adresse 1012 'a'
    Adresse 1013 'b'
    Adresse 1014 'c'
    Adresse 1015 '\0'
    Adresse 1016 'a'
    Adresse 1017 'b'
    Adresse 1018 'c'
    Adresse 1019 '\0'
    Adresse 1020 'a'
    Adresse 1021 'b'
    Adresse 1022 'c'
    Adresse 1023 'd'
    Adresse 1024 'e'
    Adresse 1025 'f'
    Adresse 1026 'g'
    Adresse 1027 'h'
    Adresse 1028 '\0'
    


  • THX, hab vergessen das das ja char* in dem Array sind 🙄



  • Hi

    Nochmal zum kompilieren. Es ist ohne weiteres möglich folgendes zu schreiben:
    g++ -o Foo foo.cpp bar.cpp foobar.cpp

    Nur so als Anmerkung am Rande.


Anmelden zum Antworten