C programm problem ltoa



  • Okay,

    Also ich benutze den Dev, DevC++ compiler, da wir den in der Schule benutzen müssen.

    So ich habe hier den Code für einen Rechner geschrieben der auch funktioniert.

    [code]
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    
    int main (int argc, char *argv[]) {
    	int i, j;
    	long y, erg;
    
    	if(argc < 4) {
    		printf ("4 arguments needed!\n");
    		printf ("Call: %s <zahl><op><zahl> ...\n", *argv);
    		return EXIT_FAILURE;
    	}
    	erg=strtol(argv[1], 0, 10);
    	if(erg == 0) {
    		printf ("No valid number\n");
    		return EXIT_FAILURE;
    	}
    	for(i=1 ; i<argc-1 ; i+=2) {
    		for(j=i+1; j<i+2 ; j++) {
    			y= strtol(argv[i+2], 0, 10);
    			if(y==0){
    				printf("No valid number\n");
    				printf("argc: %d (%s)?!\n", i+2, argv[i+2]);
    				return EXIT_FAILURE;
    			}
    			if(strcmp(argv[j],"+")==0){
    				erg+=y;
    				}
    				else if(strcmp(argv[j],"-")==0){
    					erg-=y;
    				}
    				else if(strcmp(argv[j],"*")==0){
    					erg*=y;
    				}
    				else if(strcmp(argv[j],"/")==0){
    					erg/=y;
    				}
    				else {
    					printf("invalid operand: &s\n", argv[j]);
    					return EXIT_FAILURE;
    				}
    			}	
    		}
    
    	printf("%ld\n", erg);
    	return EXIT_SUCCESS;
    
    	}
    

    Wenn ich jetzt aber möchte dass der Rechner mit der Basis 2 (binär) rechntet ändere ich

    [code]
    zeile 14: erg=strtol(argv[1], 0, 2);
    zeile 21: y= strtol(argv[i+2], 0, 2);
    

    und jetzt zu meinem problem, wenn ich das jetzt in

    [code]
    printf("ld ist binär %s\n", erg, ltoa(erg, 2))
    

    Binär ausgeben möchte was "meiner Meinung" nach funktionieren müsste bekomme ich die fehlermeldung beim komplieren " Not ebough arguments to use ltoa"

    so wie bekomme ich mein erg in die basis 2 ohne dass ich dafür eine extra funktion schreiben muss?

    Und warum funktioniert das mit ltoa nicht?

    mfg



  • naja du musst itoa ja auch 3 argumente übergeben und nicht nur 2: wert, string, basis



  • also dann?

    printf("ld ist binär %s\n", erg, ltoa(erg, str, 2))
    

    wobei ich den str noch declariern muss



  • naja du musst der funktion ein array übergeben, in das der string auch reingeschrieben werden soll. keine ahnung, was der return-wert für einen sinn hat.

    edit: wenn du eine zahl binär darstellen willst, kannst du das auch einfach mit bitoperationen machen, was insbesondere zum lernen (ansonsten braucht man auch eigentlich keine binärzahlen) sehr sinnvoll sein kann.



  • HansKlaus schrieb:

    ... keine ahnung, was der return-wert für einen sinn hat.

    Eben den, wie Bartimaeus ihn benutzt hat.
    Damit man die Funktion auch als Argument einer weitern Funktion (wie printf) benutzen kann.

    HansKlaus schrieb:

    (ansonsten braucht man auch eigentlich keine binärzahlen)

    Du hast wohl noch keine Hardwaresteuerung programmiert.


  • Mod

    DirkB schrieb:

    HansKlaus schrieb:

    (ansonsten braucht man auch eigentlich keine binärzahlen)

    Du hast wohl noch keine Hardwaresteuerung programmiert.

    Aber da rechnest du doch nicht die ASCII-Darstellung bei aus? 😕



  • naja es geht darum einen TR zu coden mit mehreren optionen

    z.B.

    if (argc == 1|| getopt(argv[1], "h") == 1) {
        show_help();
        rturn (0);
    

    und dass man damit dann auch bin, oct, hex 6 decimal rechenen kann.



  • SeppJ schrieb:

    Aber da rechnest du doch nicht die ASCII-Darstellung bei aus? 😕

    Um jemanden zu zeigen, dass er Bits falsch zusammen bastelt, ist es hilfreich.

    Wenn man es kann, reicht auch die Hexdarstellung.



  • DirkB schrieb:

    Du hast wohl noch keine Hardwaresteuerung programmiert.

    ich studiere elektrotechnik mit schwerpunkt technische informatik, das hat "son kleines bisschen" mit hardware zu tun. 😃

    beim openwatcom-compiler gibts sogar den formatspezifizierer "%b", aber da das alles viel zu unübersichtlich ist, ist die hexadezimale darstellung das mittel der wahl und ansonsten gibt es eben die bitverschiebung.



  • #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <ctype.h>
    #define BUF 4096
    
    int main (int argc, char *argv[]) {
    	int i, j;
    	long y, erg;
    	char str[BUF];
    
    	if(argc < 4) {
    		printf ("4 arguments needed!\n");
    		printf ("Call: %s <zahl><op><zahl> ...\n", *argv);
    		return EXIT_FAILURE;
    	}
    	erg=strtol(argv[1], 0, 2);
    	if(erg == 0) {
    		printf ("No valid number\n");
    		return EXIT_FAILURE;
    	}
    	for(i=1 ; i<argc-1 ; i+=2) {
    		for(j=i+1; j<i+2 ; j++) {
    			y= strtol(argv[i+2], 0, 2);
    			if(y==0){
    				printf("No valid number\n");
    				printf("argc: %d (%s)?!\n", i+2, argv[i+2]);
    				return EXIT_FAILURE;
    			}
    			if(strcmp(argv[j],"+")==0){
    				erg+=y;
    				}
    				else if(strcmp(argv[j],"-")==0){
    					erg-=y;
    				}
    				else if(strcmp(argv[j],"*")==0){
    					erg*=y;
    				}
    				else if(strcmp(argv[j],"/")==0){
    					erg/=y;
    				}
    				else {
    					printf("invalid operand: &s\n", argv[j]);
    					return EXIT_FAILURE;
    				}
    			}	
    		}
    
    	printf("%s", ltoa(erg, str, 2));
    	return EXIT_SUCCESS;
    
    	}
    

    Danke an euch, thread may be closed now.



  • DevC++ ist kein Compiler sondern eine IDE.
    ltoa ist ebenso wie itoa kein Standard, Compiler können diese Funktion also anbieten oder auch nicht und nicht unbedingt mit der hier verwendeten Funktionsweise und Parametern.


Log in to reply