Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 03:59

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



[C] Quicksort Zeitmessung -> Dumping stack trace

Discussion on [C] Quicksort Zeitmessung -> Dumping stack trace within the C/C++ forum part of the Coders Den category.

Reply
 
Old   #1
 
Belur's Avatar
 
elite*gold: 0
Join Date: Jul 2009
Posts: 3,441
Received Thanks: 1,473
[C] Quicksort Zeitmessung -> Dumping stack trace

Hey,

hatte die Aufgabe verschiedene Arrays zu erzeugen. Mit den Größen
10
100
1000
10000
100000
1000000

Dazu sollte ich prüfen wie lange jeweils der Quicksort braucht um die Arrays zu sortieren.
Habe mir das also folgendermaßen vorgestellt:

PHP Code:
void zeit(){

    
long int i;
    
printf("\t Quicksort\n");
    for(
i=10i<=1000000i*=10){
    
xl=i;
    
generieren();
    
time_t vorher=time(NULL);
    
quick_sort(daten);
    
time_t nachher=time(NULL);
    
printf("%d \t %d \n"i, (int)(nachher-vorher));


        }


Wie man die Zeit angeblich misst, wurde uns vom Professor in einem Bsp. gezeigt.

xl ist die Länge des Arrays.

Hab erst gedacht es liegt daran, das der Datentyp int zu klein ist, da die Zahlen ja bis 1Million gehen.
Also alle relevanten Ints mal auf long int geändert.
Aber folgender Fehler bleibt nach wie vor:

Code:
0 [main] Praktikum4 4564 open_stackdumpfile: Dumping stack trace to Praktikum4.exe.stackdump
Vllt kann mir da jmd helfen.

Grüße
Belur is offline  
Old 12/10/2013, 12:22   #2
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
zeig mal kompletten src und was fürn compiler du benutzt.

außerdem ist time nicht für solche zeitmessungen geeignet, da sie nur im sekundenbereich arbeitet, selbst mit 1mio elementen wird quicksort vermutlich unter 1 sekunde bleiben.

Code:
    for(i=10; i<=1000000; i*=10){
    xl=i;
was soll die schleife überhaupt?
Dr. Coxxy is offline  
Old 12/10/2013, 15:54   #3
 
elite*gold: 0
Join Date: Mar 2010
Posts: 68
Received Thanks: 21
Wozu long int? int auf x86 architekturen hat 32bit. 2^32 = 4294967296 abs values (unsigned). signed entsprechend ~ hälfe (positiv), was locker ausreicht.

Fehler ist ein Stack Overflow, sprich du initialisierst wahrscheinlich ein Array mit size i auf dem Stack. Der Stack ist begrenzt. Sowas macht man auf dem Heap:

int *iArray = new int[1000000];

PS.: An welcher Wald und Wiesen Hochschule.... Mathematische Komplexität? Argh.
ilovenoodles is offline  
Old 12/10/2013, 17:52   #4
 
Belur's Avatar
 
elite*gold: 0
Join Date: Jul 2009
Posts: 3,441
Received Thanks: 1,473
Mit dem long int war ich mir nicht sicher
Hatte es erst auch als normales int und bin dann hierauf gestoßen.


Deswegen hab ich das zur Vorsicht mal geändert weil ich dachte das wäre evtl zu klein.

Problem ist allerdings, dass wir keine Heaps hatten :<
Warscheinlich weil ich grad im ersten Semester bin...




Und zum 1. Beitrag.

Das Array sollte ja immer um den Faktor 10 vergrößert werden und dann sortiert werden.
Und generieren() generiert das Array mit der Größe xl.

Vllt ist noch wichtig zu erwähnen, dass es sich um ein 2d Array handelt also:

PHP Code:
long int daten[][yl]; 
Wobei in unserem Fall yl erstmal fest auf 2 begrenzt ist.

Grüße
Belur is offline  
Old 12/10/2013, 18:26   #5
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
wie gesagt, zeig mal den kompletten source, wir haben leider keine glaskugel mit der wir deine fehler aufspüren können.

EDIT:
hier schenk ich dir:
Code:
#define DATEN_SIZE 10000000

int daten[DATEN_SIZE];

void Fill()
{
	for (int i = 0; i < DATEN_SIZE; i++)
	{
		daten[i] = rand() | (rand() << 15);
	}
}

void Print()
{
	for (int i = 0; i < DATEN_SIZE; i++)
	{
		printf("%d:\t%d\n", i, daten[i]);
	}
}

int __cdecl cmp(const void* a, const void* b)
{
	return (*(int*) a) - (*(int*) b);
}

void Sort()
{
	qsort(daten, DATEN_SIZE, sizeof(int), cmp);
}

// main
	srand((unsigned int)time(NULL));

	Fill();
	//Print();
	getc(stdin);
	DWORD Begin = GetTickCount();
	Sort();
	printf("\nGebrauchte Zeit: %d ms\n\n", GetTickCount()-Begin);
	getc(stdin);
	//Print();
GetTickCount ist allerdings windows spezifisch, müsstest du dann gucken.
Dr. Coxxy is offline  
Old 12/10/2013, 18:44   #6
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by ilovenoodles View Post
blabla
bin mir zu 99% sicher, dass das nicht sein problem ist, da er in der funktion anscheinend auf das array als globale zugreift und man ein array nicht dynamisch in einer funktion auf dem stack allokieren kann (zmdst mit C sprachmitteln), deswegen wie ich jetzt zum 3. mal schreibe soll er mal den gesamten source rausrücken und sagen welchen compiler/ide/os er benutzt.
Dr. Coxxy is offline  
Old 12/10/2013, 18:55   #7
 
elite*gold: 0
Join Date: Mar 2010
Posts: 68
Received Thanks: 21
Und wie ich recht habe:

Ist global...
ilovenoodles is offline  
Old 12/10/2013, 19:00   #8


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Quote:
Originally Posted by ilovenoodles View Post
Und wie ich recht habe:

Ist global...
Und damit nicht auf dem Stack, sondern im Data-Segment.
Ein Array muss eine Compile-Zeit-Konstante als Größe haben, ergo kann er i ohnehin in keinem Fall nutzen, um das Array zu erzeugen.
Das ginge, wie du schon erkannt hast,nur auf dem Heap.
Und btw. ist new kein C.
Quote:
Originally Posted by ilovenoodles View Post
@Dr. Coxxy: Das wird so nicht laufen. Legst auch 10^7 integer aufn Stack...
Nein. Klugscheißen will gelernt sein.

Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
MrSm!th is offline  
Old 12/10/2013, 19:35   #9
 
elite*gold: 0
Join Date: Mar 2010
Posts: 68
Received Thanks: 21
Hab nie behauptet das new zu C gehört. Und Compile-Zeit-Konstante hasse resch, würde nur mit nem define laufen.



Quote:
Originally Posted by MrSm!th View Post
Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
Blödsinn. Fragt sich wer hier Klugscheißt
ilovenoodles is offline  
Old 12/10/2013, 19:36   #10
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by ilovenoodles View Post
Hab nie behauptet das new zu C gehört. Und Compile-Zeit-Konstante hasse resch, würde nur mit nem define laufen.





Blödsinn. Fragt sich wer hier Klugscheißt
was hältst du davon deine klappe zu halten und mal weniger blödsinn von dir abzusondern?
Dr. Coxxy is offline  
Thanks
4 Users
Old 12/10/2013, 20:24   #11
 
Belur's Avatar
 
elite*gold: 0
Join Date: Jul 2009
Posts: 3,441
Received Thanks: 1,473
Bevor das hier noch weiter ausartet poste ich mal meinen Quellcode, der allerdings ziemlich unübrsichtlich ist.
Erstsemester und so

Geschrieben unter Eclipse mit Cygwin auf Windows.



PHP Code:

#include <math.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <time.h>


#define yl 2

long int daten[][yl];
long int xl=20;



void qs(int daten[][yl], int linksint rechts) {
  
int i,j;
  
int x,y,z;

  
i=linksj=rechts;
  
daten[(links+rechts)/2][1]; // mittleres Element

  
do {
    while (
daten[i][1]<&& i<rechtsi++; // such Element für "große Klasse"
    
while (x<daten[j][1] && j>linksj--;     // such Element für "kleine Klasse"

    
if (i<=j) {                                     // vertausche Elemente
      
daten[i][1]; //zahl zwischenspeichern
      
daten[i][0]; //index zwischenspeichern
      
daten[i][1] = daten[j][1];
      
daten[i][0] = daten[j][0];
      
daten[j][1] = y;
      
daten[j][0] = z;
      
i++; j--;
    }
  } while (
i<=j);

  if (
links<jqs(datenlinks,j);                   // Aufruf für "kleine Klasse"
  
if (i<rechtsqs(datenirechts);          // Aufruf für "große Klasse"


}

/**
 * Diese Funktion bereitet den Aufruf der Rekursiven "qs"
 * Funktion vor.
 *
 * Der Parameter "daten" enthält die Daten, die sortiert
 * werden sollen.
 */
void quick_sort(int daten[][yl]) { // Quicksort vorbereiten
  
int zaehler;

  
zaehler xl;
  
qs(daten0zaehler-1);
}

void ausgabe(){


    
int i;
    
int j;

    
printf("Index \t Zufallszahl \n");
        for(
i=0i<xli++){

            for(
j=1j<ylj++){
                
printf("%d \t %d \n"daten[i][0]+1daten[i][j]);
            }

        }
        
printf("\n");

}

void generieren(){


    
int i;
    
int j;
    for(
i=0i<xli++){

        
daten[i][0]=i;
        for(
j=1j<ylj++){

            
daten[i][j]=random()%500;
        }


    }


}

void zeit(){

    
long int i;
    
printf("\t Quicksort\n");
    for(
i=10i<=1000000i*=10){
    
xl=i;
    
generieren();
    
time_t vorher=time(NULL);
    
quick_sort(daten);
    
time_t nachher=time(NULL);
    
printf("%d \t %d \n"i, (int)(nachher-vorher));


        }

}


int main(int argcchar **argv) {

    
zeit();


      return 
0;


Belur is offline  
Old 12/10/2013, 20:44   #12
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Um nochmal bisschen weiter zu klugscheißen: Die Wörter Heap und Stack sind nicht passend. Der Standard gibt nicht vor, wo die Variablen und Objekte letzendlich landen, sondern nur wie diese sich zu verhalten haben bezüglich ihrer Gültigkeit.
Schlüsselbein is offline  
Old 12/10/2013, 20:54   #13
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by MrSm!th View Post
Ein Array muss eine Compile-Zeit-Konstante als Größe haben, ergo kann er i ohnehin in keinem Fall nutzen, um das Array zu erzeugen.
Das ginge, wie du schon erkannt hast,nur auf dem Heap.
Ich dachte, in C gäbe es VLAs?

Quote:
Originally Posted by MrSm!th View Post
Übrigens ist es nicht korrekt, dass int notwendigerweise 32bit hat, da liegt der TE schon richtig.
Wenn er Werte bis zu 4 mrd speichern will, braucht er plattformunabhängig mindestens einen long. Int wird es auf den meisten Plattformen allerdings auch tun.
Vorzeichen beachten. Oder einfach stdint.h einbinden und uint_least32_t oder uint_fast32_t verwenden.

Quote:
Originally Posted by Schlüsselbein View Post
Um nochmal bisschen weiter zu klugscheißen: Die Wörter Heap und Stack sind nicht passend. Der Standard gibt nicht vor, wo die Variablen und Objekte letzendlich landen, sondern nur wie diese sich zu verhalten haben bezüglich ihrer Gültigkeit.
Und laut Standard heißen sie:
Quote:
Originally Posted by §6.2.4
There are four storage durations: static, thread, automatic, and allocated.
Tasiro is offline  
Old 12/10/2013, 21:11   #14
 
Dr. Coxxy's Avatar
 
elite*gold: 0
Join Date: Feb 2011
Posts: 1,206
Received Thanks: 736
Quote:
Originally Posted by Tasiro View Post
Ich dachte, in C gäbe es VLAs?
erst mit C99.
Dr. Coxxy is offline  
Old 12/10/2013, 21:32   #15
 
elite*gold: 0
Join Date: Aug 2012
Posts: 236
Received Thanks: 94
Quote:
Originally Posted by Dr. Coxxy View Post
erst mit C99.
Wurde das mit C11 nicht wieder optional?
Tasiro is offline  
Reply


Similar Threads Similar Threads
[C] Quicksort mit Int funktioniert nicht bei großen Zahlen
12/07/2013 - C/C++ - 3 Replies
Hey, ich musste ein bestimmtes Array erzeugen, dieses mit Quicksort sortieren, und dann sortiert ausgeben. Wir hatten einen vorgebenen Quicksort für Chars. Den sollten wir nur eben für int anpassen. Habe also die paar "char" durch "int" ersetzt. Habe mir dann erst ein Testarray erstellt mit kleinen Zahlen: Bsp: int daten={5,4,3,2,1}; Ausgabe:
[Selling] Zkey stack 11 eur/ Ecto stack 10eur
07/18/2013 - Guild Wars Trading - 1 Replies
closed
Koopa's Discount-Offer:Ectos 13,99€/stack! Lpicks 3,99/stack!
04/04/2012 - Guild Wars Trading - 0 Replies
Hey ;) My special offer until monday or sold-out. Enjoy :) Ectos in stock: 10 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png 8 stacks sold 1 Stack = 13,99€
Koopas Special -> Ektos für 15/€ Stack -- Dietriche 4,99€/Stack
04/03/2012 - Guild Wars Trading - 1 Replies
Servus ;) Ich biete euch hier die einmalige Gelegenheit, Ektos und Dietriche zu einem sehr günstigen Preis zu kaufen. Ektos auf Lager: 15 Stacks http://gwah.onlinewelten.com/images/Ektoplasmakuge l.png 1 Stack = 15,00€
[REQUEST!!!] Any program for tracing people, and i dont mean trace trace like ingame.
09/20/2010 - SRO Private Server - 0 Replies
i am searching for a program to trace people. Like to fill in a name, and that the program than says where he is. Can anyone post/make this? Thanks!!!



All times are GMT +1. The time now is 03:59.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.