2d dynamisches array für qsort



  • Wie der titel schon sagt, möchte ich ein Programm schreiben
    welches ein 2dimensionales dynamisches array allociert und dieses dann zeilen weise sortiert.

    Bsp:

    char text={"hans","maria","onkel tom"};
     qsort(text,3,sizeof(char)*9,cmp);
    

    So würde das ganze mit einem statischen array aussehen.

    Könnt ihr mir sagen wie ich es dynamisch schaffe?
    hab schon einige sachen ausprobiert, jedoch funktioniert bei mir der qsort mit dem dynamischen array nicht, sondern nur wenn ich das array statisch mache.

    Mein derzeitiger Code (welcher nicht funktioniert)

    allokieren das speichers:

    text=malloc(sizeof(char*) * numRows);
    
    	for(i=0;i<numRows;i++)
    	{
    		text[i]= malloc(sizeof(char)*numCols);
    
    	}
    

    qsort:

    qsort(text,lines,numCols*sizeof(char),cmpstring_up);
    

    könnt ihr mir sagen wo hier der denkfehler liegt?
    mfg


  • Mod

    Irgendwie sehe ich bei beiden Beispielen keinerlei Zusammenhang zwischen den Angaben für die Anzahl und die Größe und dem was tatsächlich in dem Array ist.



  • beda89 schrieb:

    char text={"hans","maria","onkel tom"};
     qsort(text,3,sizeof(char)*9,cmp);
    

    Schrott. Du initialisierst einen char mit einem Stringarray. Nochmal explizit:

    char != char*[]
    
    text=malloc(sizeof(char*) * numRows);
    
    	for(i=0;i<numRows;i++)
    	{
    		text[i]= malloc(sizeof(char)*numCols);
    	}
    qsort:
    	qsort(text,lines,numCols*sizeof(char),cmpstring_up);
    

    Wo kommt lines denn plötzlich her?
    Und mind. deine Vergleichsfunktion müsstest du schon anbieten, damit überhaupt noch was zu retten ist.



  • ok, war vielleicht ein bisschen viel code geschnipsel

    noch mal

    int numCols=1023;
    	int numRows=20;
    	int i;
    	int lines=0;
    
    	char** text;
    
    	text=malloc(sizeof(char*) * numRows);
    
    	for(i=0;i<numRows;i++)
    	{
    		text[i]= malloc(sizeof(char)*numCols);
    	}
    
    	(void)fprintf(stdout,"(Eingabe beenden mit Leerzeile und Enter)\n");
    
    	while(*fgets(text[lines],1023,stdin)!='\n')
    	{
    		/*delete the new line character(\n) of the string */
    		length=strlen(text[lines]);
    		text[lines][length-1]='\0';
    		lines++;
    	}
    
    	if(lines==0)
    	{
    		(void)fprintf(stderr,"%s Keine Eingabe!\n",szCommand);
    		exit(1);
    	}
    
    	qsort(text,lines,1023*sizeof(char),cmpstring_up);
    

    hier noch die compare funktion:

    static int cmpstring_up(const void *p1,const void *p2)
    {
        return strcmp((char*)p1,(char*)p2);
    }
    

    und ja mir ist klar ,dass ich noch nichts gegen speicherverletzungen gemacht habe falls die eingabe größer als mein reservierter bereich ist.


  • Mod

    Das ist ja grauenhaft.

    Aber konkret zu deinem Problem: Das was du da mit qsort sortierst sind char*, du tust aber so als wären es char[1023].



  • danke für den tipp

    wie kann ich den den speicher so allokieren das die funktion qsort möglich ist?



  • text ist in erster Linie erstmal nur eine Liste von Zeigern. Nur das ist für qsort interessant. Dass jeder dieser Zeiger auf einen String zeigt, ist widerum nur für cmp interessant.

    qsort(beginn der liste,anzahl der elemente in der liste die sortiert werden sollen,Größe in Bytes jedes Elements,Vergleichsfunktion);
    Das ist doch gar nicht so schwer:

    qsort(text,lines,sizeof*text,cmpstring_up);
    

    Den klassischen Fehler bei der qsort-cmp Funktion von Stringarrays hast du auch gemacht, sollte aber wohl 100fach im Netz korrekt stehen:

    static int cmpstring_up(const void *p1,const void *p2)
    {
        return strcmp(*(char**)p1,*(char**)p2);
    }
    

Anmelden zum Antworten