hi leute,
folgendes:
es geht um while schleife
count wird inkrementiert und mit zyklus verglichen.
aber spätentenstens wenn count = 4 ist wird doch if schleife nciht mehr ausgeführt?
weil zyklus[3] nur ist.
wenn wir zb. beim erstenmal durchlaufen
haben wir
zyklus[i] = zyklus[i] + z_typ[i];
zyklus[i] = 1 + 1
also zyklus[0] = 2;
- durchlauf:
if schleife nciht durchgeführt (da count = 2, aber zyklus[1] = 1)
und ab 3. durchlauf auch, die schleife wird nciht mehr durchgeführt. (nach meiner auffassung)
wo ist mein denkfehler?
(weil die while-schleife normal nie verlassen wird, und immer wieder ausgaben hat)
vielen dank
/\* Benoetigte Header fuer die Operationen mit Semaphoren \*/
#include
#include
#include
#include
/\* Standard Header fuer Zeitoperationen \*/
#include
/\*-----------------------------------------------------------------\*/
/\* Variablen Deklaration \*/
/\*-----------------------------------------------------------------\*/
#define SEMKEY 75 /\* Semaphor-Schluessel \*/
/\* File schedule.c enthaelt: \*/
int cleanup();
int main();
/\* File-lokale Variablen: \*/
int semid; /\* Zurueckgelieferte Sem-Id von Unix\*/
short initarray[4]; /\* Initarray fuer die Semaphoren \*/
unsigned int count; /\* Zaehlt die Durchlaeufe \*/
int z\_typ[4]; /\* Anzahl des Zykluszeiten, nach \*/
/\* denen eine Task wieder dran ist \*/
int zyklus [4]; /\* Startzyklus einer Task \*/
int i; /\* Laufvariable \*/
/\* struct sembuf ist eine Standard-Struktur aus 'sem.h'. \*/
/\* Hier werden zwei Felder definiert fuer die jeweiligen \*/
/\* P- und V-Operationen nach Dijkstra, die auf die \*/
/\* hier verwendeten Semaphoren angewendet werden. \*/
struct sembuf vsembuf;
int main()
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
/\* \*/
/\* Hauptprogramm \*/
/\* \*/
/\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*\*/
{
/\* Alle Signale von Unix werden auf cleanup() umgelenkt, \*/
/\* damit z.B. bei einem Break (Signal 2) die Semaphoren auch \*/
/\* wieder aus dem System entfernt werden. \*/
for (i = 0; i
Hallo,
es geht um while schleife
count wird inkrementiert und mit zyklus verglichen.
aber spätentenstens wenn count = 4 ist wird
doch if schleife nicht mehr ausgeführt?
weil zyklus[3] nur ist.
Du meinst das hier:
while (1) {
...
count = count + 1;
for (i = 0; i Du vergleichst doch _count_ nicht mit _i_
sondern mit _zyklus[i]_, welches in der Schleife
laufend hochgezählt wird.
Wer weiss? Was macht das Programm eigentlich?
Grüße
CMБ
…
count = count + 1;
for (i = 0; i Du vergleichst doch count nicht mit
i
sondern mit zyklus[i], welches in der Schleife
laufend hochgezählt wird.
ja ich weiß
aber ich habe doch zyklus[i]
nur bis 3
hier:
zyklus[0] = 1;
zyklus[1] = 1;
zyklus[2] = 2;
zyklus[3] = 2;
womit vergleicht denn das programm weiter ?
nach meiner auffassung komme ich nicht wieder in die if-schleife hinnein?
Hallo
aber ich habe doch zyklus[i]
nur bis 3
hier:
zyklus[0] = 1;
zyklus[1] = 1;
zyklus[2] = 2;
zyklus[3] = 2;
womit vergleicht denn das programm weiter ?
nach meiner auffassung komme ich nicht wieder in die
if-schleife hinnein?
Du hast aber noch
z\_typ[0] = 1;
z\_typ[1] = 2;
z\_typ[2] = 2;
z\_typ[3] = 4;
Comprende?
Wie bist Du überhaupt zu dem Programm
gekommen? Ich liebe solche Geschichten
mehr als C-Programme 
Grüße
CMБ
Du hast aber noch
z_typ[0] = 1;
z_typ[1] = 2;
z_typ[2] = 2;
z_typ[3] = 4;
Comprende?
ja, wie ich im ersten eintrag schon geschrieben habe:
ich gehe das durch:
erster aufruf:
count = 1; zyklus[0]=1;
also
if durchführen
zyklus[0] = zyklus[0] + z_typ[0];
also:
zyklus[0] = 1+1 = 2;
ausgabe bei Tast 0 |
zweiter aufruf:
count = 2; zyklus[1]=1;
if wird nciht durchgeführt ( weil 2 != 1)
dritter:
count = 3; zyklus[2]=2;
also auch nciht
vierer usw. genau so
ich denke was falsch! aber was ?
weil bei nach der Task 0 |Task 1 |Task 2 |Task 3 |
in der näcshten zeile muss dauernt
oder " |" oder " ein |" kommen.
und nach meinem denken wird nur " |" kommen!
Wie bist Du überhaupt zu dem Programm
gekommen? Ich liebe solche Geschichten
mehr als C-Programme 
haben wir in den realzeitsysteme-übungen gemacht (studium)
Hallo rick,
Du benutzt eine endlos-while-Schleife (while(1)), somit beendet sie sich schon mal aus Prinzip nicht von sich aus. Dazu brauchst Du entweder eine break- oder zumindest eine goto-Anweisung (nicht, daß ich Dich zum Letzteren ermutigen würde). Beides fehlt bei Dir. Das ist die Erklärung dafür, warum die while-Schleife niemals verlassen wird.
und ab 3. durchlauf auch, die schleife wird nciht mehr
durchgeführt. (nach meiner auffassung)
Hier hast Du Deinen Denkfehler: Das System braucht zwei Durchläufe zum Einschwingen (count = 0 und count = 1), danach werden bei jedem geraden Anfangswert von count nur zyklus[0] und zyklus[1] ausgeführt („ein |“ wird geschrieben). Bei jedem ungeraden Anfangswert von count werden alle zyklen ausgeführt (dafür sind die in z_typ gespeicherten Increment-Werte verantwortlich).
Lida