Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

CruSh89

Frischling

  • »CruSh89« ist der Autor dieses Themas

Beiträge: 4

Wohnort: Delmenhorst(bei Bremen)

Beruf: Schüler

  • Private Nachricht senden

1

30.03.2008, 18:51

Heap Corruption detected in MergeSort ?

Hallo zusammen,
ich soll für die Schule MergeSort schreiben. Hier erstmal der Source(teilweise ausem inet übernommen):

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <iostream>


void merge (int a[], int links, int mitte, int rechts)
{   
    int laenge=rechts;              
    int *b = new int[laenge];       
    for(int z=0;z<laenge;z++)
        b[z]=0;

    int i=links;    //laufindex für linke Hälfte

    int j=mitte+1;  //laufindex für rechte Hälfte

    int n=links;    //Index für b


    //sortiern und in a einfuegen

    while(i<=mitte && j<=rechts)
    {
        if(a[i]<a[j])
        {
            b[n]=a[i];
            i++;
        }
        else
        {
            b[n]=a[j];
             j++;
         }
        n++;           
    }
    
    if (i>mitte)
    {
        for(int z=j; z<=rechts;z++) 
            b[n+z-j]=a[z];      
    }
    else
    {       
        for(int z=i; z<=mitte;z++)  
               b[n+z-i]=a[z];            
    }

    for(int z=links;z<=rechts;z++)  
            a[z]=b[z];      

    delete[] b;
}

void mergesort(int a[], int links, int rechts)
{       
    if(rechts>links)
    {
        int mitte=(links+rechts)/2;     
        mergesort(a,links,mitte);   
        mergesort(a,mitte+1,rechts); 
        merge(a,links,mitte,rechts);        
    }
}


int main()
{
    
    int  a[]={1, 12, 23, 34, 2, 3, 2, 5, 7, 8, 4, 3, 9,16, 85};
         
    mergesort(&a[0], 1, sizeof(a)/sizeof(a[0]));   

    for(int i = 0; i < sizeof(a)/sizeof(a[0]); i++)
        std::cout << a[i] << " ";

    std::cout << " " << std::endl;
        
    system("pause");    
    return 0;
}


Dabei tritt dann dieser fehler auf:

(Link)


Allerdings versteh ich nicht warum :?: Ich hoffe hier kann mir jemand helfen. Schon mal danke im voraus.
Achja mein Lehrer meint, dass man MergeSort auch nicht rekursiv implementieren kann, allerdings hab ich dazu nichts gefunden, weiß da jemand vllt was?

Beiträge: 774

Beruf: Student

  • Private Nachricht senden

2

30.03.2008, 19:22

Habs jetzt nur mal überflogen ... du musst der Funktion auf jedenfall "a" übergeben. So wie du es machst übergibst du ja nur das erste Element des Arrays und nicht das Array selbst ;)
Also so ungefähr

C-/C++-Quelltext

1
mergesort(a, 1, sizeof(a)/sizeof(a[0]));


Wenn du das Programm im Debugger laufen lässt und dann auf ignorierne klickst solltest du schonmal sehn wo die Heap Corruption auftritt.

CruSh89

Frischling

  • »CruSh89« ist der Autor dieses Themas

Beiträge: 4

Wohnort: Delmenhorst(bei Bremen)

Beruf: Schüler

  • Private Nachricht senden

3

30.03.2008, 20:47

