Vydělávej až 160.000 Kč měsíčně! Akreditované rekvalifikační kurzy s garancí práce od 0 Kč. Více informací.
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: Tisk pole

Aktivity
Avatar
švrčajs
Člen
Avatar
švrčajs:3.3.2015 22:14

Zdravím, mám takovou menší úlohu, kde se programu předá vícerozměrné pole, funkce sečte jednotlivé řádky a vrátí to v jednorozměrném poli. Mám funkci na výpis toho jednorozměrného pole(TiskPole), ale když to spustím, tak to spadne ohledně nepovoleného přístupu. Nekoukl by mi na to někdo ? :D

#include "stdafx.h"

#define pocet_sloupcu 4
#define pocet_radku 3
int *suma_radku(int prvky[][4], int radku)
{
        int i = 0;
        int j = 0;
        int suma = 0;
        int vysledek[pocet_radku];
        for (i; i < pocet_radku; i++)
        {
                for (j; j < pocet_sloupcu; j++)
                {
                        suma += prvky[i][j];

                }
                vysledek[i] = suma;
                suma,j = 0;
        }
        return vysledek;
}

void TiskVicerozmernePole(int pole[][4])
{
        int i = 0;
        int j = 0;

        printf("Vstup: \n");
        for (i; i < pocet_radku; i++)
        {
                for (j; j < pocet_sloupcu; j++)
                {
                        printf("%i  ", pole[i][j]);

                }
                printf("\n");
                j = 0;
        }

}

void TiskPole(int pole[])
{
        printf("Suma radku: \n");
        int i = 0;
        for (i; i < pocet_radku; i++)
        {
                printf("%i ", pole[i]);
        }
        printf("\n");
}

int _tmain(int argc, _TCHAR* argv[])
{
        int data[pocet_radku][pocet_sloupcu] = {{13, 14, 15, 16}, { 17, 18, 19, 20 }, { 21, 22, 23, 24 }};

        TiskVicerozmernePole(data);
        TiskPole(*suma_radku(data, pocet_radku));



        system("pause");


        return 0;
}
 
Odpovědět
3.3.2015 22:14
Avatar
Martin Dráb
Tvůrce
Avatar
Martin Dráb:3.3.2015 22:22

Ahoj,

při stčítání řádků ukládáš součty do pole vysledek, které deklaruješ jako:

int vysledek[pocet_radku];

Následně jej vracíš volajícímu. Takováhle deklarace ti vytvoří pole jako lokální proměnnou, které se alokují na zásobníku. To znamená, že jakmile se dostaneš ven z funkce (suma_radku skončí), tato proměnná de facto zanikne.

Nejjednodušším řešením je pole vysledek alokovat na haldě (přes funkci malloc). Pak po návratu z funkce bude stále existovat a tvůj problém by už neměl nastávat (kód jsem nezkoumal do té míry, abych ti řekl, zda nenastane nějaký jiný problém... ve vícerozměrných polích v C se zas tak moc neorientuju).

P.S.
Slušní lidé proměnné alokovaná na haldě uvolňují (funkce free), když už jich nepotřebují.

Nahoru Odpovědět
3.3.2015 22:22
2 + 2 = 5 for extremely large values of 2
Avatar
švrčajs
Člen
Avatar
Odpovídá na Martin Dráb
švrčajs:3.3.2015 22:31

Díky moc

 
Nahoru Odpovědět
3.3.2015 22:31
Avatar
Odpovídá na Martin Dráb
Libor Šimo (libcosenior):7.3.2015 13:16

Predpokladám, že tá knižnica stdafx.h je súčasťou nejakého IDE, inakšie si neviem predstaviť, že ju nikto používa aj na jednoduché kódy.
Proste je mi divné, keď koder nevie čo vlastne includuje.

Nahoru Odpovědět
7.3.2015 13:16
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Odpovídá na Libor Šimo (libcosenior)
Neaktivní uživatel:7.3.2015 13:18

VS ti nedovolí zkompilovat program (mě nedovolil) bez stdafx.h

Nahoru Odpovědět
7.3.2015 13:18
Neaktivní uživatelský účet
Avatar
Jan Vargovský
Tvůrce
Avatar
 
Nahoru Odpovědět
7.3.2015 13:19
Avatar
Odpovídá na Jan Vargovský
Neaktivní uživatel:7.3.2015 13:25

Tak s VS jsem naposledy pracoval před asi 4mi roky, nevím co se změnilo.

Nahoru Odpovědět
7.3.2015 13:25
Neaktivní uživatelský účet
Avatar
Martin Dráb
Tvůrce
Avatar
Odpovídá na Neaktivní uživatel
Martin Dráb:7.3.2015 13:40

Hlavičkový soubor stdafx.h (ne, není to knihovna) slouží k vkládání (include) hlavičkových souborů, které se často nemění, takže mohou být předkompilované, což urychlí celkový překlad programu.

Předkompilované hlavičky není nutné používat, ale asi je budeš muset vypnout v nastavení projektu (někde v sekci C/C++).

Nahoru Odpovědět
7.3.2015 13:40
2 + 2 = 5 for extremely large values of 2
Avatar
Jan Vargovský
Tvůrce
Avatar
Jan Vargovský:7.3.2015 13:46

Ono stačí založit empty project a dopsat si main sám.

 
Nahoru Odpovědět
7.3.2015 13:46
Avatar
Libor Šimo (libcosenior):7.3.2015 13:50

Ďakujem, už som pochopil, dúfam správne, že tento súbor je preddefinovaný vo VS.

Nahoru Odpovědět
7.3.2015 13:50
Aj tisícmíľová cesta musí začať jednoduchým krokom.
Avatar
Luboš Běhounek Satik:7.3.2015 13:51

Precompiled header se ve vs zapíná/vypíná pro každý soubor zvlášť.

Nahoru Odpovědět
7.3.2015 13:51
https://www.facebook.com/peasantsandcastles/
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 11 zpráv z 11.