Array mit unbestimmter Größe erstellen
-
ten schrieb:
onoz schrieb:
Bitte verbessern
du hast 'malloc' gecastet
Wie meinst du es?
ptr = malloc((sizeof(*ptr))*numbers);
so? Wo liegt dort der große Vorteil, im Gegensatz zum casten wie ich es gemacht habe?
"Nur"d as man den Datentyp leichter ändern kann?
-
Mein lieber scholly, mit so vielen Antworten habe ich jetzt nicht gerechnet.
Vielen Dank an alle.
Ich muss mich erst mal durch den ganzen malloc und sizeof - Befehl durcharbeiten. Bis jetzt kannte ich diese Befehle gar nicht. Bin ja schließlich noch ein kleiner Anfänger.
Soweit so gut. Muss jetzt mal sehen wie ich das weiter in meiner ganzen Aufgabe weiterverwende, denn mein Bsp. war nur ein Teil davon. Wenn gut geht dann werde hier davon berichten falls nicht dann werde ich noch weiter Fragen.
Apley
-
Apley schrieb:
Ich muss mich erst mal durch den ganzen malloc und sizeof - Befehl durcharbeiten. Bis jetzt kannte ich diese Befehle gar nicht.
sizeof ist ein Schlüsselwort
malloc eine FunktionWTF ist ein Befehl? (in C...)
greetz, Swordfish
-
onoz schrieb:
ten schrieb:
onoz schrieb:
Bitte verbessern
du hast 'malloc' gecastet
Wie meinst du es?
onoz schrieb:
ptr = *(int)**malloc((sizeof(int))*numbers);
das (fett markierte) ist überflüssig und manchmal sogar eine fehlerquelle.
Swordfish schrieb:
WTF ist ein Befehl? (in C...)
z.b. 'goto'
-
ten schrieb:
Swordfish schrieb:
WTF ist ein Befehl? (in C...)
z.b. 'goto'
Ok, 1:0 für Dich. Ich sag immer Anweisung dazu.
greetz, Swordfish
-
Hallo zusammen,
also ich hab den Code getestet und erweitert und er läuft einwandfrei.
Deweiteren habe ich aber wieder ein Problem. Ich wollte es mir am Anfang leicht machen und zuerst alles in int einlesen und dann in char umwandeln. Denn es wird eigentlich das einlesen von Strings verlangt.
Leider bekomme ich das aber nicht so richitg hin. Meine Eingabe hört hier eigenlicht gar nicht mehr auf. Weiß auch nicht so recht woran es liegt.
int *pointer; int i; char numbers; printf("Bitte geben Sie die Ziffern an: \n"); scanf("%s", &numbers); printf("Bitte geben Sie die Ziffernreihenfolge ein: \n "); pointer = (int*) malloc((sizeof(char))*numbers); ..... scanf("%d", &pointer[i]);
-
Apley schrieb:
pointer = (int)* malloc((sizeof(char))*numbers);
-
Diagnose: Beratungsresistent(tm)
greetz, Swordfish
-
char numbers; scanf("%s", &numbers);
Kann auch nix geben. Kein Speicher für nen String und man ließt Strings nicht mit & aus.
-
Beratungsresistent ist weit her geholt, eher denn Wald vor lauter Bäumen nicht sehen zu können ist was anderes.
Als ich es gemerkt hatte war es schon zu spät. Schande über mein Haupt.
Jedoch wenn ich das gecastete int weglasse, dann funktioniert die malloc funktion bei mir nicht.
Und um ehrlich zu sein, weiß ich jetzt nicht so recht wie ich da weiter vorgehen soll. Hätte mal lieber direkt mit den char eingabe anfangen sollen.
Später soll die ganze aktuelle Void-main-Funktion in in eine einfach Funktion umgewandelt werden, so das ich dann aus meinem Main programm darauf zugreifen kann bzw. Werte da übergebe und daraus eine Print-ausgabe erfolgen soll.
Es hat nicht zufällig jemand lust mal einen blick über meine ganzen Programm einen Blick zu werfen oder?
Gruß
Apley
-
Apley schrieb:
Jedoch wenn ich das gecastete int weglasse, dann funktioniert die malloc funktion bei mir nicht.
das muss gehen.
welchen compiler benutzt du?Apley schrieb:
Es hat nicht zufällig jemand lust mal einen blick über meine ganzen Programm einen Blick zu werfen oder?
poste es doch hier...
-
Als compiler benutze ich Visual C++ Express Edition 2005.
denn code würde ich ja gerne hier reinposten, aber wenn das ein anderer Mitstreiter das sieht und es kopiert dann wäre ich im Arsch gekniffen, denn es würde dann nicht mehr bewertet werden.
Apley
-
Apley schrieb:
Als compiler benutze ich Visual C++ Express Edition 2005.
achso, dann hast du die quelltextdatei bestimmt .cpp genannt?
bennen sie um in .c, dann klappts...
-
Hintergrund ist der, dass der VC++ über die Dateiendung entscheidet ob er einen C oder einen C++ Compiler verwenden soll. In C++ bräuchte man den Cast, aber in C (und nur um C geht es hier) nicht.
-
ich hab das jetzt in *.c umgeändert, aber jetzt bringt er mir über 14 Fehler raus. Es soll ja alles in ANSI C programmiert werden.
Kann man das einlesen der String mit der Funktion fgets() relisieren?
wie müsste man die malloc() Funktion ändern das die dann auch funktioniert?
Ich hab zwar ein bischen daran gebastelt aber ich bekomm das nicht hin. Kümmere mich jetzt um eine andere Baustelle im Programm.Apley
-
Apley schrieb:
Kann man das einlesen der String mit der Funktion fgets() relisieren?
so etwa:
fgets (wohin, anzahl_bytes, stdin);
wobei das 'stdin' ein vordefinierter FILE* für die eingabe ist (tastatur etc.)
aber beachte: fgets hängt noch ein '\n' hinten dran...Apley schrieb:
wie müsste man die malloc() Funktion ändern das die dann auch funktioniert?
z.b. so
int *p = malloc (anzahl * sizeof(int));
das 'sizeof(...)' braucht man aber nur, wenn die elemente grösser als 'char' sind, bei char z.b. reicht:
char *p = malloc (anzahl);
-
naja, was soll ich sagen, ich bekomm das nicht hin.
Hab jetzt alles probiert aber ich komm nicht hin.
Das was ich möchte ist das eine betimmte Anzahl von Zeichen (Strings) eingegeben werden, die länge jedoch immer unterschiedlich ist. Die malloc Funktion musste ich casten, denn sonst meldet er es mir immer als Fehler.Desweiteren habe ich dann vor das ich den String mit einem anderem String zu vergleichen. jedoch denke ich nicht das das so schwierig ist. Ich hoffe das Ihr mir da ein bischen ordnung schaffen könnt, denn ich weiß jetzt wirklich nicht weiter. Denn ohne diesen Eingabe-String kann ich mein weiteren Code nicht prüfen, da ich am Anfang String und int vermischt habe. Vielen Dank
Apley#include <stdio.h> #include <stdlib.h> int main(void){ int numbers; char pointer[100]; printf("Bitte geben Sie die Anzahl der Ziffern an: \n"); scanf("%i", &numbers); printf("Bitte geben Sie die Ziffernreihenfolge ein: \n "); for(int i = 0; i < numbers; i++) { fgets(pointer, 100, stdin); } *pointer = (char*) malloc((sizeof(int))*numbers); //*pointer = malloc (pointer); return EXIT_SUCCESS; }
-
Also ich bin auch noch Anfänger, und mit meinem jetzigen Wissensstand löse ich das Problem noch folgendermaßen: Ich übergebe die einzulesenden Werte (bei Dir Integer-Werte) gleich beim Aufruf des Programms über die Windows-Eingabeaufforderung. Damit die Hauptfunktion weiß, dass Ihr Werte übergeben werden, muss sie zum Beispiel so deklariert werden:
int main (int argc, char** argv)
Du rufst dann dein Programm über die Eingabeaufforderung zum Beispiel so auf:
C:\MyWorkspace>deinprogramm 12 4 56 45 (und viele weitere Zahlen)
Der Übergabeparameter int argc aus obigem Beispiel enthält dann die Anzahl der (vorerst) chars, die der Hauptfunktion übergeben wurden. argv enthält alle übergebenen Werte. Die kannst Du dann mit zum Beispiel
for(i=1; i<argc; i++)
in ein Int-Array einlesen (vielleicht mit atoi). Die for-Schleife geht erst bei 1 los, weil argv[0] den Namen deines Programms enthält (hier: "deinprogramm").
Mit dem Wert argc kannst Du dann auch malloc sagen, wie groß das Array werden soll.
Ich hoffe dass ich Dir helfen konnte,
Anne
Edit: Oder Du fragst einfach nach dem Programmstart, wie viel Zahlen eingegeben werden sollen (wenn das von der Aufgabenstellung her erlaubt ist). Dann
scanf("%d", anzahl); deinarray=malloc(anzahl*sizeof(int)); for(i=0;i<anzahl;i++) { // Zahl einlesen deinarray[i]= ... }
Dabei musst Du aber darauf achten, dass Du "deinarray" am Anfang richtig deklarierst!
-
oder sowas
// neuen string auf dem heap anlegen // 'max' ist die maximale länge // gibt 0 aus, wenn nichts eingegeben wurde // oder bei fehlern // der string muss nach gebrauch mit 'free' // gelöscht werden char *new_string (unsigned int max) { // speicher holen char *p = malloc(max+1); // hat nicht geklappt? dann 0 zurückgeben if (!p) return 0; // string von eingabe mach 'p' kopieren // fehler beim einlesen oder nur 'enter' gedrückt... // ... dann alles zurück if (!fgets (p, max+1, stdin) || *p == '\n') { free (p); return 0; } // alles ok, dann hinten das '\n' löschen { char *cr = strchr(p, '\n'); if (cr) *cr = 0; } // ...und den string zurückgeben return p; }
-
ten schrieb:
// alles ok, dann hinten das '\n' löschen p[strlen(p)] = 0;
Best NOP ever