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.
Člen
Zobrazeno 7 zpráv z 7.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
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.