Not logged in. · Lost password · Register

Page:  1  2  3  next 
Femto
Member since Jul 2012
3 posts
Subject: MC Fragen
Hallo,

nachdem ich mir ein paar Altklausuren angeschaut habe, war ich mir bei manchen MC Fragen nicht sicher, vielleicht könnt ihr mir ja weiterhelfen:

März 2010:

b) Welche der folgenden Aussagen zur Sichtbarkeit von Variablen ist
richtig?
❏ Globale static-Variablen sind in allen Programmteilen immer direkt
zugreifbar.
❏ Eine lokale static-Variable ist nur innerhalb der Funktion, in der sie definiert
wurde, sichtbar.
❏ Lokale static-Variablen sind aus anderen Modulen nur dann zugreifbar, wenn sie
ausserdem als "extern" deklariert wurden.
❏ Wenn eine globale und eine lokale Variable gleichen Namens existieren, dann
hat die globale Variable Vorrang.

Ich glaube, es ist das zweite, sie ist zwar bis Programmende im Speicher, aber nur in der Funktion sichtbar, oder?

c) Was ist ein Stack-Frame?
❏ Der Speicherbereich, in dem der Programmcode einer Funktion
abgelegt ist.
❏ Ein spezieller Registersatz des Prozessors zur Bearbeitung von Funktionen.
❏ Ein Fehler, der bei unberechtigten Zugriffen auf den Stack-Speicher entsteht.
❏ Ein Bereich des Speichers, in dem u.a. lokale automatic-Variablen
einer Funktion abgelegt sind.

Hier tippe ich auf das vierte, da ja laut Skript lokale Variablen dort abgelegt werden, oder hab ich das falsch verstanden?

April 2009:

a) Was ist der Unterschied zwischen den wie folgt in einer Funktion foo
(lokal) definierten Variablen?
void foo() {
int a;
static int b;
❏ Die Variable a ist nur für Funktionen in der Datei zugreifbar, in der foo definiert
ist, während auf b auch von Funktionen in anderen Modulen des Programms
zugegriffen werden kann.
❏ Der Speicherplatz der Variablen a wird jeweils beim Aufruf der Funktion foo
angelegt und beim Verlassen wieder freigegeben, während der Speicherplatz der
Variablen b von Programmstart bis -ende verfügbar ist.
❏ Die Variable b ist nur für Funktionen in der Datei zugreifbar, in der foo definiert
ist. Funktionen in anderen Modulen des Programms können prinzipiell auf a
zugreifen, hierzu muss a aber in dem entsprechenden Modul mit einer extern-
Deklaration bekannt gemacht werden.
❏ Da der Speicherplatz der Variablen b für die gesamte Ausführungszeit des Programms
reserviert ist, darf es in anderen Funktionen keine weitere Variable mit
dem Namen b geben. Bei a gilt diese Einschränkung nicht.

Hier meine ich, dass es das zweite ist. Das erste kann es eig nicht sein, da es durch das static ja nur modulweit sichtbar ist, für Antwort drei müsste a ja global definiert sein und vier macht meiner Meinung nach auch keinen Sinn...

Oktober 2008:

c) Welche Aussage zu virtuellen Adressräumen ist richtig?
❏ Die Umrechnung von virtuellen Adressen in physikalische Adressen
erfolgt einmal beim Laden des Programms.
❏ Die Umrechnung von virtuellen Adressen in physikalischen Adressen wird zur
Laufzeit durch eine spezielle Hardwareeinheit durchgeführt.
❏ Auf einem Rechner mit nur einer CPU müssen virtuelle Adressen nicht in physikalische
Adressen umgewandelt werden, da sie nur innerhalb eines Prozesses
gelten und immer nur ein Prozess ausgeführt werden kann.
❏ Verwendet man einen Zeiger in C, so kann man über das Schlüsselwort static
festlegen, ob die virtuelle oder die physikalische Adressen darin gespeichert
wird.

Das zweite kann ich schon mal ausschließen, da die Umrechnung ja mittels Software funktioniert. Ich vermute, dass es das erste ist, kann die anderen aber auch nicht 100%ig ausschließen.

Vielleicht habt ihr ja noch ein paar Hinweise für mich  :-)
killermiller
Member since May 2011
41 posts
März 2010:

