funkcja przyjmujaca parametr: wskaznik do tablicy

Odpowiedz Nowy wątek
2012-04-13 16:46

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Witam. Mam problem z zadaniem którego treść brzmi:
Napisz funkcję zwracającą wskaźnik do tablicy, która przyjmuje parametry :wskaźnik do tablicy oraz wskaźnik do rozmiaru. Wczytuj wielkość do tablicy dopóki będzie ona z przedziału: 1-20. Liczby wczytywane do tablicy muszą być większe od 0 i podzielne przez 3 lub większe od 0 i podzielne przez 5.

I tu problem. zrobiłem program który przyjmuje jako parametr wskaźnik do wielkości tablicy, natomiast jak upchać do tego wskaźnik do tablicy to nie mam pojęcia Proszę o rady.

#include <stdio.h>
#include <stdlib.h>

int *wczytaj(int *n)
{

   int i,u;
   int *tab;

   do
   scanf("%d",n);
   while((*n<1)||(*n>20));

   tab=(int *)malloc(*n*sizeof(int));

   for(i=0;i<*n;++i)
   {
      scanf("%d",&u);
      if ((u>0)&&(u%3==0)||((u>0)&&(u%5==0)))
         *(tab+i)=u;
      else
         *(tab+i)=0;
   }

   return tab;
}

void main(void)
{

   int *tab,n;
   tab=wczytaj(&n);

   system("pause");

}

Pozostało 580 znaków

2012-04-13 16:51

Rejestracja: 8 lat temu

Ostatnio: 8 miesięcy temu

0

zrobic funkcje ktora przyjmie 2 parametry?


!user image
I am the master of my fate. I am the captain of my soul.

Pozostało 580 znaków

2012-04-13 16:56

Rejestracja: 9 lat temu

Ostatnio: 2 miesiące temu

To zależy co z tym wskaźnikiem będziesz chciał w funkcji robić. Jeśli będziesz chciał zmienić jego wartość (np. przypisać do niego adres innej tablicy), tak żeby zmiana była widoczna poza funkcją, to musisz przekazać wskaźnik do wskaźnika. Przykład:

int  foo(int  **blah) { *blah = (int*)malloc(10); }

Jeśli to jest wskaźnik "tylko do odczytu" w funkcji, to przekazujesz... wskaźnik:

int  foo(int  *blah) { blah[0] = bar }

Nadal możesz zmienić wartość zmiennej blah, ale ponieważ jest ona lokalna, zmiana będzie widoczna tylko w funkcji.
W pierwszym przypadku funkcję wywołujesz np. w ten sposób:

bar = foo(&tab);

W drugim:

bar = foo(tab);

Pozostało 580 znaków

2012-04-13 17:08

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Dziękuję za podpowiedzi i sugestie.
Źle się troszeczkę wyraziłem formułując treść posta.
Chodziło bardziej o to czy da się wsadzić

int *tab; 

do tej funkcji jako argument?
Tak zrozumiałem treść mojego zadania ale nie wiem czy to możliwe bo przecież tablica (tab) musi być wcześniej zainicjalizowana, czyż nie?

Wybaczcie jeśli piszę coś niezgodnie lub niezrozumiale, jestem początkującym "programistą" i Was również proszę o traktowanie mnie jako właśnie raczkującego w tej dziedzinie. Będzie mi o wiele łatwiej zrozumieć co chcieliście mi przekazać:)

edytowany 2x, ostatnio: filozof_, 2012-04-13 17:19

Pozostało 580 znaków

2012-04-13 17:21

Rejestracja: 9 lat temu

Ostatnio: 1 rok temu

1

Kumashiro wyłożył Ci na tacy rozwiązanie(jeżeli dobrze zrozumiałem):

  1. do funkcji podajesz wskaznik tego typu co ma być tablica i wskaźnik na wielkość tablicy.

...
typtablicy magicznafunkcja(typtablicy** wsk, int* wielkosc)
{};
...

typtablicy* wsk;
int wielkosc=20;

magicznafunkcja(wsk, &wielkosc);
  1. W magicznej funkcji alokujesz pamięć dla wskaźnika, losujesz liczby i zwracasz wsk. Tak to zrozumiałem ;p

non omnis moriar i tyle :-)
edytowany 2x, ostatnio: arasso12, 2012-04-13 17:22

Pozostało 580 znaków

2012-04-13 17:37

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Zrobiłem coś takiego:

#include <stdio.h>
#include <stdlib.h>

int wczytaj(int **tab, int *n)
{

   int i,u;

   do
   scanf("%d",n);
   while((*n<1)||(*n>20));

   tab=(int *)malloc(*n*sizeof(int));

   for(i=0;i<*n;++i)
   {
      scanf("%d",&u);
      if ((u>0)&&(u%3==0)||((u>0)&&(u%5==0)))
         *(tab+i)=u;
      else
         *(tab+i)=0;
   }

   return tab;
}

void main(void)
{

   int *tab,n=10;
   int *wsk;

   tab=wczytaj(wsk, &n);

   system("pause");

}

teraz wywala że

 wsk 

został uzyty bez inicjalizacji. jeśli ktoś może niech poprawi ten mój program, byłbym wdzięczny, może wtedy uda mi się zrozumieć.

