Diskuze: konverze int** na const int**
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.


Zobrazeno 7 zpráv z 7.
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.


Z tvého popisu není patrný co funkce mají dělat a tak si něco vymyslím. Smyslem kódu je pouze ukázka způsobu napojení dvou funkcí na sebe vyplývající z tvého zadání. Tak např.:
void main(void) {
int vysledek = nezaporna(4, 8);
vypis(vysledek, 5);
}
int nezaporna(const int i, unsigned u) {
return i;
}
void vypis(const int i, unsigned u) {
}
Promiň, nějak jsem zapomněl přibalit kód a vypadli mi hvězdičky. Funkce mám naprogramované, proto jsem hodil jen prototypy.
void vypis(const int**, unsigned);
int** nezaporna(const int**, unsigned);
int main()
{
//zadani
const int _A1[]={8,6,-6,2,-3,0,9,-1,-1},_A2[]={7,5,3,9,2,-9,-9,4},_A3[]={6,3,-3,8,8,-4,2},_A4[]
{9,5,-8,-8,-8,2,-2,4,3,4};
const int *A[]={_A1,_A2,_A3,_A4};
const unsigned DelkaA=sizeof A/sizeof *A;
//muj kod
int** mojePole = nezaporna(A, delkaPole);
vypis(mojePole, DelkaA);
return 0;
}
Keďže je to zadanie také aké je teda každé pole má rozličný počet
prvkov a potom posielaš dvojrozmerné pole do funkcie cez pointer tak nie je
možné vo funkcii zistiť len z pointera koľko prvkov má dané pole. Preto
musíš tento údaj tiež poslať do funkcie. Keďže výstupom tvojej funkcie
je int** hádam že v nej vytváraš 2D pole kde pre každé pole uložíš
záporné hodnoty. Neviem či ti to funguje alebo ako to robíš keďže
nepoznáš dĺžky tých polí tak som narýchlo napísal takéto niečo, mohol
som to spraviť aj cez štruktúry ale chcel som takto pomocou pointerov 
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
void vypis(int** array2D, unsigned length, int* newRowLengths) {
int i, j;
for (i = 0; i < length; i++) {
printf("Negative numbers of array _A%d are: ", i);
if (newRowLengths[i] == 0) {
printf("none\n");
}
else {
for (j = 0; j < newRowLengths[i]; j++) {
printf("%d ", array2D[i][j]);
}
printf("\n");
}
}
}
int **nezaporna(const int** array2D, unsigned length, int* oldRowLengths, int* newRowLengths) {
int i, j;
int **arrayOfNegativeNumbers;
int actRowLength = 0;
//alokujeme miesto pre dany pocet poli
arrayOfNegativeNumbers = (int**)malloc(length * sizeof(int*));
for (i = 0; i < length; i++) {
//alokujeme miesto pre pocet poloziek v prvom poli (ak by boli vsetky zaporne)
arrayOfNegativeNumbers[i] = (int*)malloc(oldRowLengths[i] * sizeof(int));
for (j = 0; j < oldRowLengths[i]; j++) {
if (array2D[i][j] < 0) {
arrayOfNegativeNumbers[i][actRowLength] = array2D[i][j];
actRowLength++;
}
}
if (actRowLength == 0) {
arrayOfNegativeNumbers[i] = (int *)realloc(arrayOfNegativeNumbers[i], 1);
}
//ulozime dlzku prveho pola
newRowLengths[i] = actRowLength;
actRowLength = 0;
}
return arrayOfNegativeNumbers;
}
int main() {
//zadani
const int _A1[] = { 8, 6, -6, 2, -3, 0, 9, -1, -1 };
const int _A2[] = { 7, 5, 3, 9, 2, -9, -9, 4 };
const int _A3[] = { 6, 3, -3, 8, 8, -4, 2 };
const int _A4[] = { 9, 5, -8, -8, -8, 2, -2, 4, 3, 4 };
const int* A[] = { _A1, _A2, _A3, _A4 };
//sizeof A = 16, size of *A = 4
const unsigned lengthA = sizeof A / sizeof *A;
int oldRowLengths[4], newRowLengths[4];
oldRowLengths[0] = sizeof _A1 / sizeof _A1[0];
oldRowLengths[1] = sizeof _A2 / sizeof _A2[0];
oldRowLengths[2] = sizeof _A3 / sizeof _A3[0];
oldRowLengths[3] = sizeof _A4 / sizeof _A4[0];
//muj kod
int** mojePole = nezaporna(A, lengthA, oldRowLengths, newRowLengths);
vypis(mojePole, lengthA, newRowLengths);
getchar();
getchar();
return 0;
}
Díky, tvůj kód mě nakopl správným směrem - nakonec jsem to udělal v C, které mi dovolí předat funkci
void vypis(const int**, unsigned);
pole typu int**.
Nějak nemám pocit, i přes to, že je označena akceptovaná odpověď, že
skutečně správně chápeš co a jak funguje, už jen podle otázky
(překonvertovat int ** na const int ** a odpovědi "v
C, které mi dovolí předat funkci ... pole typu int **", tak jen dodám
komentář:
Kokrétně si nejsem jist, zda-li víš, jak se chová
const.
Mějme 2 funkce:
void foo(int **)
void bar(const int **)
Obě se chovají naprosto stejně, avšak funkce bar u svého 1. parametru
vnějšímu světu říká, že tento parametr nebude nijak
modifikován, tj. že ho bere jako read-only. Nic více v tom skryto
není a tedy otázka
"Tedy hledám způsob, jak překonvertuju int ** na const int**" je
prostě wrong, páč nic konvertovat nepotřebuješ. 
Co to je const a jak funguje vím. Na stack overflow jsem už zjistil, že v
C++ typ** na const typ** je nelegální operace, takže se můžu snažit jak
chci, ale nepřekonvertuju to.
https://stackoverflow.com/…a-pointer-to
Zobrazeno 7 zpráv z 7.