#include <stdio.h>
void saidai_num(int kosuu, int data[], int *max, int *max_num) {
int current_max = data[0]; // 初期最大値 (GR0)
int count = 1; // 初期の個数 (GR5)
int counter = 0; // ループカウンタ (GR6)
while (counter < kosuu) {
data = data + 1; // 配列ポインタを次へ (LAD GR2, 1, GR2)
counter = counter + 1; // カウンタ + 1 (LAD GR6, 1, GR6)
if (*data > current_max) {
// これまでより大きい値が見つかった場合
current_max = *data; // 最大値を更新 (LD GR0, GR7)
count = 1; // 個数を 1 にリセット (LAD GR5, 1)
} else if (*data == current_max) {
// 現在の最大値と同値が見つかった場合
count = count + 1; // 個数をインクリメント (LAD GR5, 1, GR5)
}
// *data < current_max の場合は何もせず次の要素へ
}
*max = current_max; // 結果を変数へ書き込み (ST GR0, 0, GR3)
*max_num = count; // 個数を変数へ書き込み (ST GR5, 0, GR4)
return;
}
int main(void) {
/* 配列1: 要素数 7 (kosuu = 6) - 30が3個存在 */
int array1[] = {10, 15, 30, 15, 30, 30, 7};
int max1, num1;
/* 配列2: 要素数 6 (kosuu = 5) - 全て同値 10が6個存在 */
int array2[] = {10, 10, 10, 10, 10, 10};
int max2, num2;
/* サブルーチン呼び出し (GR1〜GR4 に引数をセット) */
saidai_num(6, array1, &max1, &num1);
saidai_num(5, array2, &max2, &num2);
/* 結果確認(CASL2000メモリーダンプ画面で確認) */
printf("配列1: 最大値 MAX1 = %d, 個数 NUM1 = %d\n", max1
, num1
); // 30, 3 printf("配列2: 最大値 MAX2 = %d, 個数 NUM2 = %d\n", max2
, num2
); // 10, 6
return 0;
}
CiNpbmNsdWRlIDxzdGRpby5oPgoKdm9pZCBzYWlkYWlfbnVtKGludCBrb3N1dSwgaW50IGRhdGFbXSwgaW50ICptYXgsIGludCAqbWF4X251bSkgewogICAgaW50IGN1cnJlbnRfbWF4ID0gZGF0YVswXTsgLy8g5Yid5pyf5pyA5aSn5YCkIChHUjApCiAgICBpbnQgY291bnQgPSAxOyAgICAgICAgICAgICAvLyDliJ3mnJ/jga7lgIvmlbAgKEdSNSkKICAgIGludCBjb3VudGVyID0gMDsgICAgICAgICAgIC8vIOODq+ODvOODl+OCq+OCpuODs+OCvyAoR1I2KQoKICAgIHdoaWxlIChjb3VudGVyIDwga29zdXUpIHsKICAgICAgICBkYXRhID0gZGF0YSArIDE7ICAgICAgIC8vIOmFjeWIl+ODneOCpOODs+OCv+OCkuasoeOBuCAoTEFEIEdSMiwgMSwgR1IyKQogICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMTsgLy8g44Kr44Km44Oz44K/ICsgMSAoTEFEIEdSNiwgMSwgR1I2KQoKICAgICAgICBpZiAoKmRhdGEgPiBjdXJyZW50X21heCkgewogICAgICAgICAgICAvLyDjgZPjgozjgb7jgafjgojjgorlpKfjgY3jgYTlgKTjgYzopovjgaTjgYvjgaPjgZ/loLTlkIgKICAgICAgICAgICAgY3VycmVudF9tYXggPSAqZGF0YTsgLy8g5pyA5aSn5YCk44KS5pu05pawIChMRCBHUjAsIEdSNykKICAgICAgICAgICAgY291bnQgPSAxOyAgICAgICAgICAvLyDlgIvmlbDjgpIgMSDjgavjg6rjgrvjg4Pjg4ggKExBRCBHUjUsIDEpCiAgICAgICAgfSBlbHNlIGlmICgqZGF0YSA9PSBjdXJyZW50X21heCkgewogICAgICAgICAgICAvLyDnj77lnKjjga7mnIDlpKflgKTjgajlkIzlgKTjgYzopovjgaTjgYvjgaPjgZ/loLTlkIgKICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDE7ICAvLyDlgIvmlbDjgpLjgqTjg7Pjgq/jg6rjg6Hjg7Pjg4ggKExBRCBHUjUsIDEsIEdSNSkKICAgICAgICB9CiAgICAgICAgLy8gKmRhdGEgPCBjdXJyZW50X21heCDjga7loLTlkIjjga/kvZXjgoLjgZvjgZrmrKHjga7opoHntKDjgbgKICAgIH0KCiAgICAqbWF4ID0gY3VycmVudF9tYXg7ICAgICAgICAgLy8g57WQ5p6c44KS5aSJ5pWw44G45pu444GN6L6844G/IChTVCBHUjAsIDAsIEdSMykKICAgICptYXhfbnVtID0gY291bnQ7ICAgICAgICAgICAvLyDlgIvmlbDjgpLlpInmlbDjgbjmm7jjgY3ovrzjgb8gKFNUIEdSNSwgMCwgR1I0KQogICAgcmV0dXJuOwp9CgppbnQgbWFpbih2b2lkKSB7CiAgICAvKiDphY3liJcxOiDopoHntKDmlbAgNyAoa29zdXUgPSA2KSAtIDMw44GMM+WAi+WtmOWcqCAqLwogICAgaW50IGFycmF5MVtdID0gezEwLCAxNSwgMzAsIDE1LCAzMCwgMzAsIDd9OwogICAgaW50IG1heDEsIG51bTE7CgogICAgLyog6YWN5YiXMjog6KaB57Sg5pWwIDYgKGtvc3V1ID0gNSkgLSDlhajjgablkIzlgKQgMTDjgYw25YCL5a2Y5ZyoICovCiAgICBpbnQgYXJyYXkyW10gPSB7MTAsIDEwLCAxMCwgMTAsIDEwLCAxMH07CiAgICBpbnQgbWF4MiwgbnVtMjsKCiAgICAvKiDjgrXjg5bjg6vjg7zjg4Hjg7PlkbzjgbPlh7rjgZcgKEdSMeOAnEdSNCDjgavlvJXmlbDjgpLjgrvjg4Pjg4gpICovCiAgICBzYWlkYWlfbnVtKDYsIGFycmF5MSwgJm1heDEsICZudW0xKTsKICAgIHNhaWRhaV9udW0oNSwgYXJyYXkyLCAmbWF4MiwgJm51bTIpOwoKICAgIC8qIOe1kOaenOeiuuiqje+8iENBU0wyMDAw44Oh44Oi44Oq44O844OA44Oz44OX55S76Z2i44Gn56K66KqN77yJICovCiAgICBwcmludGYoIumFjeWIlzE6IOacgOWkp+WApCBNQVgxID0gJWQsIOWAi+aVsCBOVU0xID0gJWRcbiIsIG1heDEsIG51bTEpOyAvLyAzMCwgMwogICAgcHJpbnRmKCLphY3liJcyOiDmnIDlpKflgKQgTUFYMiA9ICVkLCDlgIvmlbAgTlVNMiA9ICVkXG4iLCBtYXgyLCBudW0yKTsgLy8gMTAsIDYKCiAgICByZXR1cm4gMDsKfQo=