Diskuze: Externí naplnění pole
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 4 zpráv z 4.
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.
No, ačkoliv mé znalosti C++ nejsou nikterak vysoké, tak pokud si dobře
pamatuju, tak při předávání pointeru na pole, musíme programu říct, jak
je to pole velké.
Tudíž správné předání pole do metody by mělo vypadat nějak takhle:
void zpracujPole(int (*pole)[4])
Tohle pořád neřeší problém uvnitř metody, kdy kvůli rozdílné
prioritě operátorů říkáš "První sáhni do pole, vezmi ten prvek, a na
jeho adresu zapiš dané číslo".
Ty potřebuješ provést první dereferenci toho pole a až pak přistoupit na
jeho prvek.
(*pole)[i] = i + 1;
A tenhle kód by měl fungovat přesně tak jak si představuješ.
Díky, problém vyřeše. Nemusel jsem ale zadávat přimo velikost pole. Zde je řešení.
#include <stdio.h>
void zpracujPole(int (*pole)[])
{
int i;
for(i = 0; i < 4; i++){
(*pole)[i] = i + 1;
}
}
void vypisPole(int pole[], int delka)
{
int i;
for(i = 0; i < delka; i++) {
printf("%d\n", pole[i]);
}
}
int main(void)
{
int pole[4];
zpracujPole(&pole);
vypisPole(pole, 4);
return 0;
}
/* Pole jako argument funkce, zpusob vypisu */
#define _CRT_SECURE_NO_WARNINGS
#include <stdio.h>
#define SIZE 4
void zpracujPole1(int p[], int vel);
void zpracujPole2(int p[], int vel);
void zpracujPole3(int *p, int vel);
void zpracujPole4(int *p, int vel);
void vypisPole1(int p[], int vel);
void vypisPole2(int p[], int vel);
void vypisPole3(int *p, int vel);
void vypisPole4(int *p, int vel);
int main(int argc, char *argv[]){
int pole[SIZE];
zpracujPole1(pole, SIZE);
zpracujPole2(pole, SIZE);
zpracujPole3(pole, SIZE);
zpracujPole4(pole, SIZE);
vypisPole1(pole, SIZE);
vypisPole2(pole, SIZE);
vypisPole3(pole, SIZE);
vypisPole4(pole, SIZE);
return 0;
}
// Parametr zadany jako bezrozmerne pole, pole nacteno indexaci ukazatele
void zpracujPole1(int p[], int vel){
int i;
for (i = 0; i < vel; i++){
p[i] = i + 1;
}
}
// Parametr zadany jako bezrozmerne pole, pole nacteno pomoci ukazatelove aritmetiky
void zpracujPole2(int p[], int vel){
int i;
for (i = 0; i < vel; i++){
*(p + i) = i + 1;
}
}
// Parametr zadany jako ukazatel, pole nacteno indexaci ukazatele
void zpracujPole3(int *p, int vel){
int i;
for (i = 0; i < vel; i++){
p[i] = i + 1;
}
}
// Parametr zadany jako ukazatel, pole nacteno pomoci ukazatelove aritmetiky
void zpracujPole4(int *p, int vel){
int i;
for (i = 0; i < vel; i++){
*(p + i) = i + 1;
}
}
// Vypis pole indexaci ukazatele, argument bezrozmerne pole
void vypisPole1(int p[], int vel){
int i;
for (i = 0; i < vel; i++){
printf("%d\n", p[i]);
}
}
// Vypis pole pomoci ukazatelove aritmetiky, argument bezrozmerne pole
void vypisPole2(int p[], int vel){
int i;
for (i = 0; i < vel; i++){
printf("%d\n", *(p + i));
}
}
// Vypis pole indexaci ukazatele, argument ukazatel
void vypisPole3(int *p, int vel){
int i;
for (i = 0; i < vel; i++){
printf("%d\n", p[i]);
}
}
// Vypis pole pomoci ukazatelove aritmetiky, argument ukazatel
void vypisPole4(int *p, int vel){
int i;
for (i = 0; i < vel; i++){
printf("%d\n", *(p+i));
}
}
Chyba v prvním příspěvku, proč to nefunguje, je ta, že funkci nepředáváte ukazatel na pole. To co předáváte funkci je totiž pole ukazatelů na typ int, což je něco jiného.
Prototyp funkce ve druhém příspěvku není v pořádku, pole lze předat funkci třemi způsoby:
Doporučuji 2. a 3. způsob spolu s velikostí pole jako další parametr.
Program ve třetím příspěvku, ač vypisuje očekávaný obsah pole, není syntakticky v pořádku. Takto se pole jako parametr funkci nepředává. Navíc funkce zpracujPole() není obecná, chybí velikost pole a ve funkci jsou tak hodnoty které jsou definovány mimo funkci. Volání funkce zpracujPole() taktéž není v pořádku. To co se předává funkci jako parametr je ukazatel na pole a ukazatel na pole je vždy jméno pole bez indexu. Referenční operátor & tam být nemá. Správné volání a předávání pole a jeho velikosti jako parametru funkci máte ve funkci vypisPole(). Další způsoby předávání pole jako parametru funkci a druhy výpisu, viz. kód.
PS: Ještě jedna drobnost, doporučení. Velikost pole zadávejte jako konstantu pomocí direktivy preprocesoru #define. Vyhnete se tak mnoha nepříjemnostem při ladění větších aplikací.
Zobrazeno 4 zpráv z 4.
