(schleifen, arrays)

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;

  1. 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 :wink:

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 |

ein

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 :wink:

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