Hi zusammen, Ich hoffe auf eure Hilfe. Wir sollen in Visual Studio folgende Aufgabe programmieren: Aufgabe (1) (5/5/5 Punkte) In der Programmierung von Mikrocontrollern oder APIs1 ist es notwendig, Bits zu löschen, zu setzen oder abzufragen. Schreiben Sie dazu bitte folgende Funktionen: a) Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das veränderte Byte zurückgibt. b) Eine Funktion, die in einem Byte die Bits 0 und 2 setzt und das veränderte Byte zurückgibt. c) Eine Funktion, die in einem Byte überprüft, welchen Zustand das Bit 7 besitzt. Es soll der entsprechende Wert (0 oder 1) zurückgeben werden. Testen Sie durch geeignete Funktionsaufrufe im Main Programm Ihre Funktionen Ich habe damit leider einige Probleme. Meine bisherige Lösung sah folgendermaßen aus (funktioniert leider nicht, bzw kommt eine komische Rückgabe): //Aufgabe1 //a) int x; int f00(int x) { x = x & ~(0b10100000); return x; printf("%i", x); } //b) int f01(int x) { return x | 0b0000101; } //c) int f02(int x) { return(x >> 7) & 1; } void main() { int Zahl; int VAZahl, VBZahl, VCZahl; printf("Eingabe:"); scanf_s("%i", &Zahl); VAZahl = f00(Zahl); printf("a) %i \n", VAZahl); VBZahl = f01(Zahl); printf("b) %i \n ", VBZahl); VCZahl = f02(Zahl); printf("c) %i", VCZahl); } Vielen Dank für eure Zeit und Hilfe. :)
Sina schrieb: > kommt eine komische Rückgabe) Setze Warnungen und Output hier rein. Dann siehst Du es selber.
Deine Funktionen sind jedenfalls richtig. Nur das printf nach dem return wird nie ausgeführt!
So sieht meine Rückgabe aus: Eingabe:11011011 a) 11010883 b) 11011015 c) 1 (das printf in der ersten Funktion hinter dem return war ein versehen, das sollte da eigentlich nicht hin.)
Ansonsten Warnungen zeigt es mir nicht an, das Programm läuft durch ohne fehlermeldungen
ich muss ganz ehrlich sagen, dass ich für bytes immer char benutze oder n uint8_t oder oder oder... aben nicht int weil das mindestens 2byte sind, meist sogar vier. Naja und da Sina schrieb: > Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das > veränderte Byte da Byte steht wär für mich die int raus ;) 'sid
Sina schrieb: > Eingabe:11011011 > a) 11010883 > b) 11011015 > c) 1 Es funktioniert schon, nur wird deine Eingabe nicht binär, sondern dezimal interpretiert ...
Sina schrieb: > So sieht meine Rückgabe aus: > > Eingabe:11011011 AUTSCH! ja wenn DU binäres eingeben willst musst Du zuerst deine Eingabe auch als solche erfassen.. das Programm nimmt das als elsmillionenelftausendundelf 'sid
ohje, ich fürchte ich kenne mich beim programmieren wirklich gar nicht aus. Das ist nicht wirklich mein Gebiet, ich muss es halt nur im Studium mitmachen. Also entschuldigt wenn ich blöde Fragen stelle
... es gibt viele Möglichkeiten, hier mal weitere //a, clear uint8_t f00(uint8_t x) { return x & 0x5F; } //b, set uint8_t f00(uint8_t x) { return x | 0x05; } //c, test bool f02(uint8_t x) { return !!(x & 0x80); }
Sina schrieb: > und wie mache ich das, dass es als binär gewertet wird? In C gibt es neben der dezimalen Darstellung traditionell auch oktale und hexadezimale Darstellung - aber keine binäre. "0b" als Präfix war bisher kein Standard. Sowohl printf als auch scanf haben Parameter für Hex-Darstellung.
Ich muss das in visual studio in c programmieren und da funktioniert das meiner Meinung nach so nicht Apollo M. schrieb: > //a, clear > uint8_t f00(uint8_t x) { > return x & 0x5F; > } > //b, set > uint8_t f00(uint8_t x) { > return x | 0x05; > } > //c, test > bool f02(uint8_t x) { > return !!(x & 0x80); > }
Tu wenigstens so, als ob du dich bemühst. Macht einen besseren Eindruck.
(prx) A. K. schrieb: > Tu wenigstens so, als ob du dich bemühst. Macht einen besseren > Eindruck. Sry, war nicht böse gemeint. Ich versuche das schon den ganzen Tag hinzubekommen und habe 20Uhr Abgabefrist und sitze ein wenig auf heißen Kohlen. Das ist halt nur die eine Aufgabe der Abgabe die ich gar nicht auf die Reihe bekomme
Funktionen zum Einlesen und Ausgeben von Binärzahlen musst du dir selbst schreiben, da die C Bibliothek so etwas nicht enthält. Aber ich denke, Interaktive ein/ausgabe war in der Aufgabe nicht verlangt. Teste einfach mit dezimaler Schreibweise und kontrolliere das Ergebnis mit dem Taschenrechner.
Beitrag #6466960 wurde von einem Moderator gelöscht.
Sina schrieb: > ohje, ich fürchte ich kenne mich beim programmieren wirklich gar nicht > aus. Das ist nicht wirklich mein Gebiet, ich muss es halt nur im Studium > mitmachen. Ich kenne Leute, die studieren Lebensmitteltechnik. Die müssen nicht programmieren. Sina schrieb: > versuche das schon den ganzen Tag ... und habe 20Uhr Abgabefrist Und du hast die Aufgabe heute erst bekommen? Krasse Anforderungen an deiner Schule! Sina schrieb: > Testen Sie durch geeignete Funktionsaufrufe im Main Programm Ihre > Funktionen Da steht nirgends was, dass man die Eingaben oder Ausgaben binär wie z.B. 10011100 machen muss. Also ist auch eine Hexzahl auf jeden Fall binär genug. Und zum Einlesen von Hexzahlen mit scanf() gibt es den Hex-Format-Specifier: https://www.includehelp.com/c-programs/input-a-hexadecimal-value-using-scanf.aspx Den selben Specifier gibts dann für die Ausgabe auch für printf().
(prx) A. K. schrieb: > Das gäbe bei mir einen Minuspunkt. ~0xA0 wäre ok. .. dann nenne mal deine Pros/Cons!
Stefan ⛄ F. schrieb: > Aber ich denke, Interaktive ein/ausgabe war in der Aufgabe nicht > verlangt. Ja, ich würde das auch direkt mit ein paar festen Werten testen und mir den ganzen scanf-Zirkus sparen. Bei direktem Aufruf der Funktion kann man ja auch die binäre Schreibweise benutzen, z.B. f00(0b101010) Bei Teil a) geht es um Bits 5 und 7, da würde ich einfach mal folgende 4 Werte testen: 1. Bits 5 und 7 sind nicht gesetzt, z.B. 0 2. Bit 5 ist gesetzt, 7 nicht, z.B. 0b101010 (42) 3. Bit 7 ist gesetzt, 5 nicht, z.B. 0b10010010 (146) 4. Bits 5 und 7 sind gesetzt, z.B. 0b10101010 (170) Welche Werte da jeweils nach der Anwendung der Funktion rauskommen müssen lässt sich ja leicht selbst ausrechnen. So kann man sich dann auch für die anderen Teilaufgaben passende Beispielwerte suchen.
Apollo M. schrieb: >> Das gäbe bei mir einen Minuspunkt. ~0xA0 wäre ok. > > .. dann nenne mal deine Pros/Cons! 0x5F löst die Aufgabe nur bei Bytes mit exakt 8 Bits.
AVerr schrieb: > Bei direktem Aufruf der Funktion kann > man ja auch die binäre Schreibweise benutzen, z.B. f00(0b101010) M.W. gibt es in C bisher offiziell keine binary literals (jedoch in C++14). Allerdings gibt es sie in manchen Implementierungen. Folglich hängt man von der Toleranz desjenigen ab, der die Antwort bewertet.
:
Bearbeitet durch User
(prx) A. K. schrieb: > 0x5F löst die Aufgabe nur bei Bytes mit exakt 8 Bits. OK, guter Punkt! Aber ein Minuspunkt begründet das nicht, eher gibt es keinen extra Pluspunkt. Hier war aber auch nicht mehr gewünscht ... und uint8_t stützt das auch, "a) Eine Funktion, die in einem Byte die Bits 5 und 7 löscht und das veränderte Byte ..."
:
Bearbeitet durch User
Apollo M. schrieb: > Aber ein Minuspunkt begründet das nicht, eher gibt es keinen extra > Pluspunkt. Also gut, Punktabzug statt Minuspunkt. ;-) > Hier war aber auch nicht mehr gewünscht ... Bei einem Byte mit 9 Bits wird bei 0x5F das 9te Bit gelöscht. Wenn in der Aufgabe oder dem Kontext ein Byte als 8 Bits definiert wird, passt es. Andernfalls hängt man von der Toleranz desjenigen ab, der die Antwort bewertet.
:
Bearbeitet durch User
Apollo M. schrieb: > und uint8_t stützt das auch, Im Startbeitrag steht nichts von uint8_t. Sinas persönliche Annahmen würde ich nicht als Referenz für die Aufgabe werten.
:
Bearbeitet durch User
Beitrag #6467017 wurde von einem Moderator gelöscht.
(prx) A. K. schrieb: > m Startbeitrag steht nichts von uint8_t. ... da steht aber byte und das verwendete int passt da eher nicht.
Das heißt ja nicht, daß man uint8_t nicht benutzen kann. Was nicht explizit verboten ist, ist erlaubt. Ansonsten: @Sina: Überleg dir mal, was du mit logischen Verknüpfungen machen kannst. Einen Operanden in der Verknüpfung kannst du ja selber wählen. Und ob du eine Zahl binär oder hexadezimal darstellst, ist dem Computer auch egal. Der Windows-Taschenrechner kann das auch für dich umrechnen (einfach auf Programmiereransicht gehen).
Apollo M. schrieb: > ... da steht aber byte und das verwendete int passt da eher nicht. Ein Byte passt immer in int, aber nicht immer in uint8_t. Wühlhase schrieb: > Das heißt ja nicht, daß man uint8_t nicht benutzen kann. Was nicht > explizit verboten ist, ist erlaubt. Bei Bytes > 8 Bits gibt es u.U. kein uint8_t.
:
Bearbeitet durch User
Ok, ein kleines Beispiel: Das hier setzt das dritte Bit:
1 | a = ? //Irgendeine Zahl |
2 | b = 0x4; //Entspricht 0b00000100 |
3 | c = a | b; //Bitweise ODER-Operation, c enthält das Ergebnis |
Den Rest kriegste selber noch hin.
Vielen lieben Dank euch allen für eure Hilfe, ich bin jetzt noch fristgerecht fertig geworden und konnte die Aufgaben eben hochladen. Ich wünsche euch einen schönen Abend! :D
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.