b) Welche der folgenden Aussagen zur Sichtbarkeit von Variablen ist
richtig?
❏ Globale static-Variablen sind in allen Programmteilen immer direkt
zugreifbar.
❏ Eine lokale static-Variable ist nur innerhalb der Funktion, in der sie definiert
wurde, sichtbar.
❏ Lokale static-Variablen sind aus anderen Modulen nur dann zugreifbar, wenn sie
ausserdem als "extern" deklariert wurden.
❏ Wenn eine globale und eine lokale Variable gleichen Namens existieren, dann
hat die globale Variable Vorrang.

Ich glaube, es ist das zweite, sie ist zwar bis Programmende im Speicher, aber nur in der Funktion sichtbar, oder?
Stimmt.
c) Was ist ein Stack-Frame?
❏ Der Speicherbereich, in dem der Programmcode einer Funktion
abgelegt ist.
❏ Ein spezieller Registersatz des Prozessors zur Bearbeitung von Funktionen.
❏ Ein Fehler, der bei unberechtigten Zugriffen auf den Stack-Speicher entsteht.
❏ Ein Bereich des Speichers, in dem u.a. lokale automatic-Variablen
einer Funktion abgelegt sind.

Hier tippe ich auf das vierte, da ja laut Skript lokale Variablen dort abgelegt werden, oder hab ich das falsch verstanden?
Stimmt auch.
April 2009:

a) Was ist der Unterschied zwischen den wie folgt in einer Funktion foo
(lokal) definierten Variablen?
void foo() {
int a;
static int b;
❏ Die Variable a ist nur für Funktionen in der Datei zugreifbar, in der foo definiert
ist, während auf b auch von Funktionen in anderen Modulen des Programms
zugegriffen werden kann.
❏ Der Speicherplatz der Variablen a wird jeweils beim Aufruf der Funktion foo
angelegt und beim Verlassen wieder freigegeben, während der Speicherplatz der
Variablen b von Programmstart bis -ende verfügbar ist.
❏ Die Variable b ist nur für Funktionen in der Datei zugreifbar, in der foo definiert
ist. Funktionen in anderen Modulen des Programms können prinzipiell auf a
zugreifen, hierzu muss a aber in dem entsprechenden Modul mit einer extern-
Deklaration bekannt gemacht werden.
❏ Da der Speicherplatz der Variablen b für die gesamte Ausführungszeit des Programms
reserviert ist, darf es in anderen Funktionen keine weitere Variable mit
dem Namen b geben. Bei a gilt diese Einschränkung nicht.

Hier meine ich, dass es das zweite ist. Das erste kann es eig nicht sein, da es durch das static ja nur modulweit sichtbar ist, für Antwort drei müsste a ja global definiert sein und vier macht meiner Meinung nach auch keinen Sinn...
Hier musst du aufpassen; auch wenn die Variable static ist, bleibt sie eine lokale Variable und damit nur innerhalb der Funktion sichtbar (also auch nicht modulweit). Die erste Antwort bleibt damit aber trotzdem falsch. Drei ist aus den richtigen Gründen ausgeschlossen, müsste global sein, damit das so funktioniert. Vier macht wie du sagst keinen Sinn, da die Variablen ja speicherverwaltungsmäßig nicht unter den eigentlichen Variablennamen abgelegt werden, sondern nur als Speicheradressen. Damit bleibt dann nur noch Antwort zwei, die nebenher auch noch richtig ist.
Oktober 2008:

c) Welche Aussage zu virtuellen Adressräumen ist richtig?
❏ Die Umrechnung von virtuellen Adressen in physikalische Adressen
erfolgt einmal beim Laden des Programms.
❏ Die Umrechnung von virtuellen Adressen in physikalischen Adressen wird zur
Laufzeit durch eine spezielle Hardwareeinheit durchgeführt.
❏ Auf einem Rechner mit nur einer CPU müssen virtuelle Adressen nicht in physikalische
Adressen umgewandelt werden, da sie nur innerhalb eines Prozesses
gelten und immer nur ein Prozess ausgeführt werden kann.
❏ Verwendet man einen Zeiger in C, so kann man über das Schlüsselwort static
festlegen, ob die virtuelle oder die physikalische Adressen darin gespeichert
wird.

Das zweite kann ich schon mal ausschließen, da die Umrechnung ja mittels Software funktioniert. Ich vermute, dass es das erste ist, kann die anderen aber auch nicht 100%ig ausschließen.
Ich würde sagen, die Umrechnung passiert sehr wohl über Hardware (vgl. MMU). Die letzten beiden Antworten sind ziemlich sinnlos, bleiben nur noch die ersten beiden und da würde ich auf die zweite tippen.
Raim
GSPiC-Guru
Member since May 2011
79 posts
Quote by killermiller:
Quote by Femto:
Oktober 2008:

c) Welche Aussage zu virtuellen Adressräumen ist richtig?
❏ Die Umrechnung von virtuellen Adressen in physikalische Adressen
erfolgt einmal beim Laden des Programms.
❏ Die Umrechnung von virtuellen Adressen in physikalischen Adressen wird zur
Laufzeit durch eine spezielle Hardwareeinheit durchgeführt.
❏ Auf einem Rechner mit nur einer CPU müssen virtuelle Adressen nicht in physikalische
Adressen umgewandelt werden, da sie nur innerhalb eines Prozesses
gelten und immer nur ein Prozess ausgeführt werden kann.
❏ Verwendet man einen Zeiger in C, so kann man über das Schlüsselwort static
festlegen, ob die virtuelle oder die physikalische Adressen darin gespeichert
wird.

Das zweite kann ich schon mal ausschließen, da die Umrechnung ja mittels Software funktioniert. Ich vermute, dass es das erste ist, kann die anderen aber auch nicht 100%ig ausschließen.
Ich würde sagen, die Umrechnung passiert sehr wohl über Hardware (vgl. MMU). Die letzten beiden Antworten sind ziemlich sinnlos, bleiben nur noch die ersten beiden und da würde ich auf die zweite tippen.

Richtig getippt :-) Die Umrechnung erfolgt in der MMU.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #2
Quote by Femto:
Quote by killermiller:
Das zweite kann ich schon mal ausschließen, da die Umrechnung ja mittels Software funktioniert. Ich vermute, dass es das erste ist, kann die anderen aber auch nicht 100%ig ausschließen.
Ich würde sagen, die Umrechnung passiert sehr wohl über Hardware (vgl. MMU). Die letzten beiden Antworten sind ziemlich sinnlos, bleiben nur noch die ersten beiden und da würde ich auf die zweite tippen.
Naja, das ganze in Software zu machen wäre ziemlich aufwendig, da das bei jedem Speicherzugriff passieren müsste. Was nicht heißt, dass man das nicht theoretisch in Software machen könnte - wäre nur sehr langsam. Deshalb verzichtet man dann lieber auf virtuellen Speicher....
Femto
Member since Jul 2012
3 posts
Ahh ok, dann hatte ich das verwechselt.

Danke für die schnelle Hilfe!
TW
Member since Jul 2012
9 posts
Welche der folgenden Aussagen bzgl. der Interruptsteuerung trifft zu?
❏ Pegel-gesteuerte Interrupts werden beim Wechsel des Pegels ausgelöst,
daher der Name.
❏ Interrupts sind eine Besonderheit von AVR-Mikroprozessoren. Auf anderen
Architekturen kommen POSIX-Signale zum Einsatz.
❏ Pegelgesteuerte Interrupts müssen durch Polling des Pegels abgefragt werden.
❏ Wurde gerade ein Flanken-gesteuerter Interrupt ausgelöst, so muss erst ein
Pegelwechsel der Interruptleitung stattfinden, damit erneut ein Interrupt ausgelöst
werden kann.

also ich weiß zwar nicht was POSIX-Siganle sind, aber ich denk nicht dass diese Antwort passt. 1 und 3 denke ich sind auch falsch. Und eigt denke ich auch, dass 4 falsch ist, weil flankengesteurt kan nja auch auf beide flanken reagieren oder?
Aber eine muss ja richtig sein :P
killermiller
Member since May 2011
41 posts
Welche der folgenden Aussagen bzgl. der Interruptsteuerung trifft zu?
❏ Pegel-gesteuerte Interrupts werden beim Wechsel des Pegels ausgelöst,
daher der Name.
❏ Interrupts sind eine Besonderheit von AVR-Mikroprozessoren. Auf anderen
Architekturen kommen POSIX-Signale zum Einsatz.
❏ Pegelgesteuerte Interrupts müssen durch Polling des Pegels abgefragt werden.
❏ Wurde gerade ein Flanken-gesteuerter Interrupt ausgelöst, so muss erst ein
Pegelwechsel der Interruptleitung stattfinden, damit erneut ein Interrupt ausgelöst
werden kann.

