Kommandozeilenaufruf mit FLOAT-Parametern



  • Hallo,

    ich habe ein Programm, dem ich beim Aufruf über die Kommandozeile zwei Werte mitgeben möchte. Diese müssen Float sein, da ich hinterher damit rechnen will.

    Hier ein Ausschnitt:

    --------------------------------------------

    int main(int argc, char * argv[])
    {		
    	char art;
    	int eingabe = 0;
    	float r1 = 0.f;
    	float r2 = 0.f;
    	float reihe = 0.0f;
    	float parallel = 0.0f;
    	struct widerst werte;
    	while(argv[3] != NULL && r1 <= 0 && r2 <= 0)
    	{
    		art = 0;
    		printf("Widerstandswert 1 (Ohm): ");
    		scanf("%f", &r1);
    		printf("\nWiderstandswert 2 (Ohm): ");
    		scanf("%f", &r2);
    		eingabe = 1;
    	}
    	if(eingabe == 0)
    	{
    		r1 = (float) argv[1];
    		r2 = (float) argv[2];
    	}
    

    --------------------------------------------

    Die letzten Zeilen kompilieren natürlich nicht. Ich steh auf dem Schlauch, wer kann nen genauen Tipp geben? Gibt es eine Möglichkeit ohne atof?

    Zweites Problem:

    #include <stdio.h>
    #define EOS '\0'
    
    int main()
    {
    	int i;
    	char string1[] = "Hello Welt!";
    	char * string2 = "Hello Welt!";
    	string1[1] = 'a';
    	/* string2 = 'a'; */
    	for(i = 0; string1[i] != EOS; i++) printf("%.1s", &string1[i]); /* Feld zeichenweise ausgeben */
    	for(i = 0; string2[i] != EOS; i++) printf("%.1s", &string2[i]); /* String zeichenweise ausgeben */
    	printf("%s", &string1); /* Feld komplett ausgeben */
    }
    

    Ich habe keine Ahnung, wie ich die auskommentierte Zuweisung zum Laufen bekomme. Ich möchte in string2 das 'e' gegen 'a' tauschen.

    Danke.



  • Zu 1.:

    Ohne atof() gehts nicht. Die Parameter werden immer als String übergeben.

    Die Abprüfung, ob argv[3] nicht NULL ist, ist übrigens gewagt. Überprüfe besser argc, ob größer als 2 ist, dann weißt du, dass mind. 2 Parameter übergeben wurden.

    Zu 2.:
    Das geht schlicht und ergreifend nicht. Du zeigst mit string2 auf einen konstanten Speicherbereich, der nicht verändert werden darf, also würde deine Änderung zum Absturz führen.



  • Zu 1) Danke.

    Zu 2) Jaja ... immer diese fiesen Fallen der Lehrbeauftragten deutscher Hochschulen. 🙄

    EDIT:

    Hier die Überarbeitung, so in Ordnung?

    int main(int argc, char * argv[])
    {		
    	char art;
    	int eingabe = 0;
    	float r1 = 0.f;
    	float r2 = 0.f;
    	float reihe = 0.0f;
    	float parallel = 0.0f;
    	struct widerst werte;
    	while(argc < 2 && r1 <= 0 && r2 <= 0)
    	{
    		art = 0;
    		printf("Widerstandswert 1 (Ohm): ");
    		scanf("%f", &r1);
    		printf("\nWiderstandswert 2 (Ohm): ");
    		scanf("%f", &r2);
    		eingabe = 1;
    	}
    	if(eingabe == 0)
    	{
    		r1 = (float) atof(argv[1]);
    		r2 = (float) atof(argv[2]);
    	}
    


  • da atof() ja wohl n float zurückgibt is der cast unnötig



  • Hatte ich auch erst ... aber dann gibt es eine Warnung, dass nen Double in nen Float gedrückt wird. Mit Cast sagt er nix mehr. Finde ich auch komisch.



  • naja dann nimm für r1, r2 .. auch einfach die datentypen double
    wenn das dein Rechner verkraftet 🙂



  • ist nicht erlaubt ... (Aufgabenstellung)



  • leo aka qsch2 schrieb:

    naja dann nimm für r1, r2 .. auch einfach die datentypen double
    wenn das dein Rechner verkraftet 🙂

    *ggg*

    aber: sollte der Rechner kein DOUBLE "beherschen" verwendet er doch automatisch FLOAT oder? wie bei short und long... (denke ich mir halt)

    mfG (c)h



  • Warum sollte ein "Rechner" keinen Double oder Long beherrschen??

    Der Rückgabewert von atof() ist übrigens double, aber das dürfte eh schon klar sein ;).



  • hmm.. ich weiss nicht genau...

    irgend einer unserer Programmierprofessor hat mal gesagt, dass auf manchen Rechnern (aus welchen Gründen auch immer: OS / Prozessorbedingt) eine int-variable nur eine größe von short haben könnte; oder long->int (weiss nicht mehr genau)

    jedenfalls denke ich mir, dass, sollte das OS oder der Prozessor nicht mit double Rechnen können (bit-abhängig?!?), das Programm den nächstkleineren Datentyp also float verwendet.

    mfG (c)h

    @AJ:
    auch Professoren können irren 😃 (besonders meine irren häufig*gg*), also kannst du das bitte richtigstellen?



  • @chille07
    Entweder hast du es nicht richtig verstanden oder der Prof. hat es nicht richtig erkärt. Die Größe eines Integer hängt vom Betriebssystem ab bzw. für welches Betriebssystem das Programm compiliert wurde. Wenn du z. B. ein Programm für ein 16Bit-System compilierst, ist dein Integer nur 2 Byte groß und dadurch ein Long Integer nur 4 Byte. Bei einem 32Bit-System ist ein einfacher Integer allerdings schon 4 Byte groß. Float und Double ist aber davon nicht betroffen, genausowenig wie ein char ;).



  • ok.. danke, habs verstanden

    mfG (c)h

    PS.: bei char wäre es besonders schlecht, wenn es nur mehr ein halbes Byte groß wäre*gg* das wären nur 4 bit.. dh... wertebereich: -8 bis +7? *gg* das wäre sehr schlecht... man müsste eine neue sprache erfinden!



  • chille07 schrieb:

    ok.. danke, habs verstanden

    mfG (c)h

    PS.: bei char wäre es besonders schlecht, wenn es nur mehr ein halbes Byte groß wäre*gg* das wären nur 4 bit.. dh... wertebereich: -8 bis +7? *gg* das wäre sehr schlecht... man müsste eine neue sprache erfinden!

    Wär eher so, dass das char in einem 32Bit System 2 Byte groß wäre ;).



  • würd wahrscheinlich wenig ausmachen(ausser man verwendet einen größeren zeichensatz*gg*) (wäre aber auch nur speicherplatzverschwendung)


Anmelden zum Antworten