NOVINKA - Online rekvalifikační kurz Java programátor. Oblíbená a studenty ověřená rekvalifikace - nyní i online.
NOVINKA – Víkendový online kurz Software tester, který tě posune dál. Zjisti, jak na to!

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.

Aktivity
Avatar
Martin Hampel:23.2.2018 20:41

Zdravím,
mám za úkol vytvořit tuto fci - void vypis(const int , unsigned),
přičemž první parametr získám returnem z této fce - int
nezaporna(const int, unsigned).
Tedy hledám způsob, jak překonvertuju int
na const int**, tak abych ji mohl použít pro parametr první fce.
Předem díky za odpovědi

 
Odpovědět
23.2.2018 20:41
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Martin Hampel
DarkCoder:23.2.2018 22:41

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) {
}
Nahoru Odpovědět
23.2.2018 22:41
"I ta nejlepší poučka postrádá na významu, není-li patřičně předána." - DarkCoder
Avatar
Odpovídá na DarkCoder
Martin Hampel:23.2.2018 23:00

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;
}
 
Nahoru Odpovědět
23.2.2018 23:00
Avatar
Odpovídá na Martin Hampel
Matúš Olejník:24.2.2018 10:35

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;
}
Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
Nahoru Odpovědět
24.2.2018 10:35
/* I am not sure why this works but it fixes the problem */
Avatar
Odpovídá na Matúš Olejník
Martin Hampel:24.2.2018 11:10

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**.

 
Nahoru Odpovědět
24.2.2018 11:10
Avatar
Honza Bittner
Tvůrce
Avatar
Odpovídá na Martin Hampel
Honza Bittner:24.2.2018 12:09

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š. :-)

Editováno 24.2.2018 12:09
Nahoru Odpovědět
24.2.2018 12:09
FIT ČVUT alumnus :-) Sleduj mě na https://twitter.com/tenhobi a ptej se na cokoli na https://github.com/tenhobi/ama.
Avatar
Odpovídá na Honza Bittner
Martin Hampel:24.2.2018 12:40

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

 
Nahoru Odpovědět
24.2.2018 12:40
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 7 zpráv z 7.