Diskuze: Pole poli - calloc meni casti pole, ktere menit nema
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Zobrazeno 13 zpráv z 13.
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.
viz komentáře v
kódu
// 1) alokujes POLE POINTERU NA CHAR
// pokud je delkaRetezce = 3, pak alokujes 24 bytu
// 2) nastavíš 4. pointer v poli seznamStringu na nove alokovanou pamet
// (pokud poradi = 4)
seznamStringu[poradi] = (char**)calloc(delkaRetezce,sizeof(char*));
// protoze jsi nastavit hodnotu pointeru seznamStringu[poradi] na calloc
// mas tam ted NULL
// pres nasledujici prikazy se divas na adresu 0 ve svem datovem segmentu
// proto ty otazniky
seznamStringu[poradi][0]
seznamStringu[poradi][1]
seznamStringu[poradi][2]
Takže calloc nic nemění - ani nemůže - alokuje pamět a nastaví hodnoty
na 0.
Hodnotu proměnné si měníš sám, a protože se jedná o pointer a ten
pointer je nulový, máš velký problém 
ja to napsal spatne, omlouvam se, meni tyto chary:
seznamStringu[0][0]
seznamStringu[0][1]
seznamStringu[0][2]
neboli prvni "retezec"
jak už říkal coels... pleteš si char a char* a není ani jisté, jestli víš, co dělá calloc. Celé se mi to nezdá. Kdybys hodil větší kus kódu, tak bysme ti mohli líp poradit.
Zadani je takove, ze se programu zada string nejake delky (ale max. 8 ) a program vypise vsechny permutace, ktere budou serazene.
Algoritmus ohledne permutaci jsem bral odtud:
http://www.geeksforgeeks.org/…iven-string/
A ja ho trochu pozmenil, aby vyhovoval zadani (nevypisu permutace hned, ale nejprv je dam do pole a pak je setridim)
void swap (char *x, char *y)
{
char temp;
temp = *x;
*x = *y;
*y = temp;
}
int k=0;
void permute(char *a, int i, int n)
{
int j;
if (i == n) {
seznamStringu[poradi] = calloc(delkaRetezce,sizeof(char*));
strncpy(seznamStringu[poradi],a,delkaRetezce);
poradi++;
}
else
{
for (j = i; j <= n; j++)
{
swap((a+i), (a+j));
permute(a, i+1, n);
swap((a+i), (a+j));
}
}
}
poradi - globalni promenna typu int, po kazdem zapsani retezce do pole se zvetsi o 1.
delkaRetezce - delka jednoho retezce
delkaPole - delka pole - neboli max pocet retezcu, ktere se vejdou do pole, jelikoz se jedna o permutace, tak je to delkaRetezce! (faktorial)
Jak alokuješ seznamStringu[] ? Není náhodou tahle proměnná neinicializovaná?
Jeste jsem nedodal main a v mainu inicializovana je:
int main()
{
int i = 0; //cyklova prom
int j = 0; //cyklova prom
char retezec[8]; //retezec vstupu
scanf("%s",retezec); //nacteni vstupu
//strcopy(retezec,tmp);
int delka = strlen(retezec); //prirazeni delky
delkaRetezce = delka; //delka retezce globalne
delkaPole = fact(delka); //delka pole globalne
//printf("delkaPole %i",delkaPole);
seznamStringu=calloc(delkaPole,sizeof(char)); //alokace pole
printf("Delka retezce: %i\n",delka);
printf("Vstupni retezec: \"%s\"\n",retezec);
for(i = 0; i < delka - 1; i++){ //serazeni retezce
for(j = 0; j < delka - i - 1; j++){
if(retezec[j+1] < retezec[j]){
int tmp = retezec[j + 1];
retezec[j + 1] = retezec[j];
retezec[j] = tmp;
}
}
}
permute(retezec, 0, delka-1);
printf("%s\n",seznamStringu[0] ); //permutace pole
// qsort(seznamStringu,sizeof(seznamStringu)/sizeof(seznamStringu[0]),sizeof(seznamStringu[0]), strcmp);
for(i=0;i<delkaPole;i++) { //vypis pole
printf("%s\n",seznamStringu[i]);
}
return 0;
}
Pak tam mam jeste metodu fact - coz je rekurzivni faktorial.
edit: v C to vlastne neni metoda, ale funkce.
// alokuje fact(delka) bytu
seznamStringu=calloc(delkaPole,sizeof(char));
// alokuje fact(delka) pointeru na byte
seznamStringu=calloc(delkaPole,sizeof(char *));
Jinak řečeno, alokuješ 8x méně paměti, než potřebuješ.
Dekuji, je to tak.
Jak jeste seradim pole? Zkousel jsem:
qsort(seznamStringu,sizeof(seznamStringu)/sizeof(seznamStringu[0]),sizeof(seznamStringu[0]), strcmp);
ale nefunguje.
napr. kdyz vlozim permutaci aba tak do pole to vyhodi:
aab
aba
aab
aba
baa
baa
ale potrebuji to seradit, aby to bylo:
aab
aab
aba
aba
baa
baa
nejak to nechce seradit (coz je divne, prave tenhle tvar qsort radí i jinde), nejak to prohodi ty retezce, ale netusim podle jakeho pravidla, napr misto prvnich 4 permutaci (retezec delky 4) ve tvaru:
aabb
aabb
aabb
aabb
........
to vypise:
aabb
baba
aabb
bbaa
........
int compare (const void *a, const void *b)
{
const char **x = (const char **)a;
const char **y = (const char **)b;
return strcmp(*x, *y);
}
qsort(seznamStringu, delkaPole, sizeof(char *), compare);
Dekuji moc, kontrolni system to vzal. Zkousel jsem pred tim bubblesort, ale
to bylo na nej moc pomaly a vedel jsem o tom qsortu, ale nevedel jsem jak 
Zobrazeno 13 zpráv z 13.
