Veröffentlicht 28. Januar 20205 j Guten Tag liebes Forum, ich möchte gerade folgende Aufgabe lösen: Your job is to write a program that shows, in human-readable form (see below for specifics), how much memory a set of variables of a certain type will use. Your program should read a character that identifies the data type ('i' for int, 's' for short, 'c' for char, 'd' for double). Your program should then calculate the amount of memory required to store the given variables. Your program needs to be written in such a way that it would also perform correctly on other computers. In other words, rather than hard-coding specific sizes for the different variable types, your program needs to use the "sizeof()" function to determine how much memory an individual variable of a given type needs. Finally, you need to output the amount of space required by your variables to the screen. You need to make sure you provide this output in a form that is easy to read for humans. The following examples illustrate what this means: Examples If the user input was: i 36794 then the amount of space needed (if we assume that an integer uses 4 bytes in memory) would be 4*36794 = 147176 bytes. This corresponds to 147 kilobytes and 176 bytes, so the output should be: 147 KB and 176 B Aber wenn ich meine Lösung kompiliere, dann bekomme ich komische Resultate, d.h. hinten hängt dort dann einfach noch einmal eine Zahl dran. Ich weiß nicht woher die kommt: i 36794 147 KB and 176 B 102 Vielleicht sieht hier jemand woher der Fehler kommt? #include <stdio.h> int SizeOfCall(char type, int input); int SizeForHumans(int num); int main(void) { int input; char type; scanf("%c %d",&type, &input); printf("%d",SizeOfCall(type, input)); return 0; } int size; int SizeOfCall(char type, int input){ if (type == 'i'){ size = input*sizeof(int); printf("%d", SizeForHumans(size)); }else if (type == 'c'){ size = input*sizeof(char); printf("%d", SizeForHumans(size)); }else if (type == 'd'){ size = input*sizeof(double); printf("%d", SizeForHumans(size)); }else{ printf("Invalid Type"); } } int size; int GB, MB, KB, B = 0; int SizeForHumans(int size){ if (size<1000){ B = size; printf("and %d B\n",B); }else if (size<1000000){ KB = size/1000; printf("%d KB ",KB); return SizeForHumans(size%1000); }else if (size<1000000000){ MB = size/1000000; printf("%d MB ",MB); return SizeForHumans(size%1000000); }else if (size<1000000000000){ GB = size/1000000000; printf("%d GB ",KB); return SizeForHumans(size%1000000000); } }
28. Januar 20205 j In der Zeile printf("%d",SizeOfCall(type, input)); Willst du den Rückgabewert von SizeOfCall() auf dem Bildschirm ausgeben. SizeOfCall() hat aber gar kein Rückgabewert.
28. Januar 20205 j Danke, Whizzard, dass dachte ich mir eben auch und habe das mal geändert. So scheint es zu gehen. Ich müsste nur für long int noch ändern denke ich. Jedenfalls ist der Fehler jetzt weg. Danke. #include <stdio.h> int SizeOfCall(char type, int input); int SizeForHumans(int size); int main(void) { int input; char type; scanf("%c %d",&type, &input); return SizeOfCall(type, input); } int size; int SizeOfCall(char type, int input){ if (type == 'i'){ size = input*sizeof(int); return SizeForHumans(size); }else if (type == 'c'){ size = input*sizeof(char); return SizeForHumans(size); }else if (type == 'd'){ size = input*sizeof(double); return SizeForHumans(size); }else if (type == 'd'){ size = input*sizeof(double); return SizeForHumans(size); }else if (type == 's'){ size = input*sizeof(short); printf("%d", SizeForHumans(size)); }else{ return printf("Invalid Type"); } } int size; int GB, MB, KB, B = 0; int SizeForHumans(int size){ if (size<1000){ B = size; return printf("and %d B\n",B); }else if (size<1000000){ KB = size/1000; printf("%d KB ",KB); return SizeForHumans(size%1000); }else if (size<1000000000){ MB = size/1000000; printf("%d MB and ",MB); return SizeForHumans(size%1000000); }else if (size<1000000000000){ GB = size/1000000000; printf("%d GB ",KB); return SizeForHumans(size%1000000000); } } Bearbeitet 28. Januar 20205 j von Schnuggenfuggler
28. Januar 20205 j Und hat dennoch Optimierungspotenzial, da die Funktion SizeForHumans() zu viel macht. Sie ist für die Umrechnung und für die Ausgabe auf der Konsole zuständig. Sie ist also per Unittest nicht testbar und auch nicht wiederverwendbar. Angenommen, du willst die Ausgabe nicht auf der Konsole machen, sondern auf der Webseite. Darüber hinaus hat sie ebenfalls einen unnötigen Rückgabewert.
28. Januar 20205 j Außerdem ist die Ausgabe nicht richtig. Wenn ich "i 4"eintrage, gibt er " and 16 B" aus.
28. Januar 20205 j Die Ausgabe Strings habe ich bei mir jetzt so geändert, dass es passen müsste, danke Whizzard. Das sind Interessante Einwände. Unittest hört sich gut an, das schaue ich mir heute Abend mal genauer an. Ich weiß nicht was du mit "unnötiger Rückgabewert" meinst. vor 1 Stunde schrieb Schnuggenfuggler: return SizeOfCall(type, input); das hier? vor 1 Stunde schrieb Schnuggenfuggler: return printf("and %d B\n",B); oder die hier? oder noch andere?
28. Januar 20205 j Denk mal drüber nach, welchen Rückgabewert printf() hat und überlege mal, wofür du diesen Wert benötigst.
28. Januar 20205 j Lösung vor 2 Minuten schrieb Schnuggenfuggler: Einen String, für die Ausgabe 😀 also return printf macht keinen Sinn? 😬 Lies dir mal die Dokumentation zu printf() durch und schau mal, was der Rückgabewert ist.
28. Januar 20205 j Ahh... sehr cool. Danke. Der Rückgabewert für printf ist ein Integer für die Anzahl der ausgegebenen Buchstaben. So ist der Fehler also entstanden. Danke Whizzard!
Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.