Ansi C "konsolenparameter"



  • Hallo, ich hab ein ganz einfaches programm geschrieben, was die zahlen die man als paramter eingibt, wieder ausgeben soll...

    #include "stdafx.h"
    #include "stdlib.h"
    
    //prototypen 
    
    double* reservieren (int); //speicher reservieren
    void ausgabe (int ,double*); //printf die zeichen ausgeben
    void umw(int ,char**,double*); // im "zahlen" array 
    
    //MAIN
    int _tmain(int argc, char* argv[])
    {       
    	double* zahlen; //array in dem die zahlen gespeichert werden
    	int i;
    	int t=argc; // eigentlich unnötig, aber t geht einfacher zu schreiben
    	//printf ("%d",t);
    	zahlen=reservieren(t); //array größe wird initialisert	
    	umw(t,argv,zahlen);
    	ausgabe(t,zahlen);
    	system ("PAUSE");
    	return 0;
    }
    
    //Funktionen
    double *reservieren(int t) // 2 parameter ergeben t=3 usw, daher feldgröße für 2 =t , wegen der 0 am ende.
    {
    double *array1;
    array1 = (double*) malloc ((t)*sizeof(double));
    return array1;
    }
    
    void umw(int t,char** argv,double* zahlen)
    {
    	int i;
    	for (i=0;i<(t-1);i++)
    	{
    		//sscanf(argv[(i+1)],"%lf",&zahlen[i]);	  geht auch mit sscanf?
    	zahlen[i]=atof(argv[(i+1)]); //ginge  auch mit array to int...
    	 }
    }
    void ausgabe (int t, double* zahlen)
    {
    	int i;
    	for (i=0;i<t-1;i++)
    	{
    	printf("Das %d. Element ist : %lf\n",(i+1),zahlen[i]);
    	}
    
    }
    

    Das problem : wenn ich mit den parametern das programm aufrufe, gibt er die zahlen mit 4.0000 statt 4.4 zurück...

    das gleiche hatte ich vorher auch, hatte alles als "int", da hat er immer nur die erste zahl eingelesen, als 7 statt 79!...

    weiß jeamnd woran das liegt? bitt?



  • Hey,

    ich hab das Programm nochmal neu geschrieben. Bei mir funktioniert folgendes:

    #include "stdafx.h"
    #include <stdlib.h>
    #include <stdio.h>
    
    double *reservieren(int c);
    void umwandeln(int c, char *argv[], double *ptr);
    void ausgabe(int c, double *ptr);
    
    int _tmain(int argc, char *argv[])
    {
    	double *zahlen;
    	int count;
    
    	if (argc <= 1) // Genügend Paramter übergeben?
    	{
    		fprintf(stderr, "Fehler: falsche Parameteranzahl!");
    
    		return 1;
    	}
    
    	count = argc - 1; // Der erste Paramter ist der Name des Programms, also brauchen wir ein Element weniger
    
    	zahlen = reservieren(count);
    
    	if (!zahlen) // War die Reservierung erfolgreich?
    	{
    		fprintf(stderr, "Fehler: Speicher konnte nicht reserviert werden!");
    
    		return 1;
    	}
    
    	umwandeln(count, argv, zahlen);
    
    	ausgabe(count, zahlen);
    
    	free(zahlen); // WICHTIG!!! Speicher freigeben!
    
            system("PAUSE");
    
    	return 0;
    }
    
    double *reservieren(int n)
    {
    	return malloc(sizeof(double) * n); // Kann man auch in eine Zeile packen...
    }
    
    void umwandeln(int n, char *argv[], double *ptr)
    {
    	int i;
    
    	for (i = 1; i <= n; ++i)
    	{
    		ptr[i-1] = atof(argv[i]);
    	}
    }
    
    void ausgabe(int n, double *ptr)
    {
    	int i;
    
    	for (i = 0; i < n; ++i)
    	{
    		printf("%d = %lf\n", i + 1, ptr[i]);
    	}
    }
    

    Aufruf:

    > Test.exe 1.312 3 2.123123 3.34234
    1 = 1.312300
    2 = 2.123123
    3 = 3.342340



  • Zeile 45 " void* kann nicht in double * umgewandelt werden, in deinem code 😞
    hab das mit (double*) gecastet, dann gings...

    ich hab es jetzt mal statt mit visual studio mit dev c kompiliert, damit geht auch mein quell code... seeeehr seltsam... sowas ist doch unnützt

    edit: mit der visual studio console gings auch zu kompilieren, nur mit dieser scheiß entwicklungsumgebung nicht...



  • Das ist je nach Compiler unterschiedlich. Ich würde einfach zahl=(double *)malloc(...); schreiben, das geht überall.



  • Thuruk schrieb:

    Das ist je nach Compiler unterschiedlich. Ich würde einfach zahl=(double *)malloc(...); schreiben, das geht überall.

    Das ist je nach Programmiersprache unterschiedlich.
    C braucht keine malloc-Casts, C++ schon.
    Wenn man nicht weiß, wie man in VisualStudio richtige C Programme kompiliert, kompiliert man defaultmäßig C++, typischer Anfängerfehler.

    Und hier zum wiederholten Mal, wie man wirkliche ANSI C Programme mit VisualStudio kompiliert:

    Zu Beginn des Main-Moduls:

    #undef UNICODE
    #undef _UNICODE
    #ifdef __cplusplus
    #error ich übersetze gerade C Code mit einem C++ Compiler, ich bin ein Anfänger
    #endif
    #pragma warning( disable:4996 )

    Um statt des in VisualStudio standardmäßig eingestellten C++ Compilers auch wirklich den C Compiler zu aktivieren, muss man
    alle Quellcodedateien *.cpp in *.c umbenennen
    oder
    in den Projekteigenschaften C/C++ > Advanced > Compile As /TC einstellen

    Zu guter Letzt noch ANSI C aktivieren, d.h. die VC++ "Features" deaktvieren
    Projekteigenschaften C/C++ > Language > Disable Language Extensions /Za einstellen

    Hinweis: der C-Compiler von MS kann bisher kein C99, d.h. er kann nur ANSI C/ISO C90.
    Neuere VC++ Versionen unterstützen aber immerhin schon den erst mit C99 spezifizierten Datentyp (unsigned) long long int, sogar mit den standardkonformen Formatspezifizierern lld/llu.



  • Dev C++ ist so ziemlich das schlimmste, was du dir antun kannst. Nimm Code::Blocks oder so.

    Und nur weil ein Code mal korrekt funktioniert und mal nicht, heißt das nicht, dass der Code korrekt ist und der Compiler nichts taugt. Wohlmöglich enthält einfach der Code undefiniertes Verhalten durch Programmierfehler.



  • Wutz schrieb:

    Thuruk schrieb:

    Das ist je nach Compiler unterschiedlich. Ich würde einfach zahl=(double *)malloc(...); schreiben, das geht überall.

    Das ist je nach Programmiersprache unterschiedlich.
    C braucht keine malloc-Casts, C++ schon.
    Wenn man nicht weiß, wie man in VisualStudio richtige C Programme kompiliert, kompiliert man defaultmäßig C++, typischer Anfängerfehler.

    Und hier zum wiederholten Mal, wie man wirkliche ANSI C Programme mit VisualStudio kompiliert:

    Zu Beginn des Main-Moduls:

    #undef UNICODE
    #undef _UNICODE
    #ifdef __cplusplus
    #error ich übersetze gerade C Code mit einem C++ Compiler, ich bin ein Anfänger
    #endif
    #pragma warning( disable:4996 )

    Um statt des in VisualStudio standardmäßig eingestellten C++ Compilers auch wirklich den C Compiler zu aktivieren, muss man
    alle Quellcodedateien *.cpp in *.c umbenennen
    oder
    in den Projekteigenschaften C/C++ > Advanced > Compile As /TC einstellen

    Zu guter Letzt noch ANSI C aktivieren, d.h. die VC++ "Features" deaktvieren
    Projekteigenschaften C/C++ > Language > Disable Language Extensions /Za einstellen

    Hinweis: der C-Compiler von MS kann bisher kein C99, d.h. er kann nur ANSI C/ISO C90.
    Neuere VC++ Versionen unterstützen aber immerhin schon den erst mit C99 spezifizierten Datentyp (unsigned) long long int, sogar mit den standardkonformen Formatspezifizierern lld/llu.

    naja ich hab mich da nicht rangesetzt weil ich so heiß auf programmieren bin, sondern weil wir das bis jetzt so in der uni gelernt haben... ich weiß nicht was und wieso visual studio compiliert.

    leider hat unser prof es wohl nicht für nötig befunden, uns zu erklären wie man damit wirklich C kompiliert..



  • C mit seinen Standards und der Compiler selbst sind das eine, die IDE die du wählst, um es möglichst bequem zu haben, ist etwas anderes.
    Die IDE trifft bestimmte Annahmen, wenn du sie startest und ihr nicht mitteilst, was du Konkretes machen möchtest. Und bei VStudio ist es eben C++.


Anmelden zum Antworten