Diskuze: Tisk pole

C++ C a C++ Tisk pole

Avatar
švrčajs
Člen
Avatar
švrčajs:

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
Redaktor
Avatar
Martin Dráb:

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  +1 3.3.2015 22:22
2 + 2 = 5 for extremely large values of 2
Avatar
Odpovídá na Martin Dráb
Libor Šimo (libcosenior):

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
Filip Šohajek
Redaktor
Avatar
Odpovídá na Libor Šimo (libcosenior)
Filip Šohajek:

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

 
Nahoru Odpovědět 7.3.2015 13:18
Avatar
Filip Šohajek
Redaktor
Avatar
Odpovídá na Jan Vargovský
Filip Šohajek:

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
Avatar
Martin Dráb
Redaktor
Avatar
Odpovídá na Filip Šohajek
Martin Dráb:

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  +1 7.3.2015 13:40
2 + 2 = 5 for extremely large values of 2
Avatar
Jan Vargovský
Redaktor
Avatar
Jan Vargovský:

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

Ď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):

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

Nahoru Odpovědět 7.3.2015 13:51
:)
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.