also ich weiß zwar nicht was POSIX-Siganle sind, aber ich denk nicht dass diese Antwort passt. 1 und 3 denke ich sind auch falsch. Und eigt denke ich auch, dass 4 falsch ist, weil flankengesteurt kan nja auch auf beide flanken reagieren oder?
Aber eine muss ja richtig sein :P
Eins ist genau falsch, pegelgesteuerte Interrupts werden bei Anliegen eines Pegels ausgelöst. Bei Pegelwechsel sind das dann flankengesteuerte Interrupts.
Zwei is mehr oder weniger sinnlos, Interrupts kommen auf quasi allen Architekturen vor, POSIX hat mit Interrupts nicht wirklich viel zu tun (siehe z.B. Wikipedia).
Drei ist auch genau falsch, da Polling ja das gegenteilige Prinzip zu Interrupts ist.
Damit bleibt dann nur noch vier. Ist hier etwas komisch formuliert, aber ich denke, dass gemeint ist, der Interrupt wird erst dann ausgelöst, wenn der Pegel wieder wechselt. Also genau das, was pegelgesteuerte Interrupts machen.
TW
Member since Jul 2012
9 posts
okay danke, dann ist klar.

Welche Aussage zu Zeigern ist richtig?
❏ Die Speicherstelle, auf die ein Zeiger verweist, kann niemals selbst
einen Zeiger enthalten.
❏ Beim Rechnen mit Zeigern muss immer der Typ des Zeigers beachtet werden.
❏ Ein Zeiger kann zur Manipulation von schreibgeschützten Datenbereichen verwendet
werden.
❏ Zeiger vom Typ void* benötigen weniger Speicher als andere Zeiger, da bei
anderen Zeigertypen zusätzlich die Größe gespeichert werden muss.

und wie siehts hier aus? also 1 und 4 würde ich ausschließen, 2 denke ich ist auch falsch da sich das rechnen ja auf adressen bezieht
aber antwort 3 muss eigt falsch sein, da hier

Welche Aussage zu Zeigern ist richtig?
❏ Die Übergabesemantik für Zeiger als Funktionsparameter ist callby-
value.
❏ Die Übergabesemantik für Zeiger als Funktionsparameter ist call-by-reference.
❏ Ein Zeiger kann zur Manipulation von schreibgeschützten Datenbereichen verwendet
werden.
❏ Zeiger vom Typ void* sind am besten für Zeigerarithmetik geeignet, da Sie
kompatibel zu jedem Zeigertyp sind.

