Wskazniki - dynamiczne allokowanie pamieci na tablice

soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: soku11 »

WITAM!
Prosze o sprawdzenie, czy ten kod jest poprawny skladniowo i logicznie. Wiem, ze dziala, jednak nie wiem, czy tak powinna wygladac funkcja ktora alokuje pamiec na tablice przekazywana przez wskaznik Oto kod:

Kod: Zaznacz cały

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

int wczytaj(char **tablica);

int main()
{
  char *wejscie;
  int x;
  
  wczytaj(&wejscie);

  free(wejscie);
  printf("
");
  getch();
  return 0;
}

int wczytaj(char **tablica)
{
  *tablica=malloc(30 *sizeof tablica);
}

Czy jest to zgodne ze standardem ANSI C oraz w miare efektywna metoda. P.S. Wiem, ze mozna to dopisac do main, jednak to jest pcozatek funkcji. Z gory dzieki za kazda pomoc. POZDRO
UNIX_admin
Użytkownik
Użytkownik
Posty: 185
Rejestracja: 6 maja 2006, o 14:24
Płeć: Mężczyzna
Lokalizacja: Warszawa
Pomógł: 32 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: UNIX_admin »

ciezko cos powiedziec bez kompilatora, ale
jesli chodzi o ANSI to poprawnie jest:

*tablica = (char*) malloc (30 * sizeof(char));
lub ewentualnie jeszcze razy cos w nawiasie (zalezy o co Ci dokladnie chodzi)

tak przynajmniej zawsze pisalo sie na PW

generalnie wazne jest, aby pisac sizeof i nazwa typy, bo fartyczny rozmiar moze zalezec od architektury. oczywiscie duzo zalezy tez od kompilatora.


W razie watpliwosci radze zobaczyc jat to jest rozwiazane w plikach *.h dolaczonych do kompilatora, np gcc (jak tak czesto robie).
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: soku11 »

Hmpf... Troche nie o to mi chodzi Ja chce zrobic alokacje pamieci dla wskaznika char zadeklarowanego w main poprzez inna funkcje (tutaj wczytaj) Jak to zrobic poprawnie, bym w funkcji wczytaj zrobil tablice 30 elementowa, nastepnie wpisal do niej np od 1 do 30?? Nie wiem zabardzo jak przekazac wskaznik do tej funkcji i jak nim operowac :/ POZDRO
Awatar użytkownika
eloar
Użytkownik
Użytkownik
Posty: 106
Rejestracja: 18 cze 2007, o 16:59
Płeć: Mężczyzna
Lokalizacja: Kobyłka
Podziękował: 8 razy
Pomógł: 12 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: eloar »

wskaznik przekaz po prostu poprzez referencje.

Dobra do konkretow. Nie wiem w prawdzie dokladnie czego oczekujesz, ale dynamiczne tworzenie tablic juz masz opisane. Wazne jest jeszcze to, ze nie mozesz do takiej tablicy nic pozniej dokleic, ale i tak mozliwosc stworzenia tablicy o potrzebnym rozmiarze jest niezla mozliwoscia.

Rozumiem, ze w main masz wskaznik np. char*, zas chcesz, aby funkcja przypisala mu spojny obszar danych o komorkach o stalej wielkosci, czyli tablice i w ten sposob zwrocila wyniki swego dzialania. To jest niezwykle proste.

na poczatek sprawa przekazania wskaznika do funkcji:

Kod: Zaznacz cały

char*wsk;
int funkcja(char**);
a w miejscu wywolania:

Kod: Zaznacz cały

funkcja(&wsk);
W ten sposob mozliwa bedzie nie tylko modyfikacja pamieci wskazywanej przez wskaznik, ale takze samego adresu w nim zawartego.

Jesli zas chodzi o samo zwracanie wartosci itp. Jako, ze wynik dzialania funkcji bedzie przekazany poprzez dynamicznie utworzona tablice, totez nie ma potrzeby zwracania jakiejkolwiek wartosci przez funkcje i moze byc ona typu void. Jesli jednak nie mamy z gory okreslone jak wiele bedzie wynikow w tablicy (no z jakiegos powodu tworzymy ja dynamicznie), to warto, aby poprzez funkcje zwrocic wymiar tej tablicy.

Oczywiscie zagadnienia programistyczne najlepiej obrazowac na przykladzie:

Kod: Zaznacz cały

...
int funkcja (char** a)
{
    int ile;
    printf("podaj ile bedzie znakow
");
    scanf("%d",&ile);
    a=(char*)malloc(ile*sizeof(char));
    for(int i=0;i<ile;i++) scanf("%c",&a[i]);
    return ile;
}
mam nadzieje, ze nie popelnilem bledu. Jeszcze tylko slowko objasnienia. Nie wiemy ile znakow wpisze uzytkownik, jednak on sam sie deklaruje podajac ich liczbe. Ta liczbe przekazujemy dalej poprzez funkcje, zas same znaki sa w tablicy i nie trzeba ich zwracac do miejsca wywolania, poniewaz zmiany byly dokonywane na faktycznej tablicy, a nie na jej kopii lokalnej na potrzeby funkcji
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: soku11 »

Hehe dzieki, ale juz sie uporalem z tym problemem (btw. kod programu mam w pierszym poscie nie musiales pisac mi wszystkiego) Wszystko zrobiles prawie tak jak ja oprocz jednej rzeczy. Ja odnosilem sie do elemetnow powstalej tablicy poprzez

Kod: Zaznacz cały

(*tablica)[i]
a ty poprzez

Kod: Zaznacz cały

&tablica[i]
. Niemniej jednak dziekuje za pomoc i dostajesz plusa za taki wysilek POZDRO
Awatar użytkownika
eloar
Użytkownik
Użytkownik
Posty: 106
Rejestracja: 18 cze 2007, o 16:59
Płeć: Mężczyzna
Lokalizacja: Kobyłka
Podziękował: 8 razy
Pomógł: 12 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: eloar »

zaden problem. Ja programuje z pasji . Jeszcze taka informacja, ze tak na prawde, to nikt przy zdrowych zmyslach nigdy nie uczy tworzyc tablice dynamicznie. Ja kiedys odkrylem jakie to proste, ale odkrylem tez pozniej jakie to niebezpieczne. Na przyklad przez pomylke pozarlem jedna tablica cala dostepna pamiec RAM (ok 700MB!). Radze ostroznie z tym .

Co do odwolania do tablicy, to w rzeczywistosci sam uzylbym nieco innej metody dostepu do elementow tablicy. W rzeczywistosci, aby bylo latwiej stosowalbym:

Kod: Zaznacz cały

for(int i=0;i<rozmiar;i++) *(wsk+i)=cos;
Taki sposob jest nieco pewniejszy i bezpieczniejszy.
soku11
Użytkownik
Użytkownik
Posty: 6607
Rejestracja: 16 sty 2007, o 19:42
Płeć: Mężczyzna
Podziękował: 119 razy
Pomógł: 1823 razy

Wskazniki - dynamiczne allokowanie pamieci na tablice

Post autor: soku11 »

Dzieki jeszcze raz za wskazowki Jak narazie zmienilem jednak ta dynamiczna allokacje na zwykla, gdyz znalazlem inny sposob na obejscie problemu przepelnienia tablicy POZDRO
ODPOWIEDZ