C Entfernen einer nicht benötigten Variabel verändert alles?

AP Nova

Commander
Registriert
Juni 2008
Beiträge
2.256
Mein Problem ist folgendes: Wenn ich im unten stehenden Quellcode nur die Variabel "Ramtakt" (und im scanf das dazugehörige %f) entferne, kommt bei der Eingabe von "200 266 667 15" im kompilierten Code was komplett anderes raus, als bei der Eingabe von "200 266 *beliebige Zahl außer 0* 667 15" im Code mit "Ramtakt". (Ich hatte die Variabel erst, dann ist mir jedoch aufgefallen, dass wohl niemand seinen RAM unter der Maximaltaktung laufen lassen wird bzw. sie überflüssig für das Programm ist, nur aus dem scanf krieg ich die einfach nicht raus)

Hat irgendjemand eine Idee, wie eine Variabel, in die nur etwas geschrieben aber danach nie wieder daraus gelesen/damit gearbeitet wird, durch ihr Fehlen ein Ergebnis komplett verändern kann?

Code:
#include <stdio.h>
#include <stdlib.h>

int main(void)
{
	int RAMTaktungen[4] = {533, 667, 800, 1066}, RAMTaktungenzaehler = 4;
	float FSB, FSBneu, FSBneu2, FSBhoechsttakt, FSBWunsch, CPU, CPUWunsch, CPUneu, Multiplikator, CPUQuotient, Ramteiler, Ramteiler2, Ramtakt, Ramneu, Ramhoechsttakt;
	printf("Geben Sie den Standart-FSB, FSB-Hoechsttakt, RAM-Takt, RAM-Hoechsttakt und CPU-Takt oder Multiplikator durch Leerzeichen getrennt ein.\n");
	scanf("%f%f%f%f%f", &FSB, &FSBhoechsttakt, &Ramtakt, &Ramhoechsttakt, &CPU);
	fflush(stdin);
	if(CPU < 50)
	{
		Multiplikator = CPU;
		CPU = Multiplikator * FSB;
		Ramteiler = Ramhoechsttakt / 2 / FSB;
	}
	else
	{
		Multiplikator = CPU / FSB;
		Ramteiler = Ramhoechsttakt / 2 / FSB;
	}
	SPRUNGMARKE: ;
	RAMTaktungenzaehler = 3;
	printf("Nennen Sie die gewuenschte CPU- oder FSB-Taktung:     (\"0\" fuer Beenden)\n");
	scanf("%f", &CPUWunsch);
	if(CPUWunsch == 0)
		return EXIT_SUCCESS;
	if(CPUWunsch < 500)
	{
		FSBWunsch = CPUWunsch;
		CPUWunsch = FSBWunsch * Multiplikator;
	}
	CPUQuotient = CPUWunsch / CPU;
	CPUneu = CPU * CPUQuotient;
	FSBneu = FSB * CPUQuotient;
	Ramneu = Ramhoechsttakt * CPUQuotient;
	printf("Der neue FSB betraegt: %.2fMHz. Der neue RAM-Takt betraegt: %.2fMHz. Der neue CPU-Takt betraegt: %.2fMHz.\n", FSBneu, Ramneu, CPUneu);
	if(FSBneu > FSBhoechsttakt)
		printf("!!! Warnung: Der FSB-Hoechsttakt wird ueberschritten !!!\n");
	if(Ramneu > Ramhoechsttakt)
	{
		printf("!!! Warnung: Der RAM-Hoechsttakt wird ueberschritten !!!\n");
		while(Ramneu > Ramhoechsttakt && RAMTaktungenzaehler >= 0)
		{

			Ramteiler2 = RAMTaktungen[RAMTaktungenzaehler-1] / FSB;
			Ramneu = FSBneu * Ramteiler2;
			RAMTaktungenzaehler--;
		}
		if(RAMTaktungenzaehler >= 0)
			printf("Es wird vorgeschlagen, den RAM vor dem Uebertakten auf %dMHz zu takten. In diesem Fall waere der neue RAM-Takt bei %.2fMHz.\n", RAMTaktungen[RAMTaktungenzaehler], Ramneu);
		else
		{
			RAMTaktungenzaehler = 3;
			while(RAMTaktungen[RAMTaktungenzaehler / 2] > FSB)
				RAMTaktungenzaehler--;
			RAMTaktungenzaehler += 20;
			FSBneu2 = Ramhoechsttakt / 2 /(RAMTaktungen[RAMTaktungenzaehler] / 2 / FSB);
			printf("Der mit diesem Board und RAM hoechste moegliche FSB betraegt %.2fMHz (CPU: %.2fMHz, bei %dMHz RAM-Takt)\nBei niedrigster Taktung wuerde der RAM-Takt jetzt %.2fMHz betragen.\n", FSBneu2, FSBneu2 * Multiplikator, RAMTaktungen[RAMTaktungenzaehler], FSBneu * RAMTaktungen[RAMTaktungenzaehler] / FSB);
		}
	}
	printf("\n\n\n\n\n");
	goto SPRUNGMARKE;

	return EXIT_SUCCESS;
}
 
