malloc/strings für doofe...
-
Hallo...
Ich habe folgendes Problem:
Ich will/soll/werde/muss ein C programm erstellen welches im wesentlichen eigentlich nur bubblesort bewerkstelligen soll...
Allerdings gibts da ein paar Dinge mit denen ich mich sehr schwer tue...
Das Programm muss mit verschiedenen Dateitypen (int,double etc.) arbeiten können...allerdings soll der ent. Speicher für die zu sortierende Liste per malloc beschafft werden...
Genau hier will es nicht klappen :(...entweder hasst mich malloc,mein compler,ANSI C oder ich steh wirklich boese aufm schlauch...
Vielleicht wäre jmd so nett mir ein Beispiel zu posten,wie ich bei einem string per malloc speicher fuer ent. Dateitypen allokiere...
Ich hab auch im OpenBook nachgsehen und K+R gewaelzt...aber irgendwie hat mich das alles nicht weitergebracht
Ich poste mal als Anhang meinen bisherigen Code...allerdings
kann der nur als Orientierung dienen da ich den mittlerweile derart oft umgeschrieben,geloescht etc. habe, das ich ihn eh von grund auf neu schreiben muss (am schluss hab ich schon fast zufallsmaessig an malloc rumprobiert...)#include <stdlib.h> #include <stdio.h> main() { int *liste; /* Zeiger auf 1. Element im Datenvektor */ int n,l; /* Anzahl und Länge der Datenobjekte */ extern int vgl(); /* Vergleichsfunktion */ int choice; int counter; /**** Datenerfassung****/ eingabe(&liste, &n, &l,&choice); /****Sortierung****/ //if(n > 1) //qsort(liste,n,l,vgl); /****Ausgabe****/ ausgabe(liste, n,l,choice); } eingabe(int *liste,int n,int l,int choice) { choice=0; puts("Bitte einen ent. Dateityp auswaehlen\n"); puts("1 für Int,2 für double\n\n"); scanf("%d",&choice); puts("\n\n"); switch(choice) { case 1: *liste=(int *)malloc(10*sizeof(int)); liste[0]='5'; liste[1]='6'; liste[2]='7'; liste[3]='8'; liste[4]='9'; liste[5]='10'; liste[6]='1'; liste[7]='2'; liste[8]='3'; liste[9]='4'; puts("Liste wird automatisch mit 10 Int Werten gefuellt"); break; case 2: *liste=(int *)malloc(10*sizeof(double)); liste[0]='5'; liste[1]='6'; liste[2]='7'; liste[3]='8'; liste[4]='9'; liste[5]='10'; liste[6]='1'; liste[7]='2'; liste[8]='3'; liste[9]='4'; puts("Liste wird automatisch mit 10 double Werten gefuellt"); break; default: puts("Falsche Eingabe! Programm wird beendet"); // exit(); } } ausgabe(int *liste,int n,int l,int choice,int counter) { puts("Ausgabe der Liste\n\n"); switch(choice) { case 1: puts("Ausgabe der sortierten int Werte\n"); break; case 2: puts("Ausgabe der sortierten double Werte\n"); break; } counter=0; for(counter;counter<=9;counter++) { printf("%c\n",&liste[counter]); } }
Danke schonmal...
yours
ara
-
speicher für string allokieren:
char str[] = "Hallo!";
char *speicher = (char*)malloc(sizeof(char)*sizeof(str));
bzw. (da sizeof(char) == 1)
char *speicher = (char*)malloc(sizeof(str));
-
ich seh gerade, dass du ja noch mehr willst
du willst ja ein array von strings
dafür brauchst du nur obiges erweitern:
char **speicher = (char**)malloc(anzahl_zeichen_pro_string*anzahl_elemente)
z.B.:
char **speicher = (char**)malloc(10*2) strcpy(speicher[0], "Hallo"); strcpy(speicher[1], "Test");
Du darfst natürlich nicht das Limit an Zeichen pro Element überschreiten...
-
@energyzer
Irgendwie hast du das Problem, glaub ich, doch noch nicht ganz verstanden.@klaus löhring
Für liste brauchst du eigentlich nur char, da du ja immer nur ein Zeichen (also ein Byte) speicherst, aber das ist nicht der Fehler :).
Dein Problem ist, dass deine Parameter nicht stimmen:Bei der Funktion eingabe brauchst du Zeiger als Parameter, wenn die Parameter verändert werden sollen. (Bei liste brauchst du einen Zeiger auf einen Zeiger, also **)
Du hast überflüssige Parameter in deinen Funktionen. Zum einen benutzt du bestimmte Parameter (n & l) überhaupt nicht und zum anderen deklarierst du Parameter, die eigentlich lokale Variablen darstellen (counter).