Zum Inhalt springen

Primzahlcheck mit hilfe einer Funktion und Array


Empfohlene Beiträge

Geschrieben

hallo zusammen,

in der überschrift seht ihr das ich an einem programm mit funktion und array sitze. das programm ist so weit fertig, jedoch sagt mir visual studio beim debuggen "Debug Error! Run-Time Check Failure #3 - The variable 'rest' is being used without being initialized."

nach der fehler angabe hat er anscheinend probleme mit meiner variabel "rest" weil sie nicht initialisiert wird.

ich versteh nun nicht ganz warum. vielleicht könnt ihr mir helfen.


int primzahlcheck (int);


int _tmain(int argc, _TCHAR* argv[])

{

	int ergebnis, zahl[1000], zuUntersuchendeZahl = 3, arrayzaehler = 0; // zählt von 0 bis 999;


		do

		{

			ergebnis = primzahlcheck( zuUntersuchendeZahl );


			if ( ergebnis == 1 )

			{

				zahl[arrayzaehler] = zuUntersuchendeZahl;

				arrayzaehler++;

			}


			zuUntersuchendeZahl++;

		} while (arrayzaehler<=1000);


	return 0;

}


int primzahlcheck (int a)


{

	int teiler,rest;


	for (teiler=2; teiler <= a/2; teiler++)

	{

		rest = a % teiler;


		if (rest == 0)

		{

			return 0;

		}

	}


		if (rest != 0)

		{

			printf ("%d\n",a); 

			return 1;

		}

}


grüße voldemort

Geschrieben

ok, hab da mal was geändert.

ich habe meinen rest benannt und nun meckert der compiler über meine zahl.

hab mein array schon runtergesetzt, aber de fehler lautet immer noch "Stack around the variable 'zahl' was corrupted".

Hier der geänderte Code


int primzahlcheck (int);


int _tmain(int argc, _TCHAR* argv[])

{

	int ergebnis, zuUntersuchendeZahl = 2, zahl[999], arrayzaehler = 0; // zählt von 0 bis 999;


		do

		{

			ergebnis = primzahlcheck( zuUntersuchendeZahl );


			if ( ergebnis == 1 )

			{

				zahl[arrayzaehler] = zuUntersuchendeZahl;

				arrayzaehler++;

			}


			zuUntersuchendeZahl++;

		} while (arrayzaehler<=1000);


	return 0;

}


int primzahlcheck (int a)


{

	int teiler, rest=3;


	for (teiler=2; teiler <= a/2; teiler++)

	{

		rest = a % teiler;


		if (rest == 0)

		{

			return 0;

		}

	}


		if (rest != 0)

		{

			printf ("%d\n",a); 

			return 1;

		}

}


Geschrieben

		do

		{

			ergebnis = primzahlcheck( zuUntersuchendeZahl );


			if ( ergebnis == 1 )

			{

				zahl[arrayzaehler] = zuUntersuchendeZahl;

				arrayzaehler++;

			}


			zuUntersuchendeZahl++;

		} while (arrayzaehler<=1000);

Deine Schleife ruft zuletzt zahl[1000], obwohl Zahl nur bis 998 deklariert wurde. Schreibe bei den ganzen int-Deklarationen statt

zahl[999]

einfach

zahl[1001]

dann sollte es imo gehen...

Geschrieben

Ohne, dass ich jetzt genau weiß, wo der Compiler (?) - also die Zeile - dies anmeckert, muss ich Phirxos (der schneller war als ich), da zustimmen, schau Dir noch mal die Arraygrenzen an.

Wenn Du ein Array deklariert int blub[1000], dann hat es 1000 Elemente, aber die beginnen bei 0 und laufen bis 999, also Dein Zählindex [0,999].

Geschrieben

ach ja. das war ein ganz dummer fehler von mir. ich vergaß zu beachten das er die speicher von 0-999 zählt.

so weit so gut. der compiler meckert nun nicht mehr und das programm läuft. jedoch ist meine erste ausgegebene zahl 5297. d.h. irgendwo habe ich nun noch einen fehler.

