Seite 4 von 148 ErsteErste 123456781454104 ... LetzteLetzte
Ergebnis 46 bis 60 von 2214

Thema: [Programmiererstammtisch] "Zum ächzenden Compiler"

  1. #46
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    18.755
    Ist die Uni eine surreale Welt?

  2. #47
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.592
    Zitat Zitat von Neme Beitrag anzeigen
    Seid ihr alle Akademiker? Ich hab an der Uni auch viel Mist gelernt (z.B. Cobol, Lisp), aber seit ich in der realen Welt angestellt bin, seh ich eigentlich fast ausschließlich .NET.
    Mathematiker (mit Nebenfach Informatik). Python, Java und Haskel kamen da vor, wobei ich Python schon vorher konnte. Haskel ist ganz interessant von den Konzepten her, nur leider nicht brauchbar. Als Mist würde es es aber dennoch nicht bezeichnen, diese Ehre bleibt allein Java vorbehalten. Einfach grausam das statische Typsystem dort.

  3. #48
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Zitat Zitat von Arminius Beitrag anzeigen
    Guck Dir bei Snippets halt mal an, wie Autocompletionsyntax aussieht. Danach kannst Du es Dir eigentlich relativ problemlos von Hand weiterkonfigurieren, finde ich zumindest.
    Hab grad das Problem das snipmate ein Haufen errors wirft wenn ich ans Ende tabbe

    Habs erstmal das Ding aufgegeben und versuch mal was kleines ohne irgendwas zu machen

  4. #49
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    So, mal den ganzen Abend was kleines in vim programmiert. Muss sagen das mir bis jetzt die Autovervollständigung von Funktionen, Variablen und so Zeug fehlt. Also das bekannte STRG-SPACE

    Debugen dürfte wohl auch recht schwer sein...

  5. #50
    Registrierter Benutzer Avatar von Ramkhamhaeng
    Registriert seit
    19.07.10
    Ort
    Aralkum
    Beiträge
    8.461
    Als Basisfunktion, die immer funktioniert, kannst du Strg+N bzw. Str+P verwenden, um Wörter zu vervollständigen. Etwas intelligenter ist dann http://vim.wikia.com/wiki/Omni_completion, aber da kann man sich ggf. ne andere Tastenkombination suchen. Gibt auch nen Plugin für das Verhalten, wie man es aus IDE's kennt. Vllt. kann Arminius dazu noch was schreiben, da ichs nicht verwende.
    Geändert von Ramkhamhaeng (17. März 2014 um 00:01 Uhr)

  6. #51
    Rübennase Avatar von Arminius
    Registriert seit
    26.07.03
    Ort
    Heidelberg
    Beiträge
    5.911
    Zitat Zitat von Ramkhamhaeng Beitrag anzeigen
    Vllt. kann Arminius dazu noch was schreiben, da ichs nicht verwende.
    Ne, der benutzt nur das standardmäßige <C-n>.
    Knick, knack.

  7. #52
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Dynamische Speicherallokation

    Aber mal nee Frage: Bei c++, macht das hier Sinn?

    PHP-Code:
    List::List(){
        
    head = new ListElem(); // Dynamische Allocation??? 
    }

    List::~List(){
        
    //#todo: delete every elem in List
        
    delete head;
    }

    void List::addElemInFront(int data){
        
    ListElemnewElem = new ListElem(datahead);
        
    head newElem;
    }

    //look if elem is there and delete /jump over it 
    void List::deleteFirstElem(){
        
    ListElemtmp head->getNext();
        
        
    //delete Elem itself
        
    head->deleteElem(); //sets Elem Values and NextPointer to 0
        
    delete head

        
    head tmp;

    Geht mir vorallem ums löschen. Wenn ich delete head; aufrufe wird ja der Speicher der für head allokiert wurde wieder freigegeben. Kann ich dann überhaupt wieder das nächste Element dran linken? In meinem Kopf macht das irgendwie Sinn, weil der Pointer dann nur auf einen anderen Bereich verweist und es scheint zu funktionieren, kann das aber irgendwelche späteren Probleme bringen?

    Achja: Kann es sein das man wegen der dynamischen Speicherallokation sogut wie alles mit -> aufruft statt .? Weil letzteres geht ja nur bei statischem zeug...

  8. #53
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    18.755
    delete head ruft den dekonstructor von ListElem() auf. Ist ListElem richtig gecodet wurden, musst du dir keine Gedanken machen. Ich gehe mal davon aus.

    edit: Verstehe ich es richtig, du möchtest ein Element löschen und damit gleich die ganze Liste? Dann musst du jedes Element einzeln Löschen. Sichere dir vorher den Kopf des nächsten Listenelementes und lösche dann.
    Geändert von rucivfan (18. März 2014 um 17:07 Uhr)

  9. #54
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Zitat Zitat von rucivfan Beitrag anzeigen
    delete head ruft den dekonstructor von ListElem() auf. Ist ListElem richtig gecodet wurden, musst du dir keine Gedanken machen. Ich gehe mal davon aus.
    PHP-Code:
    ListElemListElem::deleteElem(){
            
    ListElemtmp next;
            
    this->data 0;
            
    this->next 0;
            return 
    tmp;

    und ein ~ListElem() hab ich garnicht, ist das Default ding

    Soll ich also das ganze in:

    PHP-Code:
    ListElem::~List(){
            
    this->data 0;
            
    this->next 0;

    und

    PHP-Code:
    void List::deleteFirstElem(){ 
        
    ListElemtmp head->getNext(); 
         
        
    //delete Elem itself 
        //sets Elem Values and NextPointer to 0 
        
    delete head;  

        
    head tmp

    umschreiben?

    Merke das ich auch noch nen Fehler in der anderen Funktion habe, hab die deleteElem() extra geschrieben das ich tmp nicht speichern muss und mach es trotzdem

    Also ruft delete x; immer den deconstruktor von x auf und setzt den speicher frei egal was in ~x steht? Ist ~x also nur dafür da das dynamisch Allokierter Speicher in der Klasse wieder deallokiert wird?

  10. #55
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    18.755
    Im Ersten Codefenster bekommst du den Zeiger auf das nächste Element zurück.

    ListElem* newHead = head->deleteElem();
    delete head;
    head = newHead ;

    So müsste es sicher sein.

    Ja, du solltest ~List() und deleteFirstElem umschreiben. (edit: deleteFirstElem ist nicht notwendig, wenn das der Dekonstruktor macht. Das nächste Element ist ja gesichert mit next.)

    Also ruft delete x; immer den deconstruktor von x auf und setzt den speicher frei egal was in ~x steht? Ist ~x also nur dafür da das dynamisch Allokierter Speicher in der Klasse wieder deallokiert wird?
    edit:Richtig, Falsch, Richtig! Der Konstruktor muss nur vollständig sein.

    Habe gedacht, das du es erst richtig verstanden hast. Deswegen Korrektur, streiche das egal. delete löscht alle Attribute. Bei Pointern als Attribut muss der Dekonstruktor sich um die Sachen kümmern auf welche die Pointer zeigen. Bei einer aArraylist muss halt delete [] aArraylist aufgerufen werden.
    Geändert von rucivfan (18. März 2014 um 17:30 Uhr)

  11. #56
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Zitat Zitat von rucivfan Beitrag anzeigen
    Im Ersten Codefenster bekommst du den Zeiger auf das nächste Element zurück.

    ListElem* newHead = head->deleteElem();
    delete head;
    head = newHead ;

    So müsste es sicher sein.

    Ja, du solltest ~List() und deleteFirstElem umschreiben.
    Das war so der Ursprüngliche Plan. Wie wichtig ist aber dann das setzen des Value und nextPointers auf 0 wenn der Speicher eh wieder freigegeben wird? Dann steht da zwar Müll aber solange nicht drauf zugegriffen wird ist das doch egal? Oder ist es nur zur Sicherheit falls doch jemand drauf zugreift er das ganze testen kann ob es nicht 0 ist?

    Oder anders gefragt könnte ich den ~List() leer lassen, und dann einfach:

    PHP-Code:
    ListElemnewHead head->getNext();
    delete head;
    head newHead 
    schreiben?

    Wie gesagt, im alten Head würde dann Müll stehen, aber da niemand auf ihn verweist dürfte das doch egal sein, und idealerweise würde ich sowieso nie auf undeklarierten Speicher zugreifen


    Richtig, Falsch, Richtig! Der Konstruktor muss nur vollständig sein.

    edit: Habe gedacht, das du es erst richtig verstanden hast. Deswegen Korrketur, streiche das egal. delete löscht alle Attribute. Bei Pointern muss aber der Dekonstruktor sich um die Sachen kümmern auf welche die Pointer zeigen.
    Also bei einer List Klasse würde der Dekonstruktor so aussehen:

    PHP-Code:
    ~List(){
    while(
    head->getNext() != 0) {
    ListElemtmp head->getNext();
    delete head
    head tmp;
    }

    delete head//last head 

    head 0//<< muss das hier dazu?

    Die beiden delete heads sorgen dafür das der Inhalt des Pointers deallokiert wird, und ~List sorgt dann dafür das der Speicher den der Pointer selber belegt selber deallokiert wird? Die gleiche Frage wie oben, muss ich den Pointer und andere Variablen auf 0 setzen?

  12. #57
    Civ4 BASE Coder Avatar von rucivfan
    Registriert seit
    10.07.11
    Ort
    Antarktika
    Beiträge
    18.755
    Zitat Zitat von [VK] Beitrag anzeigen
    Das war so der Ursprüngliche Plan. Wie wichtig ist aber dann das setzen des Value und nextPointers auf 0 wenn der Speicher eh wieder freigegeben wird? Dann steht da zwar Müll aber solange nicht drauf zugegriffen wird ist das doch egal? Oder ist es nur zur Sicherheit falls doch jemand drauf zugreift er das ganze testen kann ob es nicht 0 ist?
    Solange du dieses Element nicht mehr nutzt, ist es egal. Aber sicherer ist es alles auf 0 zu setzen. Es kann ja irgend ein anderer Pointer noch auf das Element zeigen.

    Oder anders gefragt könnte ich den ~List() leer lassen, und dann einfach:

    PHP-Code:
    ListElemnewHead head->getNext();
    delete head;
    head newHead 
    schreiben?

    Wie gesagt, im alten Head würde dann Müll stehen, aber da niemand auf ihn verweist dürfte das doch egal sein, und idealerweise würde ich sowieso nie auf undeklarierten Speicher zugreifen
    Wenn du ~List() leer lässt, werden deine Listenelemente nicht gelöscht! Du musst die solange das nächste Element dir geben lassen und löschen bis du das Ende erreicht hast! Es wird sonst nur der Pointer gelöscht beim Listenlöschen.


    Also bei einer List Klasse würde der Dekonstruktor so aussehen:

    PHP-Code:
    ~List(){
    while(
    head->getNext() != 0) {
    ListElemtmp head->getNext();
    delete head
    head tmp;
    }

    delete head//last head 

    head 0//<< muss das hier dazu?

    Alles bis auf das head = 0 ist notwendig. Attribute wie der Pointer head werden durch delete automatisch gelöscht.

    Die beiden delete heads sorgen dafür das der Inhalt des Pointers deallokiert wird, und ~List sorgt dann dafür das der Speicher den der Pointer selber belegt selber deallokiert wird? Die gleiche Frage wie oben, muss ich den Pointer und andere Variablen auf 0 setzen?
    Beide ist der falsche Begriff. Ich weiß was du meinst, aber in der Schleife ist Head immer ein anderes Element. Und ja, die Listenelemente werden deallokiert. Nein, man muss nicht auf 0 setzen, es ist aber immer sicherer, etwas auf 0 zu setzen.

  13. #58
    Registrierter Benutzer Avatar von alpha civ
    Registriert seit
    22.07.06
    Beiträge
    16.592
    Gar nicht erst rohe Zeiger verwenden, sondern direkt auf intelligente Zeiger setzen. Dann muss man auch nicht den Dekonstruktor (sowie Kopierkonstruktor und Zuweisungsoperator!) implementieren. delete muss man nicht mehr verwenden, und die Gefahr durch Speicherlecks wegen Ausnahmen ist nicht mehr vorhanden.

  14. #59
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Zitat Zitat von rucivfan Beitrag anzeigen
    Solange du dieses Element nicht mehr nutzt, ist es egal. Aber sicherer ist es alles auf 0 zu setzen. Es kann ja irgend ein anderer Pointer noch auf das Element zeigen.



    Wenn du ~List() leer lässt, werden deine Listenelemente nicht gelöscht! Du musst die solange das nächste Element dir geben lassen und löschen bis du das Ende erreicht hast! Es wird sonst nur der Pointer gelöscht beim Listenlöschen.
    Das hätte ~ListElem() heißen müssen, das leer sein soll und das war deleteFirstElem()



    Alles bis auf das head = 0 ist notwendig. Attribute wie der Pointer head werden durch delete automatisch gelöscht.
    Gut, schaden wird es dann nicht das immer dazuzuschreiben

    Beide ist der falsche Begriff. ICh weiß was du meinst, aber in der Schleife ist Head immer ein anderes Element. Und ja, die Listenelement werden deallokiert. Nein, man muss nicht auf 0 setzen, es ist aber immer sicherer, es auf 0 zu setzen.
    Hmm, bin gerade am überlegen das wenn ich delete List->getHead(); in zbs der Main aufrufen würde das das ganze dann im Grunde geschrottet wird da nur das erste Element deallokiert wird, und die restlichen weiterhin bestehen bleiben...

    Kann eine Element sich selber zerstören? Also ginge sowas wie:

    ListElem* ListElem::deleteElem(){

    ListElem* tmp = next;
    delete this;
    return tmp;
    }

  15. #60
    Vorsitzender Kitano Avatar von [VK]
    Registriert seit
    05.02.08
    Beiträge
    45.476
    Zitat Zitat von alpha civ Beitrag anzeigen
    Gar nicht erst rohe Zeiger verwenden, sondern direkt auf intelligente Zeiger setzen. Dann muss man auch nicht den Dekonstruktor (sowie Kopierkonstruktor und Zuweisungsoperator!) implementieren. delete muss man nicht mehr verwenden, und die Gefahr durch Speicherlecks wegen Ausnahmen ist nicht mehr vorhanden.
    Ok, von Intelligenten Zeigern hab ich glaub noch nie was gehört

Seite 4 von 148 ErsteErste 123456781454104 ... LetzteLetzte

Berechtigungen

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