Diskuze: extern array[variable]
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 6 zpráv z 6.
K personalizaci obsahu a reklam, poskytování funkcí sociálních médií a analýze naší návštěvnosti využíváme soubory cookie. Informace o tom, jak náš web používáte, sdílíme se svými partnery pro sociální média, inzerci a analýzy. Partneři tyto údaje mohou zkombinovat s dalšími informacemi, které jste jim poskytli nebo které získali v důsledku toho, že používáte jejich služby.
Používáme nezbytné cookies pro fungování webu a s tvým souhlasem také analytické a marketingové cookies.
Zajišťují základní funkce, bezpečnost a služby, které sis vyžádal. Nelze je vypnout.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| ITnetwork | ITnetwork | Provoz webu, relace, přihlášení a uložení nastavení cookies. | PHPSESSID, auth_token, sid, itn_consent_impression, __Host-itn_consent | Relace až 1 rok |
| Google Tag Manager | Správa značek a načítání měřicích nástrojů webu. | Žádné | Neukládá se | |
| Google Fonts | Načítání typografie webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google Hosted Libraries | Načítání potřebných knihoven a stylů webu. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele | |
| Google reCAPTCHA | Ochrana formulářů a webu před zneužitím. | _GRECAPTCHA, rc::a, rc::b, rc::c, rc::f | Relace až 180 dní | |
| YouTube | Přehrávání vloženého video obsahu. | localStorage, IndexedDB; cookies after playback interaction | Relace až trvalé úložiště | |
| Vimeo | Vimeo | Přehrávání vloženého video obsahu. | __cf_bm, _cfuvid, vuid, localStorage, IndexedDB | Relace až 2 roky |
| Facebook Login | Meta | Přihlášení pomocí účtu třetí strany. | Úložiště řízené poskytovatelem | Relace až 1 rok |
| GoPay | GoPay | Zpracování uživatelem vyžádané platby. | Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
Pomáhají nám porozumět používání webu a zlepšovat ho.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Analytics 4 | Měření návštěvnosti a používání webu. | _ga, _ga_* | Až 2 roky | |
| Microsoft Clarity | Microsoft | Měření návštěvnosti a používání webu. | _clck, _clsk, _cltk | Relace až 1 rok |
Slouží k měření kampaní, personalizaci reklamy a marketingové komunikaci.
| Služba | Poskytovatel | Účel | Cookies a úložiště | Doba uložení |
|---|---|---|---|---|
| Google Ads | Měření kampaní, reklama a remarketing. | _gcl_au, _gcl_ls | Relace až 90 dní | |
| Meta Pixel | Meta | Měření kampaní, reklama a remarketing. | _fbp, _fbc, localStorage | Až 90 dní |
| Sklik | Seznam.cz | Měření kampaní, reklama a remarketing. | retargeting, sid, szn:* | Relace až trvalé úložiště |
| LinkedIn Insight | Měření kampaní, reklama a remarketing. | bcookie, li_gc, lidc, __cf_bm | Relace až 1 rok | |
| Ecomail | Ecomail.cz | Měření kampaní, reklama a remarketing. | ecmid, Úložiště řízené poskytovatelem | Dle podmínek poskytovatele |
| Atribuce kampaní ITnetwork | ITnetwork | Přiřazení návštěvy a objednávky ke kampani. | campaign_clid[*], user_session_context | Až 1 rok |
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Takto vytvářet pole o velikosti rovno hodnotě zadané proměnné nelze.
Správně by bylo scanf("%d", &velikost_pole);
Pokud bychom chtěli vytvořit pole staticky, je třeba, aby rozměr pole byl konstantní výraz známý v době překladu.
Lze použít instrukci preprocesoru #define nebo výčtový typ enum. Nelze použít modifikátor typu const.
To ovšem nemá smysl, pokud chceš, aby byl rozměr pole určen za pomoci zadávané hodnoty proměnné.
rozměr pole byly deklarovány jako globální, tedy vně všech funkcí.
Jak používat pole v jiných modulech ukazuje následující příklad.
Mějme tři soubory - hlavní modul main.c, druhý modul func.c a třetí modul hlavičkový soubor func.h. V hlavním modulu jsou globálně deklarovány dvě proměnné, size a ukazatel na int pro dynamicky vytvořené pole. Poté je požadováno zadání celočíselné hodnoty představující rozměr pole. Následně je dynamicky vytvořeno pole o velikosti zadané hodnotě pomocí funkce malloc(). Poté jsou volány dvě funkce z modulu func.c (fill_arr() a print_arr()). Naplnění pole hodnotami rovno danému indexu a vypsání velikosti pole (pro kontrolu) a obsahu pole. První funkce přebírá parametry, druhá pro ukázání použití proměnných deklarovaných z jiného modulu (main.c), záměrně bez parametrů. Modul func.h obsahuje odkazy na použití proměnných z jiného modulu za pomocí klíčového slova extern a prototypy funkcí definovaných v modulu func.c. Při předání řízení programu funkci print_arr() jsou využívány proměnné definované v hlavním modulu main.c. Nakonec je uvolněna alokovaná paměť pomocí funkce free().
main.c
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#include <stdlib.h>
#include "func.h"
int size;
int* arr = NULL;
int main(void) {
printf("Zadej rozmer pole: ");
scanf("%d", &size);
if (size < 1) exit(1);
arr = (int*)malloc(size * sizeof(int));
if (!arr) exit(2);
fill_arr(arr, size);
print_arr();
free(arr);
arr = NULL;
return 0;
}
func.c
#include <stdio.h>
#include "func.h"
void fill_arr(int* array, int size_array) {
for (int i = 0; i < size_array; i++) *(array + i) = i;
}
void print_arr(void) {
printf("%d - ", size);
for (int i = 0; i < size; i++) printf("%d ", *(arr + i));
}
func.h
#ifndef FUNC_H
#define FUNC_H
extern int size;
extern int *arr;
void fill_arr(int* array, int size_array);
void print_arr(void);
#endif
Mohu se jeste zeptat ?
Proc mi funguje kus kodu
int *pole_cisel = NULL;
pole_cisel = ((int *) malloc(velikost_pole * sizeof(int)));
if (!pole_cisel) exit(1);
ale tento ne
if ((pole_cisel = ((int *) malloc(velikost_pole * sizeof(int)))) == NULL){
fprintf(stderr, "málo místa\n");
exit(1);
}
v prvnim radku je podtrzena promenna pole_cisel a vscode mi k tomu dodava:
assignment to 'int' from 'int' makes pointer from integer without a cast [-Wint-conversion] gcc
I druhý úryvek kódu je naprosto v pořádku a to za předpokladu, že si při modifikaci kódu nechtěně nepozměnil datové typy proměnných. VSCode nepoužívám a tak pro lepší analýzu sem připoj celý kód, včetně deklarací i hlavičkových souborů.
Popřípadě si ověř správnou funkčnost a chování překladače na následujícím kódu:
#include <stdlib.h>
int main(void) {
int* val = NULL;
if ((val = (int*)malloc(sizeof(int))) == NULL) exit(1);
free(val);
val = NULL;
return 0;
}
Po vypnuti notebooku a opetovnem zapnuti hlaska zmizela, takze jeste neumim pracovat s IDE.
Zobrazeno 6 zpráv z 6.