Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2006-10-11 21:58:12

  BiExi - matka przelozona

BiExi
matka przelozona
Skąd: Gorlice
Zarejestrowany: 2004-04-16
Serwis

Dylemat w C

zwracanie parametrow jako tablicy znakow nnie dziala porwanie prubowalam ruznych kombinacji i nic ostatnia modyfikacja to:

cos.c

Kod:

#include <stdio.h>

char* ble1(void)
{
static char c[10];
sprintf(c, "hujnia jak nic");
return c;
}

cos.h

Kod:

#ifndef _COS_H
#define _COS_H
char* ble1(void);
#endif

test.c

Kod:

#include <stdio.h>
#include "cos.h"

main ()
{
static char x[10];
x = ble1();
//  printf("czy to qirwa zadziala %s n", *x);
return 0;
}

kompilacja

Kod:

#!/bin/bash
cc -c ./cos.c
cc -c ./test.c
cc ./cos.o ./test.o -o test1

No prubowalam wszelkich kombinacji ale niestety promocja
ma ktos jakis pomysl?

Offline

 

#2  2006-10-11 22:43:33

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Dylemat w C

tak raczej nie pojdzie bo ble1 zwraca wskaznik do c a c jest zmienna lokalna w ble1 ...

lepiej jest zrobic:

Kod:

void ble2(char * c) {
        sprintf(c, "Ala ma kota");
}

int main(void) {
        char x[20];
        ble2(x);
        printf("TTT: %s", x);
        return 0;
}

ewentualnie ble2 moze zwracac tez ten wskaznik ktory dostaje ... niekiedy jest to przydatne ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#3  2006-10-12 11:54:06

  kuchar - Użytkownik

kuchar
Użytkownik
Skąd: Warszawa
Zarejestrowany: 2005-11-16
Serwis

Re: Dylemat w C

mozesz tez przydzielic sobie pamiec mallockiem, wtedy ta tablica nie zniknie, wygladalo by to mniej wiecje tak:

Kod:

#include <stdio.h>

char* ble1(void)
{
char * c = (char*)malloc(100);
strcpy(c,"jakis teks, nie dluzszy niz parametr malloca");
return c;
} 

a np jezeli chodzi io tam intow to moglo by to wygladac tak:

Kod:

int* ble2(void)
{
//rozmiar jaki chcemy miec
int rozmiar_tablicy = 10;
int i;
//alokujemy pamiec dla tablicy
int * x = (int*)malloc(rozmiar_tablicy*sizeof(int));
//cos tam wstawiamy
for(i = 0; i<10; i++)
    x[i] = 100-i;
return x;
}

Linux Registered User # 406343

Routing protocols enable routers to route routed protocols :)

Offline

 

#4  2006-10-12 16:02:59

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Dylemat w C

mozesz tez przydzielic sobie pamiec mallockiem

wtedy w main() masz tylko wskaznik odpowiedniego typu do ktorego wpisujesz adres zwracany przez ble (nie masz tam alokacji pamieci na tablice ...)


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#5  2006-10-12 22:11:30

  kuchar - Użytkownik

kuchar
Użytkownik
Skąd: Warszawa
Zarejestrowany: 2005-11-16
Serwis

Re: Dylemat w C

nie masz tam alokacji pamieci na tablice ...)

jezeli pamiec zostala zaalokowana mallociem w funkcji ble, ktora zwroci wskaznik do tej zaalokowanej pamieci, ta pamiec zostanie dopiero zwolniona jezeli uzyta zostanie funkcja free(), albo na koncu programu, a jak wiadomo dzieki arytmetyce na wsakaznikach w C do tej pamieci mozna sie dostac jak do normalnej tablicy.


Linux Registered User # 406343

Routing protocols enable routers to route routed protocols :)

Offline

 

#6  2006-10-13 00:49:21

  bercik - Moderator Mamut

bercik
Moderator Mamut
Skąd: Warszawa
Zarejestrowany: 2006-09-23
Serwis

Re: Dylemat w C

nie masz tam alokacji pamieci na tablice ...)

jezeli pamiec zostala zaalokowana mallociem w funkcji ble, ktora zwroci wskaznik do tej zaalokowanej pamieci, ta pamiec zostanie dopiero zwolniona jezeli uzyta zostanie funkcja free(), albo na koncu programu, a jak wiadomo dzieki arytmetyce na wsakaznikach w C do tej pamieci mozna sie dostac jak do normalnej tablicy.

wlasnie chodzilo mi o to ze wtedy w main() nie trzeba alokowac tablicy (nie masz tam alokacji == ty nie alokujesz) a tworzymy tylko wskaznik ...


"Wszyscy wiedzą, że czegoś zrobić nie można. Ale przypadkowo znajduje się jakiś nieuk, który tego nie wie. I on właśnie robi odkrycie." (A.Einstein)

Offline

 

#7  2006-10-21 11:18:21

  tomek - Członek DUG

tomek
Członek DUG
Skąd: Wroclaw
Zarejestrowany: 2006-10-20

Re: Dylemat w C

Zwracanie wskaznika do tablicy z funkcji jest zlym pomyslem, najlepiej to rozwiazac jak napisal bercik:

Kod:

void ble1(char * c) { ... }

Dobrze jest tez przeslac do funkcji rozmiar tablicy:

Kod:

void ble1(char* c, int size) { ... }

i potem w funkcji sprawdzac czy aby nie chcemy pisac/czytac poza tablice pozwoli to uniknac 'segmentation fault'.

Natomiast pomysl z malloc wewnatrz funkcji to wg mnie najlepsza droga by narobic sobie klopotow, bo:
1) Wyobrazmy sobie ze f-cja ble1 alokuje duze tablice, i jest czesto wywolywana, i juz mamy pamiec ladnie zapchana; pamiec jest zwalniana dopiero na koniec programu bo nie ma gdzie dac free()
2) Dostajac wskaznik jako wynik wywolania f-cji ble1 nie wiemy jak duza tablice f-cja zarezerwowala, to moze prowadzic do pisania/czytania poza tablice

Generalnie zasada jest taka: kazda f-cja musi zwalniac wszystkie zasoby (czyli np. alokacja pamieci, otwieranie plikow), ktore pozyskala.
Uff, troszke sie rozpisalem na tematy czysto filozoficzne, ale trzeba pamietac, ze dobry styl programowania jest rownie wazny co poprawnosc kodu.

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
Możesz wyłączyć AdBlock — tu nie ma reklam ;-)