przekazywanie tablicy 2-wymiarowej do funkcji

0

Mam taką tablicę 2-wymiarową:

unsigned int **tab=new unsigned int *[wiersze];
for(i=0;i<wiersze;i++)
   tab[i]= new unsigned int [kolumny];

przekazuję ją do funkcji w ten sposób:
void funkcja(unsigned int **tab, reszta parametrów)
w programie głównym funkcję wywołuję w ten sposób:
funkcja(tab, reszta parametrów)

Dotychczas tak robiłem z tablicami dwuwymiarowymi i wszystko było ok. W funkcji wykonywane są pewne operacje na tablicy. Niestety dopiero poraz pierwszy dzisiaj miałem sytuację, że muszę w funkcji zwalniać pamięć przekazywanej tablicy 2-wymiarowej i przydzielać nową tak, że ta tablica ma inną liczbę wierszy niż przed wejściem do funkcji. Na końcu funkcji daję aby mi wypisał tablicę i wypisuje dobrze np.
0 0 0 2
1 1 0 0
0 1 1 0
1 0 0 0
0 1 0 0
0 1 0 1
Jak wyjdę z funkcji to znowu daję aby wypisał mi tablicę i UWAGA:
1 0 0 0
0 1 1 0
1 1 0 0
0 0 0 2
0 1 0 0
0 1 0 1
Jakby po wyjściu z funkcji mieszają się indexy wierszy, wiersz 4 jest 1, 3->2, 2->3, 1->4.
Inny przypadek:
na samym końcu funkcji:
0 2 0 1
0 1 0 2
0 1 2 0
1 0 0 0
1 1 0 0
po wyjściu z funkcji:
1 0 0 0
0 1 2 0
0 1 0 2
0 2 0 1
1 1 0 0
4161840 4161816 4161792 4170488

Czyli podsumowując na samym końcu funkcji tablica jest poprawna taka jak chcę. Po wyjściu niestety coś się knoci. Nie wiem z czym może to miec związek, może z tym, że w funkcji zwalniam pamięć tablicy która jej zadeklarowałem w main(), a w main() na samym końcu programu zwalniam pamięć tablicy którą zadeklarowałem jej w funkcji. Nie wiem czy to o to chodzi. Nie próbowałem także opcji co by było jakbym globalnie zadeklarował tablicę, bo wolałbym to robić przez przekazywanie.

0

łaska pokazać kod?
Czy ty czasami nie zwalniasz dwa razy tej samej pamięci?
Poza tym czemu korzytasz z tego samego wskaźnika i tej samej pamięci?
Nie lepiej stworzyć NOWĄ tablicę w funkcji, zrobic to tam chcesz, wypisać i ja usunać przed wyjściem z funkcji?

0

Nie mogę pokazać kodu, bo magisterkę piszę i no nie wiem jak oni tam sprawdzają w necie te kody.:) W każdym razie zwalniam 2 razy tą samą pamięć. Na początku main() przydzielam tab pamięć. Potem w funkcji zwalniam pamięć i przydzielam tab pamięć, ale niekoniecznie tą samą ilość wierszy (w zależności od obliczeń). No i potem zwalniam pamięć w main() na końcu. A nie wolno tak robić???
Nie wolno korzystać z tego samego wskaźnika, że w main() mam zmienną tab i w definicji funkcji w paramtrach mam tab??? Bo gdzieś czytałem, że można tak robić, bo jakby zmienne lokalne a więc te w funkcji zakrywają zmienne te w main(). Ostatnie pytanie to tablica jest mi po prostu potrzebna, po prostu chciałem stworzyć sobie funkcję dodatkową by tam umieścic obliczenia na tablicy ale cóż jak się tak nie da, to dam po prostu kod z funkcji do main() i wtedy będzie wszystko hulać, no ale gorsza przejrzystość kodu;)

0
void funkcjaWersja1(unsigned int ***tab, reszta parametrów) // ekstra gwiazdka
{
    int **oldTab = *tab;
    int **newTab = new unsigned int *[nowaLiczbaWierszy];
    .....

    .....
    delete oldTab; // składniki też
    *tab = newTab;
}