Ich hab das mit der Übergabe jetzt geändert, hab mal irgendwo gelesen, dass "&a[0]" das gleiche ist, wie, wenn man a übergibt. Allerdings hat das nichts verändert. Wenn ich auf Ignorieren klicke, dann erhöht sich nur die Nummer hinter NormalBlock. Die Speicheradresse bleibt aber gleich.
Wenn ich auf Wiederholen klicke wird automatisch ein Haltepukt bei delete[] b ausgelöst. Allerdings weiß ich nicht, was mir das sagen soll, denn mit new reservierten Speicher muss man doch mit delete wieder freigeben?!
Ich bin echt ratlos :(

DasBlub

Alter Hase

Beiträge: 802

Wohnort: Schweiz

Beruf: Programmierer

  • Private Nachricht senden

4

30.03.2008, 22:46

kann es sein dass du anstelle von

C-/C++-Quelltext

1
delete[] b
nur

C-/C++-Quelltext

1
delete b
verwenden solltest??

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

5

30.03.2008, 23:12

Zitat von »"TheWinner"«

kann es sein dass du anstelle von

C-/C++-Quelltext

1
delete[] b
nur

C-/C++-Quelltext

1
delete b
verwenden solltest??


Nee.

Zitat

C-/C++-Quelltext

1
int *b = new int[laenge];     

6

30.03.2008, 23:29

Ich hab jetzt nicht so gnaz versucht deinen Algo zu verstehen aber für mich sieht das eher nach Quicksort aus was du da machst.

Mergesort benutzt neben den Quelldaten 2 temporäre Felder/Dateien wo die Teilstücke reingeschrieben werden.
Das finde ich bei dir nicht.

Wenn deine Aufgabe der Quicksort ist, hat sich dieser Post erledigt, wenn du wirklich einen Algo für Mergesort schreiben sollst, rate ich dir den Algo nochmal nachzulesen.

Chase

Alter Hase

Beiträge: 753

Wohnort: Nagaoka / Darmstadt / Düsseldorf

Beruf: fauler Studi

  • Private Nachricht senden

7

30.03.2008, 23:37

fuer mehr als ueberfliegen hat ich jetzt auch nich den nerv, sry

C-/C++-Quelltext

1
mergesort(a, 1, sizeof(a)/sizeof(a[0]));

stimmt das so? Nicht

C-/C++-Quelltext

1
mergesort(a, 0, sizeof(a)/sizeof(a[0]) - 1);
?
"Have you tried turning it off and on again?"

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

8

31.03.2008, 10:26

jo das könnte in der tat der grund sein. die heap corruption deutet jedenfalls darauf hin, dass du irgendwo über die grenze eines dynamisch allokierten speicherbereiches (eines von deinen arrays) hinausschreibst.
der debugger merkt sowas spätestens beim delete[] des entsprechenden blocks...

und btw: ja, &a[0] is in dem fall das gleiche wie a. der name eines arrays kann auch als zeiger auf das erste element vewendet werden.

Zitat

Achja mein Lehrer meint, dass man MergeSort auch nicht rekursiv implementieren kann, allerdings hab ich dazu nichts gefunden, weiß da jemand vllt was?


du kannst jeden rekursiven algorithmus auch iterativ implementieren (eine CPU arbeitet rein iterativ...) du brauchst im prinzip nur selber einen stack machen wo du dir deine links/rechts dinger merkst...

David Scherfgen

Administrator

Beiträge: 10 382

Wohnort: Hildesheim

Beruf: Wissenschaftlicher Mitarbeiter

  • Private Nachricht senden

9

31.03.2008, 13:03

Wie Chase schon angemerkt hat:
Es sieht so aus, als ob du denkst, dass Array[1] der erste Array-Eintrag ist. Das ist aber nicht richtig, denn ein Array beginnt bei 0.

CruSh89

Frischling

  • »CruSh89« ist der Autor dieses Themas

Beiträge: 4

Wohnort: Delmenhorst(bei Bremen)

Beruf: Schüler

  • Private Nachricht senden

10

31.03.2008, 16:24

Danke erstmal für die Antworten.
Das ein Array bei 0 beginnt ist mir klar, war wohl aus Gewohnheit, das ich bei 1 angefangen habe, da wir in der Schule sonst nur Delphi benutzten.

Habe es also in

C-/C++-Quelltext

1
mergesort(a, 0, sizeof(a)/sizeof(a[0]) - 1); 

geändert. Aber in VC kommt der gleiche Fehler. Wenn ich es aber mit Dev kompiliere entsteht kein Fehler und es läuft auch auf einem anderen PC ohne Absturz. Ich frag mich nur wieso?

So weit ich MergeSort verstanden habe, funktioniert der doch so, dass er die Liste in zwei Teile teilt und zwar immer wieder bis ein Teil immer nur noch aus einem Eintrag besteht und dann merged der die wieder zusammen, wobei die Liste halt sortiert wird. So steht es auch bei Wiki und bei anderen Quellen im Inet.

Werbeanzeige