doch schon antwort 1 richtig ist oder nicht? :P
il66ifix
Member since May 2011
109 posts
Zeiger auf Zeiger sind kein Problem, void* und Größe ist Blödsinn - so weit, so gut
Manipulation von schreibgeschützten Bereichen will ich sehen :D Die sind schreibgeschützt, also nix mit Zugriff und verändern (da gibts schon nen Thread: http://eei.fsi.uni-erlangen.de/forum/thread/608-Zeiger)
Es ist tatsächlich das 2. richtig, da Zeiger ja unterschiedliche Typen haben können.

zum zweiten: Überleg mal, wie so ein Zeiger aussieht.... Die holen was aus einem Speichergebiet, also call by value (auch wenn das Ziel wieder ein Zeiger ist)
Thomas Fleischmann
Member since Apr 2011
3 posts
Der Herr Lohmann hat in der Fragestunde Vorlesung eig. gesagt dass man Zeiger zur Manipulation von schreibgeschützten Datenbereichen verwenden kann und dass des somit bei der MC Aufgabe die richtige Antwort is
Raim
GSPiC-Guru
Member since May 2011
79 posts
Man kann durch Casten eines Zeigers zwar const umgehen, in einen schreibgeschützten Datenbereich kann man damit aber nicht schreiben.
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #10
Quote by Thomas Fleischmann:
Der Herr Lohmann hat in der Fragestunde Vorlesung eig. gesagt dass man Zeiger zur Manipulation von schreibgeschützten Datenbereichen verwenden kann und dass des somit bei der MC Aufgabe die richtige Antwort is

Hmm - da hat er wohl Verwirrung gestiftet. Schreibgeschützt ist schreibgeschützt. Speziell beim AVR ist es aber so, dass es keinen Schreibgeschützten Datenspeicher gibt -> Wenn eine Variable const ist, dann versucht der Compiler das schreiben auf die Variable zu unterbinden (wirft eine Fehler). Verwendest du aber Pointer kann der Compiler gegebenenfalls nicht mehr wissen, dass du auf eine Schreibgeschützte Variable schreiben willst. Da du keinen Schreibschutz hast, funktioniert das. Es gibt aber auch uC (auch 8-Bitter) die Speicherschutz unterstützen.
oliiii
Member since Mar 2011
5 posts
Frage Oktober 2006 d)
Was passiert. wenn man das folgende Programmstück übersetzen und ausführen möchte:
char *string;
string = "Spic ist toll";
❏Der Compiler wird einen Fehler melden, weil diese Art von Zugriff auf einen Zeiger nicht erlaubt ist.
❏Der Variablen string wird der Zeiger auf die konstante Zeichenkette "Spic ist toll" zugeordnet
❏Unter Betriebssystemen wie Unix oder Windows wird zur Laufzeit eine Schutzverletzung bzw. SIGSEV ausgelöst, da dem Zeiger ein Wert zugeordnet wird, der Zeiger jedoch nicht initialisiert wurde.
❏Die Zeichenkette "Spic ist toll" ist konstant und darf daher keinem nicht-konstanten Zeiger zugewiesen werden.

"Spic ist toll" wäre doch in diesem Fall die Addresse des zu addressierenden Speichers. Deshalb würde ich 2. und 3. ausschließen. 4.hört sich auch komisch an.
Aber 1. habe ich ausprobiert, und es gab keinen Fehler.

Danke für eine Antwort
maddes
Member since Feb 2011
9 posts
Subject: Juli 2009
Ein Hauptprogramm und eine Interruptbehandlung greifen nebenläufig
auf die Variable uint16_t foo zu. Das Hauptprogramm verwendet foo
in der Anweisung uint16_t bar = foo; der Interrupthandler verwendet
foo im Vergleich if(foo == 5). Welches Nebenläufigkeitsproblem kann
auftreten?
❏ Lost-Update
❏ Lost-Wakeup
❏ keines
❏ Das Hauptprogramm könnte einen inkonsistenten Wert lesen, da foo aus 2 Bytes
besteht und nicht mit einer Instruktion geladen werden kann.

bei der frage bin ich mir unsicher. ich würde 1 oder 4 sagen aber wirklich wissen tu ichs net. vllt hat jmd ne erklärung für mich?
danke
morty
SPiC-Meister
(Moderator)
Member since May 2011
331 posts
In reply to post #13
Quote by oliiii:
Frage Oktober 2006 d)
Was passiert. wenn man das folgende Programmstück übersetzen und ausführen möchte:
char *string;
string = "Spic ist toll";
❏Der Compiler wird einen Fehler melden, weil diese Art von Zugriff auf einen Zeiger nicht erlaubt ist.
❏Der Variablen string wird der Zeiger auf die konstante Zeichenkette "Spic ist toll" zugeordnet
❏Unter Betriebssystemen wie Unix oder Windows wird zur Laufzeit eine Schutzverletzung bzw. SIGSEV ausgelöst, da dem Zeiger ein Wert zugeordnet wird, der Zeiger jedoch nicht initialisiert wurde.
❏Die Zeichenkette "Spic ist toll" ist konstant und darf daher keinem nicht-konstanten Zeiger zugewiesen werden.

"Spic ist toll" wäre doch in diesem Fall die Addresse des zu addressierenden Speichers.
Hä?
Close Smaller – Larger + Reply to this post:
Verification code: VeriCode Please enter the word from the image into the text field below. (Type the letters only, lower case is okay.)
Smileys: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O :troll:
Special characters:
Page:  1  2  3  next 
Go to forum
Powered by the Unclassified NewsBoard software, 20110527-dev, © 2003-8 by Yves Goergen