void funkcjaWersja2(unsigned int **&tab, reszta parametrów) // ekstra ampersand
{
    int **oldTab = tab;
    int **newTab = new unsigned int *[nowaLiczbaWierszy];
    .....

    .....
    delete oldTab; // składniki też
    tab = newTab;
}

W sumie obie wersje to to samo raz z referencją raz ze wskaźnikiem.
Może lepiej jak poznasz takie cudo jak vector<>?

0

Piszesz magisterkę i nie wiesz o tak elementarnych rzeczach? ...
Fakt ze w funkcji masz kopię lokalną zmiennej ALE kopia dotyczy tylko wskaźnika! Ten skopiowany wskaźnik wskazuje dalej na to samo miejsce w pamięci na które wskazywał! Jeśli coś z tą pamięcią zrobisz to ona się zmieni wszędzie, nie tylko "lokalnie w funkcji" ale poza nią też.

0
jacek___p napisał(a)

Nie mogę pokazać kodu, bo magisterkę piszę i no nie wiem jak oni tam sprawdzają w necie te kody.

Sprawdzają tekst części teoretycznej na plagiat.pl, a nie kod programu. Jak Ty sobie takie coś wyobrażasz? ;)

0

No to weźmy przykład. Np. ktoś mi tutaj załóżmy pomógł napisać pewną funkcję. I ją wziąłem do magisterki, zmieniłem tylko nazwy zmiennych, nazwę funkcji, tudzież dałem gdzieniegdzie unsigned int zamiast int no i wykorzystałem ją w moim programie, ponadto kod tej funkcji jest na papierze w mojej pracy i opisane ze 2 strony na jej temat. I co? mam się czego obawiać? heh :) Czy mogę spać spokojnie?

0

Totalna paranoja, to się leczy.

0

Nie paranoja. Moj kumpel pisal antyplagiator do javy i z tego co wiem to jest na uczelni uzywany ;)

0
jacek__p napisał(a)

ponadto kod tej funkcji jest na papierze w mojej pracy

To żeś mnie teraz autentycznie rozjebał 8-O W życiu bym nie wpadł na takie coś... To już nie masz czego w treści dawać? ;>

@Johny - ale przecież wiele rzeczy można rozwiązać w jakiś sposób, którego kod jest powszechnie dostępny w necie i "każdy" go sobie kopiuje i używa. Taki antyplagiator do kodu wydaje mi się dziwnym rozwiązaniem. No chyba, że to ma za zadanie złapać cały kod programu, ale to też takie średnie, bo co np. gdy kod jest w dziesiątkach plików...

0
johny_bravo napisał(a)

Nie paranoja. Moj kumpel pisal antyplagiator do javy i z tego co wiem to jest na uczelni uzywany ;)

na PG chlopaki tez pisali podobny, tylko w miare niezalezny od jezyka, jesli dokonczyli - to c/+/#/java/ i inne jezyki tej klasy da rade porownac nawet miedzy soba..

somekind: jelsi program jest duzy, plagiat wykryc latwiej. nie bada sie tekstem, a struktura kodu. petle, ify, klasy/pola/metody, w bardziej zaawansowanej formie - mozna badac przeplyw danych itp.. odpowiedz z kolei nie jest tak-nie, tylko liczbowa/procentowa okreslajaca jak bardzo sa podobne i sluzy tylko wskazaniu, czy czlowiek powinien sie temu przyjrzec. a ten juz robi za dostateczny wykrywacz;p

0

No, że w procentach to się rozumie samo przez się... Ale struktura, jeśli jest oparta na jakichś frameworkach narzucających strukturę i wzorcach projektowych, jeśli cały kod metod jest napisany w sposób optymalny, to wydaje mi się, że może się okazać, że kod różnych autorów jest bardzo podobny.
Czy się mylę?

0

nie:)
dlatego wlasnie ostateczny glos zawsze nalezy do osoby ktora potem ten podejrzany kod obejrzy, a caly system to jedynie narzedzie do zmniejszania puli przypadkow do prezjrzenia

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