• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Alokacja pamięci. problem

Object Storage Arubacloud
0 głosów
207 wizyt
pytanie zadane 12 października 2015 w C i C++ przez Mateep Użytkownik (850 p.)

Witam piszę program i mam tam alokację pamięci tablicy2 wymiarowej. Chciałbym aby allokacja wykonywała się w funkcji a nie w mainie. jak mam to napisać , czy da się aby argumentem był tylko rozmiar tablicy???

oto moja alokacja:

//alokacja odpowiedniej ilosci wierszy
	double**matrix=(double**)malloc(n*sizeof(double*));
	if ( matrix == NULL )
	{
		printf("blad przy alokacji pamieci ilosci wierszy");
		return 1;
	}
	
	
	for(i=0;i<n;++i)
	{
		matrix[i]=(double*)malloc(n*sizeof(double));
		if (matrix[i]==NULL)
		{
			printf("blad przy alokacji pamieci");
			clean(matrix,i);
			return 1;
		}

 

1 odpowiedź

0 głosów
odpowiedź 12 października 2015 przez furas Maniak (53,800 p.)
Jasne, że się da. Skopiuj kod do funkcji, dodaj pobieranie wielkości jako parametru funkcji i zwracaj z funkcji wskaźnik na stworzoną tablicę.
komentarz 12 października 2015 przez Mateep Użytkownik (850 p.)
niby wiem o co CI chodzi ale jakoś mi to nie chce się kompilować.
komentarz 12 października 2015 przez furas Maniak (53,800 p.)
Ale daje jakiś komunikat o błędzie ?

Stwierdzenie "nie chce się kompilować" nic nie wnosi do dyskusji.
komentarz 12 października 2015 przez Mateep Użytkownik (850 p.)
funkcja powinna być typu double * ?

i ma zwracać wskaźnik na tą moją tablice.
a później wywołanie jak?
nie do końca wiem dlatego nie chcialbym walnąć jakiejś głupoty :)
komentarz 12 października 2015 przez furas Maniak (53,800 p.)
Zmienna matrix jest typu double** więc funkcja też musi być tego typu.

double** macierz(int n){...}

Funkcja konczy się linią

return matrix;

Wywołanie:

double** nowa_macierz = macierz(5);
komentarz 12 października 2015 przez furas Maniak (53,800 p.)

Wersja w C.

Musiałem pozbyć się clean() i przenieść deklarację int i

Jeśli coś się nie uda to funkcja zwraca NULL aby dało się to rozpoznać w main().

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

double** macierz(int n) {

    int i;
    
    //alokacja odpowiedniej ilosci wierszy
    double** matrix = (double**)malloc(n*sizeof(double*));
    if ( matrix == NULL )
    {
        printf("blad przy alokacji pamieci ilosci wierszy");
        return NULL;
    }
     
     
    for(i = 0; i < n ; i++)
    {
        matrix[i] = (double*)malloc(n*sizeof(double));
        if( matrix[i] == NULL )
        {
            printf("blad przy alokacji pamieci");
            matrix[i] = 0;
            return NULL;
        }
    }

    return matrix;
}

int main() {

    double** m = macierz(5);

    if( m == NULL ) {
        printf("problem z utworzeniem macierzy");
    } else {
        printf("macierz utworzona");
    }

    //TODO: nalezalo by macierz skasowac za pomoca free
    
    return 0;
}

 

komentarz 12 października 2015 przez Mateep Użytkownik (850 p.)
wielkie dzięki! jeszcze mam pytanie , bo ja tam wtym alokowaniu mam return 1; jeżeli alokacja źle nastąpi no i w kompilacja wywala mi warninga:

return makes pointer from integer without a cast [enabled by default]
da się coś z tym zrobić?
komentarz 12 października 2015 przez furas Maniak (53,800 p.)

Funkcja macierze() zwraca wartość, którą przypisuję do zmiennej m typu double**
Liczba 1 nie jest wartością typu double** więc kompilator się burzy. Mówi, że niejawnie zamienia liczbę integer na coś co jest typu double** (aby mógł przypisać tą wartość do zmiennej m). Nie burzył by się gdyby tam była jawna zamiana - "rzutowanie" (ang. cast)

return (double**)1;

NULL jest wartością typu double** dlatego lepiej tu zwracać NULL jako oznaczenie błędu. Zwykle tego typu funkcje jako błąd zwracają właśnie NULL.

Przykładowo malloc w razie problemu zwraca NULL.

komentarz 12 października 2015 przez Mateep Użytkownik (850 p.)
Bardzo dziękuję za pomoc teraz wszystko jest jasne i klarowne. może uda mi się kiedyś malloca ogarnąć :)

Podobne pytania

0 głosów
2 odpowiedzi 201 wizyt
0 głosów
1 odpowiedź 354 wizyt
pytanie zadane 25 sierpnia 2020 w C i C++ przez fortuna Początkujący (310 p.)
0 głosów
1 odpowiedź 447 wizyt
pytanie zadane 7 maja 2020 w C i C++ przez Hubertius Bywalec (2,970 p.)

92,624 zapytań

141,482 odpowiedzi

319,824 komentarzy

62,006 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj.

Akademia Sekuraka

Kolejna edycja największej imprezy hakerskiej w Polsce, czyli Mega Sekurak Hacking Party odbędzie się już 20 maja 2024r. Z tej okazji mamy dla Was kod: pasjamshp - jeżeli wpiszecie go w koszyku, to wówczas otrzymacie 40% zniżki na bilet w wersji standard!

Więcej informacji na temat imprezy znajdziecie tutaj. Dziękujemy ekipie Sekuraka za taką fajną zniżkę dla wszystkich Pasjonatów!

Akademia Sekuraka

Niedawno wystartował dodruk tej świetnej, rozchwytywanej książki (około 940 stron). Mamy dla Was kod: pasja (wpiszcie go w koszyku), dzięki któremu otrzymujemy 10% zniżki - dziękujemy zaprzyjaźnionej ekipie Sekuraka za taki bonus dla Pasjonatów! Książka to pierwszy tom z serii o ITsec, który łagodnie wprowadzi w świat bezpieczeństwa IT każdą osobę - warto, polecamy!

...