kann es sein das es mit der if-abfrage in der funktion zu tun hat? sobald ich diese ausklammer zeigt er mir die richgen zahlen an, oder ist das nun ein dummer zufall?

Geschrieben

Eher ein dummer Zufall - das Programm rechnet alles korrekt, aber die Konsole kann nur eine begrenzte Anzahl von Zeilen anzeigen, d. h. die oberen Zeilen werden praktisch sofort von den unteren verdrängt. Ersetze in

printf ("%d\n",a);

das \n durch ein paar Leerzeichen, dann sollte es funktionieren...

Geschrieben

ok, gesagt getan.

das programm läuft, aber spuckt nach den 1000 zahlen noch mal 1000 zahlen aus.

irgendwie kann es aber auch nicht das wahre sein das durch den zeilenumbruch so ein derber fehler auftreten kann.

da muss es doch ne logische erklärung für geben, oder?

bei näherem betrachten des programmes bin ich nun doch durch das array verwirrt. ich hatte ja zahl[1000] deklariert sprich zeihen zahl 0 -999. das sind doch 1000 zeichenpro speicher.

wieso musste ich denn nun das array zahl[1001] benennen?

grüße voldemort

Geschrieben

du musst es zahl[1001] nennen, weil du arrayzaehler von 0 bis 1000 verwendest - das sind 1001, nicht 1000 Zahlen...

Logische Erklärung für die Legastenie der Batch fällt mir auf Anhieb keine ein...

Geschrieben

ich hab die lösung für das \n problem.

man muss einfach nur den zeilenpuffer erhöhen und schon schreibt das programm auch die zahlen von anfang an.

das muss man erstmal wissen ;)

mal ne frage am rande. kann man arrayzeichen mit hilfe einer schleife zählen?

ich wüsste grad nicht wie

Geschrieben
man muss einfach nur den zeilenpuffer erhöhen und schon schreibt das programm auch die zahlen von anfang an.

das muss man erstmal wissen ;)

Dein Programm schreibt immer alle Zahlen. Die Eingabeaufforderung, die dein Programm ausführt, merkt sich aber in der Voreinstellung nicht so viele Zeilen, das ist alles.

mal ne frage am rande. kann man arrayzeichen mit hilfe einer schleife zählen?

ich wüsste grad nicht wie

Was meinst du mit "arrayzeichen"? Was genau willst du zählen?
Geschrieben
also ein array = ein zeichen.
Ich verstehe dich nicht. Wenn ein Array ein Zeichen ist, ist dann ein Arrayzeichen ein Zeichenzeichen?

Ein Array ist per Definition nicht ein Ding, sondern mehrere hintereinander.

sagen wir mal wir schreiben einen text mit array und möchten dann zählen wie viele zeichen bzw felder ich benutzt habe.
Du drückst dich wirklich sehr unklar aus. Was meinst du mit "text mit array"? Was meinst du mit "benutzt"? Suchst du vielleicht die Funktion strlen?
Geschrieben

zur verständnis:

char zeile[1000]

gets (zeile)

wir geben einen text über tastatur ein der an das array übergeben wird.

nun such ich eine möglichkeit die mir ermöglicht das das programm mir ausgibt wie viele buchstaben inkl leerzeichen eingegeben wurden sind.

ich hoffe das war verständlicher.

ich könnte auch einen neuen thread erstellen wenn das wünschenswert ist, da es ja mit dem eigentllichen thema nichts mehr zu tun hat.

voldemort

Geschrieben

ja,danke. das wäre die einfache variante. ich hab es nun mit einer while-schleife gelöst. jetzt muss ich nur noch das \0 mit einer if abfrage "sichtbar" machen und schon ist wieder eine aufgabe gelöst.

danke für die antworten

Dein Kommentar

Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung wiederherstellen

  Nur 75 Emojis sind erlaubt.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

Fachinformatiker.de, 2024 by SE Internet Services

fidelogo_small.png

Schicke uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App

Download on the App Store
Get it on Google Play

Kontakt

Hier werben?
Oder sende eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×
×
  • Neu erstellen...