to zainicjuj go zerem ;p - arasso12 2012-04-13 17:39
To niewiele da, gdyż w funkcji i tak to nie miałoby znaczenia. Cały program by zadziałał, gdyż wskaźnik do tablicy jest zwracany, ale we wskaźniku przekazanym argumentem nie zostałby zapisany. Dlatego dla mnie jest niejasne po co ten wskaźnik w argumencie lub po co funkcja ma zwracać wskaźnik. - Kumashiro 2012-04-13 17:44
Już sam trochę zgłupiałem, dziś posprawdzam różne opcje z ciekawości. - arasso12 2012-04-13 17:48
Wiesz co... to może być tak, że wykładowca dał do przećwiczenia dwie metody pozyskiwania wskaźnika do tablicy alokowanej w funkcji - poprzez argument oraz poprzez wartość zwracaną. Tyle tylko, że kazał to zrobić na jednej funkcji, co wprowadza straszne zamieszanie. Takie użycie nie ma sensu, gdyż ta sama wartość jest przekazywana dwoma "kanałami" z funkcji. Zazwyczaj robi się to tak, że jako argument przekazuje się wskaźnik do wskaźnika, a funkcja zapisuje pod nim adres tablicy, którą zaalokuje i zwraca rozmiar (lub 0 czy -1 w przypadku błędu malloc()). - Kumashiro 2012-04-13 17:56

Pozostało 580 znaków

2012-04-13 17:39

Rejestracja: 9 lat temu

Ostatnio: 2 miesiące temu

1

Nie chciałem się odwoływać do treści zadania, gdyż nie wynika z niego dla mnie po co ma być użyty wskaźnik do tablicy w argumencie funkcji. Czy ma w nim być zapisany adres tablicy zainicjowanej w funkcji, czy też ten adres ma być zwrócony, czy jeszcze coś innego.
W każdym bądź razie, jeśli do funkcji przekazujesz wskaźnik do tablicy, to oczywiście musi ona istnieć, a sam wskaźnik musi wskazywać na prawidłowe miejsce w pamięci. Taką tablicę tworzysz i inicjujesz poza funkcją. W przypadku, gdy do funkcji przekazujesz wskaźnik na wskaźnik, tablica nie musi istnieć w momencie wywołania funkcji. Możesz ją utworzyć w ciele funkcji. Wskaźnik w takim wypadku może mieć dowolną wartość.
W uproszczeniu wskaźnik jest zmienną, która zajmuje 4 lub 8 bajtów. Nie przechowuje on całej tablicy, a jedynie "namiary" w pamięci gdzie ta tablica się znajduje. Jeśli tablicy jeszcze nie utworzyłeś, możesz zmienną wskaźnikową przekazać (a właściwie wskaźnik do tego wskaźnika) jako miejsce, w którym funkcja zapisze namiary po jej zaalokowaniu (lub z innego źródła).
Ponieważ trochę namieszałem, to warto zapamiętać, że najczęściej jeśli masz tablicę i chcesz ją przekazać do funkcji, podajesz w argumentach tę tablicę. Jeśli funkcja w jakiś sposób tworzy tablicę, a Ty chcesz w argumencie przekazać wskaźnik pod którym ma być zapisany wynik (adres do tablicy), przekazujesz wskaźnik na wskaźnik i nie musisz mieć do niego przypisanej żadnej gotowej tablicy. Oczywiście nie wyczerpuje to wszystkich możliwych zastosowań, ale powinno ułatwić zapamiętanie co jest co.

Pozostało 580 znaków

2012-04-13 17:40

Rejestracja: 9 lat temu

Ostatnio: 2 miesiące temu

1
filozof_ napisał(a)

Zrobiłem coś takiego:
[...]
teraz wywala że

wsk 

został uzyty bez inicjalizacji. jeśli ktoś może niech poprawi ten mój program, byłbym wdzięczny, może wtedy uda mi się zrozumieć.

Bo przekazujesz "goły" wskaźnik. Przeczytaj jeszcze raz co napisałem wyżej i przekaż wskaźnik do wskaźnika:

tab=wczytaj(&wsk, &n);

Pozostało 580 znaków

2012-04-13 17:44

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

Dziękuję za wyjaśnienie, teraz już jasne jak słońce :) a cały dzień nad tym siedziałem. widocznie koleś źle zadanie sformułował a ja się męczę jak baran. Wielkie ale to wielkie dzięki za pomoc Drodzy Forumowicze :)

Pozostało 580 znaków

2012-04-13 17:51

Rejestracja: 9 lat temu

Ostatnio: 2 miesiące temu

0

No to jeszcze pamiętaj o tym, że wywołanie funkcji malloc() może się nie udać. W takim przypadku zwraca ona NULL i jakiekolwiek odwołania do tego wyniku w sposób taki, jaki Ty to robisz będą Ci wykładały program na łopatki z niewiele mówiącym komunikatem błędu. Zawsze należy sprawdzać czy wywołanie jakieś funkcji się powiodło czy nie i odpowiednio na to reagować.

Pozostało 580 znaków

2012-04-13 19:45

Rejestracja: 7 lat temu

Ostatnio: 7 lat temu

0

a teraz żeby stworzyć funkcję która wypisze mi te elementy z tablicy z funkcji wczytaj jak mogę to zrobić?

Pozostało 580 znaków

Odpowiedz

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