私は現在、単純なバージョンのバディアルゴリズムをシミュレートしようとしています。 このコードの抽出は、配列を$ speicher =フォーマットするRAMに追加するプロセスをシミュレートする必要があります。 (変数はドイツ語です)$ prozess = RAMに追加されるプロセス。 スクリプトを実行しようとすると、19行目= arraySpeicher + =($ j/2)でエラー=再帰が多く発生します。 (もう一度エラーがドイツ語になっていますので、正しいエラーがあるかどうかは完全にわかりません) $ iは、バディアルゴリズムプリンシパルに合うようにフォーマットする必要がある$ prozessの値を持つ必要があります。配列に追加する(bash)
フォーマットされた値を配列に追加したいという問題を解決するにはどうすればよいですか?
#!/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
編集:私は今のところ完全なコードを入れています。まだいくつかの作業が必要ですが、コメントを追加してコードをインデントする必要があります。うまくいけば、このスクリプトは完了です!事前にヘルプのためのthx!
スクリプトをテストできるように入力してください。 – choroba