Skocz do zawartości
  • 👋 Witaj na MPCForum!

    Przeglądasz forum jako gość, co oznacza, że wiele świetnych funkcji jest jeszcze przed Tobą! 😎

    • Pełny dostęp do działów i ukrytych treści
    • Możliwość pisania i odpowiadania w tematach
    • System prywatnych wiadomości
    • Zbieranie reputacji i rozwijanie swojego profilu
    • Członkostwo w jednej z największych społeczności graczy

    👉 Dołączenie zajmie Ci mniej niż minutę – a zyskasz znacznie więcej!

    Zarejestruj się teraz

Tablica dwuwymiarowa w funkcji void


Rekomendowane odpowiedzi

Opublikowano

Witam,

 

chciałbym przekazać moją dwuwymiarową tablicę T do funkcji zerowanie. Niestety nie wiem jak to uczynić. Jakieś sugestie?

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <ctime>
#include <conio.h>
using namespace std;


void zerowanie (int a, int b, int c, int T[][])
{
    for(int i=0; i<=a-1;i++)
        for(int j=0; j<=b-1;j++)
        {
        T[i][j]=0;
        }
}
main()
{
    char znak, kroki;
    int a, b, c, index, index2, trafienia=0, strzaly=0, licznik;
    srand(time(NULL));
    do
    {
    do
    {
        if(a<=0 || b<=0)
        {
            cout << "\nLiczby musza byc wieksze od zera!\n";
        }
        cout << "Podaj pierwszy wymiar tablicy: ";
        cin>>a;
        cout << "\nPodaj drugi wymiar tablicy: ";
        cin>>b;
    }while(a<=0 || b<=0);
    int T[a][b];
    c=a*b;
    zerowanie(a,b,c,T)


return 0;
}

 

Opublikowano

1. brak ci int przed main

2. nie możesz zrobić w taki sposób tablicy: int T[a]; //nie znasz wskaznikow, nie mozesz bo rozmiar tablicy musi byc znany z czasem kompilacji by wiedzeic ile miejsca zarezerwowac

3. w funkcji zerowanie musisz mieć ustawioną wielkość tablicy (jeżeli wielowymiarowa to wszystkie pola oprócz pierwszego tablicy).

4. używaj preikrementacji (++i, ++j zamiast i++, j++)

 

5. masz 2 pętle

do

a zamknąłeś tylko jedną (po co ci dwie?)

brak ci nawiasa zamykającego funkcje main()

 

powiedz jaki chcesz zrobić program to ccoś pomożemy bo lepiej nowy kod napisac niż ten poprawiać

Opublikowano

To jest w c++ i chyba nie trzeba int przez funkcją main.

Ciągle nie dostałem odpowiedzi w jaki sposób można przekazać tę tablicę? Czy w ogóle jest to możliwe?

Opublikowano

owszem dostałeś, tylko musisz przeczytać co napisałem. wiedz że nie będziesz miał wielkości tablicy o takim rozmiarze jakim chcesz.

Opublikowano

To jest tylko fragment programu. Chodzi mi tylko o przekazanie tej tablicy o nic więcej. Nie da się zrobić tak, aby wielkość tej tablicy była określana w trakcie działania programu i przekazana do funkcji zerowanie?

Opublikowano

To jest tylko fragment programu. Chodzi mi tylko o przekazanie tej tablicy o nic więcej. Nie da się zrobić tak, aby wielkość tej tablicy była określana w trakcie działania programu i przekazana do funkcji zerowanie?

da. Poszukaj w google dynamiczne alokowanie tablicy

Opublikowano

Masz kilka możliwości.

1. Jeśli wymiary są znane podczas kompilacji to możesz zmienić deklarację funkcji na taką.

void zerowanie (int a, int b, int c, int T[][ta znana druga wielkosc])

2. Jeśli wymiary nie są znane podczas kompilacji (czyli tak jak masz teraz) to użyj std::vector w taki sposób

std::vector<std::vector<int>>

i zmienić deklarację na

void zerowanie (std::vector<std::vector<int>>& tablica)

jak pobrać rozmiar/y odsyłam do dokumentacji

Przy czym nie jest to najlepsze rozwiązanie.

 

3. Napisać własny interfejs dla tablicy 2d (na zasadzie tablicy jednowymiarowej o rozmiarze x*y, gdzie element obliczasz tak x*rozmiarY+y lub równoważnie y*rozmiarX+x)

Jedno z najlepszych rozwiązań.

 

4. Skorzystać z jakiejś biblioteki oferującej 3.

Kolejne dobre rozwiązanie

 

5. Stworzyć 'podwójny' wskaźnik int** i zaalokować najpierw tablicę y elementów typu int*, a potem dla każdego z tych elementów alokujesz tablicę o rozmiarze x elementów typu int.

Wysoce nie polecam, bo robienie tego w dzisiejszym C++ to niepotrzebna droga przez mękę.

Będzie to logicznie działało mniej więcej tak:

http://screenshooter.net/100253651/girsfsy

Jest to niewydajne i ciężkie do utrzymania.

 

Odnośnie kodu

Nie jest to poprawny kod jeśli a i b nie są stałe, tak jak kolega wyżej pisał nie możesz deklarować tablicy na stosie o rozmiarze nieznanym w czasie kompilacji (tzw VLA. Można tak robić w C, nie można C++. Niektóre kompilatory to dopuszczają, ale nie polecam takiego rozwiązania.)

Po co w ogóle liczysz to c?

I funkcja main MUSI mieć typ int. Teraz jest niepoprawnie.

Nie używaj conio.h, bo nie jest to standardowa biblioteka i nie każdy kompilator musi ją posiadać.
Jeśli ktoś ci każde korzystać z getch/system("pause") z conio.h, żeby zatrzymać konsolę, to nie rób tego. Program konsolowy ma się wykonać i zamknąć. Jeśli będziesz chciał, aby się konsola nie zamykała od razu po wykonaniu to przejrzyj ustawienia IDE (jeśli już nie jest podtrzymywana) lub uruchamiaj z poziomu konsoli.

Zarchiwizowany

Ten temat przebywa obecnie w archiwum. Dodawanie nowych odpowiedzi zostało zablokowane.

×
×
  • Dodaj nową pozycję...