Lass dir die 4 bzw. 5 Variablen doch mal direkt nach dem scanf ausgeben um zu sehen, ob hier alles korrekt ist. Außerdem würde ich empfehlen, alle Parameter zu initialisieren (mit 0 oder -1) sofern sie für UserInput verwendet werden.

Im Übrigen wäre es schöner, "%f %f %f %f %f" zu schreiben, damit man den gewünschten Delimiter (Leerzeichen) gleich erkennt und er eindeutig definiert ist. Wenn nichts angegeben ist wird wohl standardmäßig Leerzeichen, Tab UND Enter als Delimiter verwendet aber um sicher zu gehen sollte man es besser eindeutig definieren.

Außerdem solltest du den Input generell besser checken, insbesondere dass FSB != 0 ist. Andernfalls gibts ne "Division by Zero". Das ist zwar nicht ganz so schlimm weils floats sind aber es kommt trotzdem Müll raus. Und Standard schreibt man mit "d"!!!
 
Zuletzt bearbeitet:
Benutze doch einfach CPUCalc.;)
Falls dir einige Features in dem Programm fehlen, so melde dich einfach bei mir. Ich suche noch ein par Sachen und es dauert noch etwas bis die neue Page fertig ist und mit ihr dann CPUCalc 1.9.7 erscheinen kann.
 
Zuletzt bearbeitet:
Ich habe mit printf() hinter dem scanf schon alle Variabeln ausgeben lassen, es verändert merkwürdiger Weise rein gar nichts, ob da Ramtakt drin ist oder nicht, dennoch spinnt das Ergebnis ohne Ramtakt.

Auch das Initialisieren der Eingabevariabeln bringt nichts, sobald ich Ramtakt aus dem scanf nehme und der RAM-Takt den Hoechsttakt zwangshaft überschreitet, erhalte ich ohne die "Ramtakt"-Variabel nur Schwachsinn.

@Cyba_Mephisto: Mir geht es darum, selbst ein kleines (funktionierendes) Programm geschrieben zu haben, dass es wohl Alternativen gibt, ist mir klar.
 
Wenn die Werte der variablen alle in Ordnung sind, dann gibt es eigentlich keine gescheite Erklärung dafür, dass ein anderes Ergebnis rauskommt. Was für einen Compiler benutzt du denn? Hast du mal alles neu kompilieren lassen (rebuild all)?
Es kann ja eine nicht vorhandene Variable nicht dafür sorgen, dass deine Berechnung nicht stimmt. Versuch mal dein Projektverzeichnis zu bereinigen oder erzeuge ein neues Projekt und kopiere deinen Code dort rein.
 
Ich kompiliere mit MinGW, habe mal ein neues Projekt erstellt, den Code kopiert, eingefügt, kompiliert (ohne Ramtakt), die sinnlose Ausgabe ist immer noch da.
 
Ich kann auch das Problem nicht nachvollziehen (GNU GCC Compiler, aber das dürfte bei so trivialen Sachen keinen Unterschied machen). Wenn ich in der Version mit Ramtakt "200 266 100 667 15" und dann "800" eingebe, kommt dabei genau das selbe raus, als wenn ich Ramtakt rausnehme und bei der Eingabe die 100 weglasse... Zeig am besten nochmal das Programm, wo du den Ramtakt rausgenommen hast und gib uns auch die Eingaben, die wir bei beiden Versionen tätigen sollen, um das Problem nachvollziehen zu können...
 
int RAMTaktungen[4] = {533, 667, 800, 1066}, RAMTaktungenzaehler = 4;
float FSB, FSBneu, FSBneu2, FSBhoechsttakt, FSBWunsch, CPU, CPUWunsch, CPUneu, Multiplikator, CPUQuotient, Ramteiler, Ramteiler2,Ramtakt, Ramneu, Ramhoechsttakt;
printf("Geben Sie den Standart-FSB, FSB-Hoechsttakt, RAM-Takt, RAM-Hoechsttakt und CPU-Takt oder Multiplikator durch Leerzeichen getrennt ein.\n");
scanf("%f%f%f%f%f", &FSB, &FSBhoechsttakt, &Ramtakt, &Ramhoechsttakt, &CPU);


Das Fettgeschriebene kommt raus, meine Eingabe ist 200 266(wobei das in diesem Fall eher egal ist) 667 (667) 15 (alternativ 3000)

Wenn ich nun im nächsten Schritt sage, dass ich einen FSB von 251 haben möchte, erhalte ich mit Ramtakt die richtige Ausgabe, ohne Ramtakt erzählt der mir dann aber vollkommenen Blödsinn, ich solle den RAM vor übertakten auf einen tierisch hohen Wert takten, dann hätte er nach dem übertakten 0MHz...
 
Zurück
Oben