*Array



  • #include <stdio.h>
    
    int main(int argc, char **argv)
    {
    	int sizeOfArray 		= 0;
    	int i			      = 0;
    	char *simulatedArray	= "HalloDiesIstEinEinfacherTest";
    
    	sizeOfArray = sizeof(simulatedArray);
    	printf("%d", sizeof(simulatedArray));
    
    	for(i = 0; i <= sizeOfArray; i++)
    	{
    		printf("%c\n", simulatedArray[i]);
    	}
    
    	return 0;
    }
    

    Das das so nicht tut is mir klar. Er gibt mir hier nur die größe eines chars auf meinem System aus. Aber wie stell ich es an, dass er mit die länge des Strings, also die größe des "arrays" anzeigt, damit ich in der for schleife den ganzen String wiederbekomme?

    Vielen Dank schon mal!
    Gruß Plock



  • mit strlen() oder mit sizeof("Dein Text hier ...")
    BTW gibt er dir die Größe eines char* aus, nicht die eines char (es sei denn du besitzt eines dieser seltenen Geräte, auf denen sizeof(char*) == 1 gilt)



  • da strlen auch nichts anderes macht als einaml den string bis zum ende nach einem nullbyte zu durchsuchen und man den string ja eh einmal komplett durchgehen will.ist es nicht sonderlich performant einen string in ner schleife zu checken dessen länge man vorher auch durch einmaliges durchlaufen bestimmt hat

    die ganz schlechte variante

    char buffer[1024]; //wenns mit malloc allokierter buffer ist hat sizeof sowieso nicht den gewünschten effekt
    //irgendwie was in buffer reinschreiben
    
    for(int i=0;i<strlen(buffer);++i) 
        buffer[i]=... //oder was auch immer man mit dem zeichen gerade anstellen will
    

    die bessere variante

    int length=strlen(buffer);
    for(int i=0;i<length;++i) 
        buffer[i]=...
    

    noch besser ist einen pointer durchlaufen zu lassen
    die schleife wird so lange durchlaufen bis der pointer aufs nullbyte zeigt

    for(char *p=buffer;*p;++p)
    *p=...
    


  • Hm.... Ja schon klar, aber das sollte ja nur n bsp sein. Das Problem is eigentlich ganz anders, und zwar hab ich ne einfach verkettete List, und will die sortieren, und das is n ziemlicher Aufwand, und deshalb wollt ich mir n Array anlegen indem ich die Zieger auf die einzelnen Elemente speicher, und das Array dann mit quicksort sortieren lassen und danach mir wieder ne neue List zusammenbaue.

    Ok ich geb zu das bsp war n bisschen ungünstig gewählt sorry.
    Gruß Plock



  • Du hast also eine verkettete Liste und willst daraus ein Array machen. Gut, dann bekommst du beim Erstellen des Arrays eh schon die Anzahl der Elemente heraus. Die Anzahl kannst du dann beim Rückumwandeln auch wieder hernehmen. Wo liegt das Problem?



  • Ne ich wollte das irgendwie dynamisch machen, da die länge (die Anzahl der Elemente) ja variabel ist. Weil n quick sort auf ne einfach verkettete List is net Lustig, und dachte so könnte ich das irgendwie umgehen.



  • Ähhmm ja davon hab ich eigentlich gesprochen. 😕

    Brauchst du vielleicht ein Beispiel?



  • @AJ:
    Oh, sorry. Wenn du das gemeint hast dann hab ich dich nicht ganz verstanden.
    Ja könntest du mir dazu ein bsp machen, wär super.



  • Ok, ich versuch es mal.

    //Structur für verkettete Liste
    struct st_verkliste
    {
       int zahl;
       struct st_verkliste * naechster;
    };
    typedef struct st_verkliste verkliste;
    
    ...
    
    //Verkettete Liste
    verkliste * liste;
    
    ...
    
    {
       //Array zum Sortieren
       verkliste ** arr_liste;
       int anz_liste = 0;
       //Zeiger auf Listenelement
       verkliste * element;
    
       //Speicher reservieren
       arr_liste = malloc(1 * sizeof(verkliste *));
       //Elemente der verketteten Liste in Array speichern
       element = liste;
       while(element)
       {
          //reservierten Speicher erhöhen
          arr_liste = realloc(arr_liste, (anz_liste + 1) * sizeof(verkliste *));
    
          //Element in Array speichern
          arr_liste[anz_liste] = element;
    
          //nächstes Element und Anzahl erhöhen
          element = element->naechster;
          ++anz_liste;
       }
    
       //Liste sortieren
       ...
    
       //verkettete Liste neu organisieren
       for(int i = 1, liste = element = arr_liste[0]; i < anz_liste; ++i)
       {
          //nächstes Element der verketteten Liste setzen
          element->naechster = arr_liste[i];
          //zum nächsten Element gehen
          element = element->naechster;
       }
    
       //reservierten Speicher wieder freigeben
       free(arr_liste);
    }
    
    ...
    

    So sollte es eigentlich funktionieren. Wenn Fehler drin sind, bitte korrigieren!



  • hm.......
    sieht interresant aus, ich dank dir schon mal recht herzlich, ich glaub das is sowas wie ich wollte.

    Also dankeschön nochmals für die mühe.


Anmelden zum Antworten