ThePretender73
Anmeldungsdatum: 14. Juni 2016
Beiträge: 6
|
Hallo Forum. Ich weiß nicht genau ob ich hier richtig bin, aber ich muss für meinen aktuellen Studiengang einen simplen Buddyspeicher simulieren.
Ich habe heute mit einem java erfahrenen Kollegen ein Skript geschrieben, dass mir einen Arbeitsspeicher einer gewissen Größe erstellen soll & mit diesem Speicher soll gearbeitet werden, d.h. Prozesse sollen hinzugefügt & entfernt werden können. Wir haben das Skript bei ihm in Windows auf einem einfach Editor geschrieben & ich habe es bei mir zu hause kompiliert - aber natürlich treten Fehler auf & einige Dinge waren uns beiden nicht klar. Ich hoffe hier etwas Hilfe zu finden den Code in die richtige Richtung zu schubsen: 1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97 | #!/bin/bash
echo "Wie groß ist ihr Arbeitsspeicher?: "
read speicher
#Einlesen des Arbeitsspeichers
echo "Wie groß ist ihr Prozess den sie dem Speicher hinzufügen wollen?: "
read prozess
if (( prozess < 0 )); then
echo "Dein Prozess ist zu klein & hat keine relevante Größe."
exit
fi
arraySpeicher=($speicher)
arrayName=()
for i in "${arraySpeicher[@]}"; do
if (( $prozess <= $i )); then
j=$i
unset arraySpeicher[$i]
while (( $prozess < $j/2 )); do
arraySpeicher+=($j/2)
((j=j/2))
done
arraySpeicher+="p ${#ArrayName[@]}"
arrayName+=$prozess
fi
done
echo "Dies ist ihr Speicher ${arraySpeicher[@]} nach hinzufügen des Prozesses."
while (( true )); do
PS3="Möchten sie einen Prozess hinzufügen / entfernen / aufhören?"
select eingabe in hinzfügen entfernen aufhören
do
if (( $eingabe == hinzufügen )); then
echo "wie groß ist der Prozess?:"
read prozess
if (( prozess < 0 )); then
echo "Ihr Prozess ist zu klein."
exit
fi
for i in "${arraySpeicher[@]}"; do
#if (( $i == int )) TODO: nur zahlen dürfen behandelt werden, prozesse nicht!!
if (( $prozess <= $i )); then
j=$i
unset arraySpeicher[$i]
while (( $prozess < $j/2 )); do
arraySpeicher+=($j/2)
((j=j/2))
done
arraySpeicher+="p ${#ArrayName[@]}"
arrayName+=$prozess
break
fi
echo "Dies ist ihr Speicher ${arraySpeicher[@]} nach hinzufügen des Prozesses."
fi
done
if (( $eingabe == entfernen )); then
echo "Welchen Prozess willst du entfernen:?"
read antwort
p=arrayName[$antwort]
z=1
while (( $z < $p )); do
z=((z*2))
done
#TODO: stelle muss die position von dem gewünschten Prozess("p"+$antwort) in dem arraySpeicher beinhalten!
arraySpeicher[$stelle]=z
h=1
while (( $h == 1 )); do
h=2
for i in "${arraySpeicher[@]}"; do
if (( i < "${#arraySpeicher[@]}"-1 )); then
if (( arraySpeicher[$i] == arraySpeicher[$i+1] )); then
unset arraySpeicher[$i+1]
arraySpeicher[$i]=((arrayspeicher[$i]*2))
h=1
fi
fi
done
done
fi
if (( $eingabe == aufhören )); then
break
fi
done
done
|
Problem tritt beim ausführen direkt am Anfang aus. Statt das gewünschte Ergebnis auszugeben gibt die Shell mir ein (meiner Meinung nach) falsches Array aus:
"Dies ist ihr Speicher 1024p 0 1024/2 512/2 nach hinzufügen des Prozesses." Bei einem Speicher der Größe 1024 KB und einem Prozess der Größe 200 KB sollte eigentlich
"Dies ist ihr Speicher 512 256 P1(Prozess1) nach hinzufügen des Prozesses." ausgegeben werden.
Zudem wird das Skript ab der while-schleife, die das hinzufügen oder löschen weiterer Prozesse auslöst, nicht weiter ausgeführt.
Außerdem wollten wir eine Bedingung einfügen die sicherstellt, dass im Array nur ganzzahlige Werte mit dem Prozess verglichen werden (Zeile 46-48 das Kommentar).
Zusätzlich haben wir bei Zeile 74 das Problem das die richtige Stelle im Array angewählt werden muss, damit der richtige Prozess gelöscht wird, den wir aus dem RAM (in dem Falle der Array) entfernen wollen. Also alles in allem steckt noch einiges an Arbeit dahinter hoffe hier die Syntax-Fehler bereinigen zu können. MfG
Jonas
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
Hallo, ich „spreche“ kein Bash-Skript. Kann euch also nicht wirklich weiter helfen. Was mich aber interessieren würde: Warum habt ihr das Programm dann nicht in Java (nach dem ihr laut Aussage dort fit seid) oder der Programmiersprache eures Kurses geschrieben? PS: An meiner Uni studiert ihr anscheinend nicht. Dort wurde der Kurs zu diesem Thema Heute mit der Klausur abgeschlossen.
|
ThePretender73
(Themenstarter)
Anmeldungsdatum: 14. Juni 2016
Beiträge: 6
|
Hallo, Hat mehrere Gründe, das wir es nicht in Java geschrieben haben. Der wichtigste Grund für mich ist so viele Sprachen wie möglich anzuschneiden, da ich Wirtschaftsinformatik studiere & der professor sehr geil auf linux ist & wir hervorstechen wollen. Ausserdem finde ich das Konzept von bash-skripting interessant, habe aber leider einen zeitlichen Verschätzer gemacht, wobei wir nur noch 3 Wochen Zeit haben. Zudem ist der Kollege der mir geholfen hat nicht Teil meines Studiengangs & wenn er mir ein Java-Programm schreibt kann ich damit nicht viel anfangen, wenn ich es nicht 100% verstanden habe. Deswegen habe ich versucht mit seiner Hilfe dieses Skript aufzubauen. Lösungsansätze wären immernoch gerne gesehen! MfG
Jonas
|
Vain
Anmeldungsdatum: 12. April 2008
Beiträge: 2503
|
|
track
Anmeldungsdatum: 26. Juni 2008
Beiträge: 7174
Wohnort: Wolfen (S-A)
|
Hi Jonas, willkommen hier in der Nerd-Ecke des Forums ! 😉 Deinen Ehrgeiz zu glänzen in allen Ehren, aber solche Rechnereien mit der Shell zu machen, das ist schon fast etwas Masochismus ! Jedenfalls würde da eher sonstwas nehmen, aber nicht unbedingt die Shell. (Es kommen nicht womöglich später mal Kommazahlen ? - die Shell kennt von Hause aus nämlich nur Integer) Wenn es trotzdem Shell sein soll, solltest Du Dir vorab vielleicht doch mal z.B. das Skripting-Wiki oder vergleichbares 'reinpfeifen, zur Orientierung. Und zu Deinem Skript ein paar Sachen, die mir direkt aufgefallen sind:
Z.8: üblich wäre der direkte Vergleich if [ "$prozess" -lt 0 ]; then Z.13: die Array-Zuweisung trennt den Inhalt von $speicher immer und stur bei den Leerzeichen. Ist das so gewollt ? Z.21 ist ein Schreibfehler. Ich nehme an, die rechte Seite soll Shell Arithmetic (und nicht eine Array-Zerlegung) sein. Z.21/22: denk daran: es wird immer Integer gerechnet, d.h. es gilt: 3/2=1 Z.32: true ist bei der Shell eine Funktion, keine Variable. Sollte also ohne jede Klammer geschrieben werden. Z.33: $PS3 ist eine Systemvariable der Shell. Willst Du die wirklich überschreiben ? (→ eigene Variablen immer $klein !) Z.37: Du meinst bestimmt if [[ $eingabe == hinzufügen ]; then - sonst versteht er die Variable $eingabe dort nicht Z.55 ist mir unklar. Willst Du als neues Element die Liste der bisherigen Elemente anfügen ??
Überhaupt solltest Du mal als Doku vorab klarstellen, was in welcher Variablen stehen soll. (egal in welcher Sprache) - sonst fehlt einfach der Überblick. LG, track
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
ThePretender73 schrieb:
Hat mehrere Gründe, das wir es nicht in Java geschrieben haben. Der wichtigste Grund für mich ist so viele Sprachen wie möglich anzuschneiden, da ich Wirtschaftsinformatik studiere & der professor sehr geil auf linux ist & wir hervorstechen wollen.
Man sollte aber nicht Werkzeuge nur nutzen, weil man sie hat oder beherrscht. Du wirst Rosen im Garten ja auch nicht mit der Kettensäge schneiden. Besser ist es, das angemessene Werkzeug für die Aufgabe zu wählen und nicht einfach nur so viele verschiedene wie möglich. Natürlich könnt ihr damit auch hervorstechen - aber vielleicht anders, als Euch lieb ist. 😉
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2128
Wohnort: Gelsenkirchen
|
Ich schließe mich meinen Vorrednern an: Die Bash ist ziemlich ungeeignet für ein solches Vorhaben. Zentrales Thema von Shell-Sprachen ist das Ausführen von Kommandos (externe Programme), sowie Dateioperationen. Natürlich kann man da Nutzerabfragen, bedingte Anweisungen, usw drumherum bauen. Wenn es aber im Kern um reine Rechnerei geht, dann nimmt man besser eine andere Sprache. Denn ich sag mal so: Man kann mit einem Löffel auch ein Schnitzel schneiden, aber sinnvoll ist es nicht. 😉
|
ThePretender73
(Themenstarter)
Anmeldungsdatum: 14. Juni 2016
Beiträge: 6
|
Danke für all die Antworten!
Finde ich dann etwas komisch, das mein Prof uns nahe legt diese Aufgabe in einem Bash skript zu realisieren. Er motiviert uns sogar dies zu tun! Aber wir habens uns jetzt auch entschieden die Aufgabe in Java zu realisieren... dachte mir das wäre halt eine gute Gelegenheit ein bisschen versierter zu werden, was Linux betrifft, da ich vorher gar nichts mit dem BS zu tun hatte... hoffentlich schaffen wir das zu "übersetzen"... die grundidee des skripts gefällt mir nachwie vor ganz gut! Damit danke an euch! Jonas
|
rklm
Projektleitung
Anmeldungsdatum: 16. Oktober 2011
Beiträge: 13075
|
ThePretender73 schrieb: Danke für all die Antworten!
Bitte!
Finde ich dann etwas komisch, das mein Prof uns nahe legt diese Aufgabe in einem Bash skript zu realisieren. Er motiviert uns sogar dies zu tun!
Vielleicht gibt es ja einen guten Grund, den wir nicht kennen.
Aber wir habens uns jetzt auch entschieden die Aufgabe in Java zu realisieren... dachte mir das wäre halt eine gute Gelegenheit ein bisschen versierter zu werden, was Linux betrifft, da ich vorher gar nichts mit dem BS zu tun hatte...
Naja, Linux ist ja noch viel mehr als Shell-Programmierung.
hoffentlich schaffen wir das zu "übersetzen"... die grundidee des skripts gefällt mir nachwie vor ganz gut!
Das bekommt Ihr bestimmt hin.
|
snafu1
Anmeldungsdatum: 5. September 2007
Beiträge: 2128
Wohnort: Gelsenkirchen
|
ThePretender73 schrieb: Finde ich dann etwas komisch, das mein Prof uns nahe legt diese Aufgabe in einem Bash skript zu realisieren. Er motiviert uns sogar dies zu tun!
Dann frag ihn doch mal, warum er das tut. Sowas kann man auch oft per Email machen, wenn man nicht persönlich zum Prof gehen möchte. ThePretender73 schrieb: Aber wir habens uns jetzt auch entschieden die Aufgabe in Java zu realisieren... dachte mir das wäre halt eine gute Gelegenheit ein bisschen versierter zu werden, was Linux betrifft, da ich vorher gar nichts mit dem BS zu tun hatte...
Wobei Java keine typische Linux-Sprache ist. Dann nimm doch lieber Python oder Perl oder sowas. Das findet man unter Linux wesentlich häufiger.
|
senden9
Anmeldungsdatum: 8. Februar 2010
Beiträge: 965
Wohnort: Österreich
|
snafu1 schrieb: […] Wobei Java keine typische Linux-Sprache ist. Dann nimm doch lieber Python oder Perl oder sowas. Das findet man unter Linux wesentlich häufiger.
Ja. Oder C. Wenn ich es nicht verwechsle haben Wir in dem Fach damals auch noch eine paar Kernel-Module programmiert.
|