Funktionsproblem



  • Huhu,
    ich schreibe ein Programm welches Zahlen erzeugt und ordnet. War soweit eigentlich auch schon fertig, bis ich erfahren habe, dass in der main datei nur funktionsaufrufe stehen dürfen.
    Jetzt habe ich folgendes Problem :
    #include "unnuetz.h"

    int erzeugen (int zahlen,int srand)
    {
    for (i=0;i<anzahl;i++)
    --{
    ----rndwert = rand();
    ----while(rndwert>=100)
    ----{
    ------rndwert = rndwert%100;
    ----}
    ----zahlen[i] = rndwert;
    --}
    }

    Der Fehler mit dem ich jetzt seit geraumer Zeit zu kämpfen habe ist:
    error C2109: Index erfordert ein Array oder einen Zeigertyp

    Unmittelbar vorher in der maindatei steht

    srand( (unsigned)time(NULL) );
    erzeugen (zahlen,srand);

    Das srand habe ich aus der Funktion rausgenommen und in die main gepackt, weil ich sonst den Fehler kriege srand sei keine Funktion.
    Kann ich das so machen ?

    Vielen dank schon mal im vorraus.


  • Mod

    dass in der main datei nur funktionsaufrufe stehen dürfen.

    Das ist Quatsch.

    Zu deinem Problem:

    #include "unnuetz.h"
    
    int erzeugen (int zahlen,int srand)
    {
     // ...
    }
    

    Prinzipiell richtig, aber ich glaube das hast du anders gemeint, denn später schreibst du:

    srand( (unsigned)time(NULL) );
    erzeugen (zahlen,srand);
    

    srand() ist in diesem Zusammenhang eine Funktion. Deine Funktion erzeugen() erwartet aber einen int und keine Funktion. Deshalb funktioniert das nicht. Du kannst auch nicht den Rückgabetyp der Funktion srand() übergeben, denn dieser wäre void. Anscheinend weißt du auch nicht, wie der Zufallsgenerator überhaupt funktioniert, da solltest du dich mal kundig machen.
    Da deine ganze Prämisse aber schon Blödsinn ist, solltest du dein Programm lieber komplett überarbeiten, als das ich dir jetzt eine Lösung gebe, die ein ziemlich merkwürdig gebautes Programm verbessere. Denn es sind noch unzählige semantische und syntaktische Fehler drin. Zum Beispiel der hier:

    zahlen[i] = rndwert;
    

    Zahlen ist in diesem Zusammenhang ein int, kein Array. Du kannst keinen int dereferenzieren. Das macht auch überhaupt keinen Sinn das zu versuchen.

    Allgemein:

    1. Benutze die Codetags (siehst du wie gut das zu lesen ist im Gegensatz zu deinem Beitrag?
    2. Gib dann auch an, wo die Fehlermeldung auftritt
    3. Dir fehlen offensichtlich noch jede Menge Grundkenntnisse. Ich könnte deine Fehler einzeln verbessern und kurz erklären (was ich auch versucht habe), aber für eine ausführliche Erklärung die dich weiterbringt musst du ein Lehrbuch bemühen. Ich kann dir nur Stichwörter geben, auf welchen Gebieten du dich für dein Programm fortbilden musst:
      - Funktionen (offensichtlich 😉 )
      - Übergabe von Werten an Funktionen und zurück
      - Variablen und Variablenfelder
      - Arbeitsweise des Zufallsgenerator, insbesondere Benutzung von srand


  • Mein Professor verlangt, dass in der Main datei nur Funktionsaufrufe stehen - war eventuell falsch formuliert ^^

    Also ich könnte den Wert der srand Funktion als blub speichern und mit erzeugen (zahlen, blub) die Zahlen generieren ?

    Das srand benutze ich deswegen, weil ich sonst immer die gleichen Zufallszahlen per rand() bekomme.

    das

    zahlen[i]
    

    ein array ist ist mir klar,
    Mein Prof meinte, aber als ich ihn nach dem Problem gefragt hab, ich müsse vor jeden Üarameter ne Definition schreiben, was es denn ist.

    Die Fehlermeldung trifft genau bei der Arrayzeile auf, wenn ich den erzeugten rndwert speichern will, aber eventuell funktioniert es ja so schon.
    Ich probiers gleich mal aus :).

    /edit

    Nein ich hänge immer noch an dem gleichen Fehler. So stand es im übrigen in der main

    srand( (unsigned)time( NULL ) );
    	for (i=0;i<anzahl;i++)
    	{
    		rndwert = rand();
    		while(rndwert>=100)
    		{ 
    			rndwert = rndwert%100;
    		}
    		zahlen[i] = rndwert;
    	}
    

  • Mod

    pillepallemachen schrieb:

    Also ich könnte den Wert der srand Funktion als blub speichern und mit erzeugen (zahlen, blub) die Zahlen generieren ?

    SeppJ schrieb:

    Du kannst auch nicht den Rückgabetyp der Funktion srand() übergeben, denn dieser wäre void. Anscheinend weißt du auch nicht, wie der Zufallsgenerator überhaupt funktioniert, da solltest du dich mal kundig machen.

    SeppJ schrieb:

    - Arbeitsweise des Zufallsgenerator, insbesondere Benutzung von srand

    __________________________________________

    pillepallemachen schrieb:

    das

    zahlen[i]
    

    ein array ist ist mir klar,

    SeppJ schrieb:

    zahlen ist in diesem Zusammenhang ein int, kein Array.

    SeppJ schrieb:

    - Variablen und Variablenfelder



  • Also das ich im Funktionskopf die Arrayklammern vergessen hab war dumm.

    main.c

    srand(time(NULL)); 
    t = rand();
    erzeugen (anzahl, zahlen,t);
    

    erzeugen.c

    #include "unnuetz.h"
    
    int erzeugen (int anzahl, int zahlen[], int t)
    {
    	for (i=0;i<anzahl;i++)
    	{
    		rndwert = rand(t);
    		while(rndwert>=100)
    		{ 
    			rndwert = rndwert%100;
    		}
    		zahlen[i] = rndwert;
    	}
    }
    

    Es läuft, aber die Zahlengeneration is irgendwie murks, also werd ich nochmal versuchen mir das srand() einzuverleiben.

    Danke für deine Geduld :).


  • Mod

    pillepallemachen schrieb:

    Es läuft, aber die Zahlengeneration is irgendwie murks

    SeppJ schrieb:

    Denn es sind noch unzählige semantische und syntaktische Fehler drin.

    Oder anders ausgedrückt: Dein Code compiliert zwar, aber ich kann mir bei vielem was du da gemacht hast beim besten Willen nicht vorstellen, dass dies auch so gemeint ist.

    Ein paar produktive Tipps:

    #include "unnuetz.h"  // Sagt ja schonmal viel ;)
    
    int erzeugen (int anzahl, int zahlen[], int t) // Was soll dieses t bewirken? Und was soll der int als Rückgabewert der Funktion? 
    {
        for (i=0;i<anzahl;i++)
        {
            rndwert = rand(t);    // Guck dir NOCHMAL an, wie der Zufallsgenerator funktioniert. rand() nimmt keine Argumente. Das t macht genau gar nichts. Was ist rndwert? Warum wird das nicht lokal definiert?
            while(rndwert>=100)   // Rechne mal mit ein paar Beispielzahlen diese Schleife durch...
            {
                rndwert = rndwert%100;  // ...dir dürfte dann etwas auffallen bezüglich des Wertebereichs einer modulo-Operation
            }
            zahlen[i] = rndwert;  // Na hoffentlich zeigt Zahlen auch wirklich auf ein Array. Bei deinem bisherigen Code ibn ich mir da nicht so sicher, aber du zeigst leider nicht die zugehörigen Codestellen.
        }
    }
    


  • Mit dem "t" hast mal wieder Recht, ich bin mehr so ein Ausprobierer und irgendwie hab ich so viel geändert, dass es halt gefunzt hat. Da habbi mir dann gedacht fein bleibt so.

    In der Schleife stand und steht jetzt wieder ein -.

    Der rndwert ist wie alles Andere in der "unnuetz.h" weil mein Prof alles ausgelagert haben will und ich rndwert auch in anderen Funktionen benutze.

    #include "unnuetz.h"
    
    int erzeugen (int anzahl, char zahlen[])
    {
    	for (i=0;i<anzahl;i++)
    	{
    		rndwert = rand();
    		while(rndwert>=100)
    		{ 
    			rndwert = rndwert-100;
    		}
    		zahlen[i] = rndwert;
    	}
    }
    

    So schauts nu aus. Danke 🙂


  • Mod

    pillepallemachen schrieb:

    Der rndwert ist wie alles Andere in der "unnuetz.h" weil mein Prof alles ausgelagert haben will und ich rndwert auch in anderen Funktionen benutze.

    Nein. Das glaub ich dir einfach nicht. Kein Prof der Welt wird jemals sagen, dass man globale Variablen in einen Header schreiben soll, um diese dann ganz lokal zu verwenden. Da hast du garantiert etwas schrecklich falsch verstanden.

    In der Schleife stand und steht jetzt wieder ein -.

    Lass mich mal raten: Du willst Zufallszahlen zwischen 0 und 99? Warum dann nicht einfach dies?

    zahlen[i] = rand() % 100;
    

    Denk nochmal darüber nach, was % macht.

    Warum jetzt auf einmal ein char Array? Willst du Speicherplatz sparen? Falls ja: Auf was für einem Rechner rechnest du? Auf einer Zuse Z5?



  • Ich schreib ein Programm, dass per Eingabezeile gestartet wird. Beim Starten gibt der Benutzer an, wieviele Zahlen erzeugt und geordnet werden sollen.

    Das ist meine unnuetz.h

    int rndwert,anzahl,i,q,r,s,j,l,t,u,w;
    char zahlen[65000];
    
    int unnuetz (int);
    int unnuetz2 (int);
    int erzeugen (int,int);
    void ausgabe (int);
    void ausgabe2 (int);
    

    Das ist die main datei.

    int main( int argc, char* argv[] )
    {
    	FILE * anfang;
    
    unnuetz (argc);
    
    anzahl = atof ( argv[1]);
    
    unnuetz2 (anzahl);
    
    srand(time(NULL)); 
    
    erzeugen (anzahl,zahlen);
    
    anfang=fopen ("schreibmich.txt","w");
    if (anfang==NULL) perror ("Kann Datei nicht oeffnen!");
    {	 
    	for ( i = 0 ;  i < anzahl ;  i++ )
    	{
    		fprintf (anfang ,"%d ", zahlen[i]);
    		printf ("%d ", zahlen[i]);
    	}
    	fprintf (anfang , "\n");
    	printf ("\n");
    }
    //anfang=fopen ("schreibmich.txt","w");
    //ausgabe (anzahl);
    
    hexhex(zahlen,anzahl);	 
    
    ausgabe2(anzahl);
    
    return 0;
    

    Hier les ich ein, ob das Programm korrekt gestartet wurde.
    "name.exe" "anzahl der zahlen"

    #include "unnuetz.h"
    
    int unnuetz (int argc)
    {
    	if (argc > 2) 
    	{
    		printf("Fehler bitte erneut starten\n");
    		return 5;
    	}
    
    	if (argc < 2)
    	{
    		printf("Fehler bitte erneut starten\n");
    		return 5;
    	}
    }
    

    Wenn das geklappt hat, wird die eingebene Zahl überprüft.

    #include "unnuetz.h"
    
    int unnuetz2 (int anzahl)
    {
    if ( anzahl < 0 )
    {
    	printf("Positive Zahlen waeren was feines.\n");
    	anzahl=0;
    	return 5;
    }
    if ( anzahl < 2 )
    {
    	printf("Denk nochmal nach bevor du hier was eingibst\n");
    	return 5;
    }
    if ( anzahl > 65000)
    { 
    	printf("Bitte geben Sie eine kleinere Zahl ein.");
    	return 5;
    }
    }
    

    Negative Zahlen werden ausgeschlossen sowie Zahlen kleiner als 2 und alles was größer als 65000 ist. In Hinsicht auf die Ausgabeschleife in meinem Sortieralgorythmus wär eine noch kleinere Zahl angebrachter, aber ich wollt den Zahlenbereich "ausschöpfen", (auf 65000 abgerundet).

    Danach sollen die Zahlen so wie sie erzeugt wurden ausgegeben werden, die Ausgabeschleife steht noch in der main, weil ich Deklarationsfehler kriege, wenn ich es in eine externe Funktion packen möchte.
    "'FILE': nichtdeklarierter Bezeichner"
    "'anfang': nichtdeklarierter Bezeichner"

    Dann werden die Zahlen geordnet (das steht auch noch in main, weil ich den gleichen Fehler kriege, wie in der obrigen Schleife).

    int hexhex (char v[], int anzahl)
    {
    	FILE * anfang;  // hier kommen die Deklarationsfehler sowie bei jedem weiteren anfang 
    	j = 0;
    	l = 0;
    	t = 0;
    	u = 0;
    	w = 0;
    
    	anfang=fopen ("schreibmich.txt","w");
    	for (q = anzahl - 1; q > 0; q--) 
    	{
    		for ( r = 0; r < q; r++) 
    		{
    			if (zahlen[r] > zahlen[r + 1]) // hier werden zwei Zahlen in dem Array verglichen, und falls nötig um einen nach rechts getauscht.
    			{
    				int n = zahlen[r];
    				zahlen[r] = zahlen[r + 1];
    				zahlen[r + 1] = n;
    				t++; // das t benutz ich für die Ausgabeschleife
    				u++; // das u begrenzt die Anzahl der Ausgaben
    			}
    			else
    			{
    			t++;
    			}
    			if (r == q-1 )
    			{
    				if (u == 0) // hiermit will ich verhindern, dass die geordneten Zahlen mehr als einmal ausgegeben werden
    				{	
    					return 5;
    				}
    					for ( s = 0 ;  s < anzahl ;  s++ )
    					{
    						fprintf (anfang ,"%d ", v[s]);
    						printf ("%d ", v[s]);
    						t=0;
    						u=0;
    					}
    				fprintf (anfang , "\n");
    				printf ("\n");
    			}
    		}
    	}
    }
    

    Danach folgt als letztes die Ausgabe2

    #include "unnuetz.h"
    
    void ausgabe2 (int anzahl)
    {
    printf ("Sie haben %i Zahlen ordnen lassen.\n", anzahl);
    }
    

    ps : Ich hab beim Reinschreiben noch ein paar unklarheiten, von denen ich glaube es wären welche beseitigt, dass mit dem char array[], schau ich mir auch noch genauer an, wenn ich wieder nach Hause komme.

    Ich hoffe damit hast du einen kleinen Einblick in mein persönliches Chaos gewinnen können :). Ich wollte mich an dieser Stelle entschuldigen, falls es bisher so ausgesehen hat, als wollte ich die Lösung auf nem Silbertablett präsentiert kriegen.


Anmelden zum Antworten