Parametry funkcji, czy mogą od siebie zależeć?

0

Cześć.
Zdecydowałem zmienić tablicę statyczną na dynamiczną w moim programie. Użytkownik ma wprowadzać w, które przyda mi się we wszystkich modułach.
Chciałem przekazywać to w poprzez parametr funkcji, tablica zależy od w, bo to rozmiar. Tak może być, że parametr zależy od parametru? A jak nie to jak to inaczej zrobić? Przed zmianami wszystko było w porządku a teraz wywala masę błędów.

main.cpp

#include <iostream>
#include <iomanip>
#include <cstdlib>
#include <windows.h>
#include "poruszanie.h"
#include "wyswietlanie.h"


using namespace std;


int main()
{
    int wspolrzedna1, wspolrzedna2, wsp1pop, wsp2pop;
    char black, white;


    char **tab ;
    int w;
    cout << "ile wierszy i kolumn ? " << endl;
    cin >> w;
    tab = new char *[w];
    for (int i=0; i<w; i++)
        tab[i] = new char [w];


    black = '1';
    white = '0';


    for (int i=0;i<w;i++)
        for (int j=0;j<w;j++)
        tab [i][j] = white;

wspolrzedna1 = w/2;
wspolrzedna2 = w/2;
wsp1pop = wspolrzedna1;
wsp2pop = wspolrzedna2;
tab[wspolrzedna1][wspolrzedna2] = black;
wspolrzedna2 = wspolrzedna2-1;


wyswietlanie (w, tab);

while (wspolrzedna1>=0 && wspolrzedna2>=0 && wspolrzedna1<w && wspolrzedna2<w)
{   poruszanie (w, wspolrzedna1,wspolrzedna2, wsp1pop, wsp2pop, tab, white, black);

    Sleep (500);
    system( "cls" );

    wyswietlanie (w, tab);
}

for (int i=0; i<w; i++)
delete [ ] tab[i];
delete [ ] tab;


    return 0;
}

wyswietlanie.h

#ifndef WYSWIETLANIE_H
#define WYSWIETLANIE_H

const int W=20;
void wyswietlanie (int &w, char tab[][w]);

#endif

wyswietlanie.cpp

#include "wyswietlanie.h"
#include <iostream>
#include <iomanip>
#include <cstdlib>

using namespace std;


void wyswietlanie (int &w, char tab[][w])
{
    for (int i=0;i<w;i++)
        {for (int j=0;j<w;j++)
        cout << setw(2) <<  tab [i][j];
        cout << endl;}
}


błędy

wyswietlanie.h:6: błąd: use of parameter outside function body before ']' token
 void wyswietlanie (int &w, char tab[][w]);

wyswietlanie.cpp:9: błąd: use of parameter outside function body before ']' token
 void wyswietlanie (int &w, char tab[][w])
                                        ^

 wyswietlanie.cpp:11: błąd: 'w' was not declared in this scope
     for (int i=0;i<w;i++)
 wyswietlanie.cpp:13: błąd: 'tab' was not declared in this scope
         cout << setw(2) <<  tab [i][j];

i w mainie: no matching function for call to 'wyswietlanie'
                             ^        ^

                                                                                      ^

Przepraszam za niesubordynację ;)

0

Sprobuj przekazac wskaznik na tablice i rozmiar tej tablicy i tak bedziesz mogl sie do niej odwolywac jak do tablicy dwu elementowej

void wyswietlanie (int &w, char* tab)
{
...
1

Wbrew tagowi CPP jest to napisane praktycznie w C tyle że drukuje na streamy

Co bym zrobił ... użył do przekazywania std::vector. W duchu C++, jeśli jest założenie, że nie można użyć kontenerów jak std::vector, bym zrobił klasę z a) alokowaną przez new tablicą i b) licznikiem długości tablicy.

Za mało mi stałych const, np white i black, a może bym użył enuma ...
nijaki ten kod jest.

0

z *tab nie działało, ale **tab śmiga, dzięki wielkie :)

0
AnyKtokolwiek napisał(a):

Wbrew tagowi CPP jest to napisane praktycznie w C tyle że drukuje na streamy

Co bym zrobił ... użył do przekazywania std::vector. W duchu C++, jeśli jest założenie, że nie można użyć kontenerów jak std::vector, bym zrobił klasę z a) alokowaną przez new tablicą i b) licznikiem długości tablicy.

Za mało mi stałych const, np white i black, a może bym użył enuma ...

Zamierzałem pisać w c++ ;)
co do stałych, to prowadzący kazał ich nie używać, chyba że w ekstremalnych przypadkach

0
daniel1302 napisał(a):

Sprobuj przekazac wskaznik na tablice i rozmiar tej tablicy i tak bedziesz mogl sie do niej odwolywac jak do tablicy dwu elementowej

void wyswietlanie (int &w, char* tab)
{
...

Dlaczego ta referencja w? Podczas wyświetlania nie zachodzi zmiana wymiaru (chyba że nazwa funkcji kłamie). Na poziomie projektu jest to pudrowanie braku designu.
Na Elektrodzie się zaznacza "szkodliwa porada"

1
David02 napisał(a):

Zamierzałem pisać w c++ ;)
co do stałych, to prowadzący kazał ich nie używać, chyba że w ekstremalnych przypadkach

Ekstremalny to jest ten kod teraz, jak skoki z mostów na bandu. Jakby Ci kazał jeść zupę widelcem, zrobił byś tak?

EDIT: jeśli masz wrażenie, że kod śmiga, to masz wrażenie.

2

Użyj kontenera vector według poniższego przykładu.


   void print( const vector<vector<char>>& vtab )
   {
       for( const auto& row : vtab )
       {
           for( const auto& sign : row )
           {
               cout << setw(2) << sign ;
           } 
           cout << endl;
       }
   }

.....................

   constexpr int dim = 50;
   vector<vector<char>> vtab(dim);
   for( auto& row : vtab ) row.resize(dim,'a');
   print(vtab);

1 użytkowników online, w tym zalogowanych: 0, gości: 1