Array mit unbestimmter Größe erstellen



  • 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 😉



  • TactX schrieb:

    ten schrieb:

    // alles ok, dann hinten das '\n' löschen
       p[strlen(p)] = 0;
    

    Best NOP ever 😉

    hab's ausgebessert...
    🙂



  • @ ten
    hey das du so eine Geduld mit mir mitbringst ..respekt!

    Desweiteren habe ich mir mal so Gedanken gemacht über die ganze Aufgabe. eigentlich kommt nur in einer Textpassage vor das die "unabhängige Länge des Strings" gefordert wird. Dieses jedoch im späterem Programmablauf. Anbei dazu mal die Textpassage.

    http://img124.imageshack.us/img124/6336/stringwl8.th.jpg

    Versteh ich das jetzt richtig, das mein Eingabestring nicht unendlich sein muss, sondern nur diese geforderte Prüfziffer muss unendlich viele Strings verarbeiten könne? Denn das wäre ja schon erledigt. 🙂 Obwohl es dann irgendwie kein Sinn macht sowas zu fordern. (Ja ich weiß, ich will es mir jetzt einfach machen :), weil ich den unendlichen String einfach nicht in den Griff bekomme.)
    In der Aufgabe davor wird einfach nur ein eingabe-String verlangt und diesen soll man dann analysieren und dann etnscheiden ob er der richtige oder falsche ist. Und dann halt diese Prüfziffergeschichte drüberlaufen lassen. Und eben auch aus diesem Grund habe ich gedacht das der Eingabestring auch unendlich sein muss.

    Denn sonst würde ich das jetzt einfach so lösen

    char Anzahl[100];
          printf("Anzahl eingeben: ");
          scanf("%s", anzahl);
    

    Gruß
    Apley



  • Apley schrieb:

    Desweiteren habe ich mir mal so Gedanken gemacht über die ganze Aufgabe.

    An Deiner Stelle würde ich damit nicht zu schnell wieder aufhören...



  • @Würd_gern_C_können
    Also so schnell gib ich generel nicht auf, jedoch läuft mir die Zeit davon. Muss die Aufgabe schon am Montag abgeben. Also du siehst bei mir ist es kurz vor 12 🙂 Jaja, ich weiß etwas spät angefangen 🙂
    Danke für dein Beispiel, jedoch soll alles in Strings eingelesen werden, und daran bin ich verzweifelt. Int wären ja noch relativ einfach, aber strings 😡 😡 Desweiteren ist die Aufgabe sehr unklar gestellt.
    Als Bsp. wird da eine Prüfzifferberechnung gefordert wenn der Funktion einen gültigen Zeigerwert (!=0) übergeben wird. 😮 😕 Zeigerwert wovon? Also das kann verstehen wer will, ich habs inzwischen aufgegeben.

    Ich hab jetzt meine Aufgabe fast fertig gelöst. Hab es mir teilweise auch etwas leichter gemacht.
    Es gibt insgesamt 3 Dateien. Eine header mit angehörigem cpp und meine main.cpp. Bevor jemand meckert 🙂 es wird alles in cpp verlangt.

    Leider funktioniert jetzt ein Funktionsaufruf nicht.

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    #include "123456.h"
    
    void Pruefzifferberechnung(void);		
    void richtigezahl(void);			
    float 123456(char);         //Prototyp
    
    int main(void) 
    
          printf("Bitte geben Sie die Ziffern ein: \n ");
    
          char pointer[100]; 	
    	for(int i = 0; i < numbers; i++)			
          scanf("%s", &pointer[i]);  
    
    	if(497628(pointer) == 0.0)  // <<< Hier meldet er mir einen Fehler
    	      richtigezahl();
    	else if (497628(pointer) == 1.0)
    		Pruefzifferberechnung ();
    	else if (123456(pointer) == 2.0)
    		void abort(void);
    
    //------------------------ 
    float z497628 (const char Martikelnr[])
    
    //....hier sollten dann die eingehenden Strings bearbeitet werden und am Ende 
    // per Return als Float zurückgegeben werden Bsp: return = 2;
    

    Naja, wie gesagt so war mein Plan, aber leider meldet er folgenden Fehler 3 x;

    cannot convert parameter 1 from 'char [100]' to 'char'
    

    bei if(123456(pointer) == 0.0))

    Ich hoffe ihr könnt mir helfen. Oder hat jemand lust sich das ganze mal anzusehen? Das würde mir sehr viel helfen. Posten kann ich es nicht, höchstens am Sonntag abend oder montag früh, dann bräuchte ich aber eine ganz schnelle hilfe 😉 😃

    So, gute Nacht
    Apley


Anmelden zum Antworten