Skip to content
Snippets Groups Projects
Commit 7d7f946e authored by Michal Sojka's avatar Michal Sojka
Browse files

lab5: Rozšíření šablon pro načítání vstupu (MacOS, Rust), etc.

parent 3aca960f
No related branches found
No related tags found
No related merge requests found
Pipeline #55057 passed
......@@ -24,7 +24,7 @@ Pro toto cvičení budete potřebovat znalosti o tom
Potřebná teorie byla vyložena na přednášce, včetně ukázek použití funkcí
knihovny [`pthread`][threads]. Před cvičením je doporučeno podívat se na manuálové stránky
potřebných funkcí, zejména
potřebných funkcí, zejména:
- [`pthread_create`][thread_create], [`pthread_join`][thread_join],
- [`pthread_mutex_init`][mutex_init], [`pthread_mutex_destroy`][mutex_destroy],
[`pthread_mutex_lock`][mutex_lock], [`pthread_mutex_unlock`][mutex_lock]
......@@ -55,9 +55,9 @@ Implementujte v jazyce C, C++, nebo Rust vícevláknový program `prod-cons` spl
- Hodnota `N` bude zadávána jako parametr při spouštění programu (`argv[1]`).
Pokud žádný parametr nebude zadán, bude `N` rovno `1`.
- Předpokládejte, že `N` bude v rozmezí 1 až počet CPU v systému
(`sysconf(_SC_NPROCESSORS_ONLN)`). Pokud bude zadána jiná hodnota, program
skončí s návratovým kódem `1`.
- `N` musí být v rozmezí 1 až počet CPU v systému
(`sysconf(_SC_NPROCESSORS_ONLN)`). Pokud bude zadána jiná hodnota,
program skončí s návratovým kódem `1`.
- Producent bude splňovat následující:
......@@ -67,7 +67,7 @@ Implementujte v jazyce C, C++, nebo Rust vícevláknový program `prod-cons` spl
od sebe vždy odděleny koncem řádku (`\n`). Na konci vstupu může, ale
nemusí být konec řádku (`\n`).
Validní vstup tedy může vypadat například takto:
Platný vstup tedy může vypadat například takto:
```
20 foo
......@@ -80,17 +80,60 @@ Implementujte v jazyce C, C++, nebo Rust vícevláknový program `prod-cons` spl
znamená, že **slovo musíte mít v paměti uloženo jen jednou**. Na víc
kopií nemusíte mít dost paměti.
K načítání příkazů doporučujeme v C/C++ použít následující kód:
```C
int ret, x;
char *text;
while ((ret = scanf("%d %ms", &x, &text)) == 2) {
...
}
```
Direktiva `%ms` (malloc string) způsobí, že `scanf` dynamicky alokuje
takové množství paměti, které je potřeba pro uložení načítaného slova.
Nezapomeňte potom tuto paměť uvolnit funkcí `free()`.
K načítání příkazů doporučujeme použít následující kód:
{{< tabs "input" >}}
{{< tab "C/C++ on GNU/Linux" >}}
```C
int ret, x;
char *text;
while ((ret = scanf("%d %ms", &x, &text)) == 2) {
...
}
```
Direktiva `%ms` (malloc string) způsobí, že `scanf` dynamicky alokuje
takové množství paměti, které je potřeba pro uložení načítaného slova.
Nezapomeňte potom tuto paměť uvolnit funkcí `free()`.
{{< /tab >}}
{{< tab "C/C++ on MacOS" >}}
MacOS nepodporuje u funkce `scanf()` direktivu `%ms`, takže načítání
textu neznámé velikosti je o něco komplikovanější:
```C
while (!feof(stdin)) {
int x;
char *text = NULL;
size_t sz;
if (scanf("%d ", &x) != 1)
break;
if (getline(&text, &sz, stdin) == -1)
break;
text[strcspn(text, "\r\n")] = 0;
...
}
```
Nezapomeňte, že paměť alokovanou funkcí `getline()` pro `text` je
potřeba uvolnit funkcí `free()`.
{{< /tab >}}
{{< tab "Rust" >}}
```rust
for line in std::io::stdin().lock().lines().map(|l| l.unwrap()) {
match line.split_once(' ') {
Some((num, word)) => {
let x = num.parse::<usize>()?;
// ....
}
None => {
// ...
}
};
}
```
{{< /tab >}}
{{< /tabs >}}
- Pokud bude zadán neplatný příkaz (tj. neodpovídající předchozímu bodu),
program skončí s návratovým kódem `1`.
......@@ -111,7 +154,7 @@ Implementujte v jazyce C, C++, nebo Rust vícevláknový program `prod-cons` spl
- Pro každou vyzvednutou položku konzument vypíše na standardní výstup
řetězec “`Thread n: slovo slovo slovo...`”, kde `n` je číslo konzumenta
(pořadí vytvoření konzumenta v rozsahu `1-N`) a slovo se opakuje X-krát
(pořadí vytvoření konzumenta v rozsahu 1–`N`) a slovo se opakuje X-krát
(informace od producenta). Tento řetězec bude celý na jedné řádce
ukončené `\n`.
......@@ -130,7 +173,7 @@ Implementujte v jazyce C, C++, nebo Rust vícevláknový program `prod-cons` spl
- Žádné čekání ve vašem programu by nemělo být implementováno formou pollingu
(periodická kontrola, že se něco stalo).
- Program před ukončením dealokuje všechnu dynamicky alokovanou paměť.
- Program před ukončením uvolní všechnu dynamicky alokovanou paměť.
Do odevzdávacího systému nahrajte:
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment