Nagłówki funkcji

Odpowiedz Nowy wątek
2011-08-31 15:16
0

Witam, nie wiedziałem w jakim temacie to umieścić ponieważ w tym zadaniu występują 4 języki, jeśli jest błędny proszę o przeniesienie.

Co do zadania to mam wypisać nagłówki funkcji (w c, c+, c#, pascal), która przyjmuję jako dane łańcuch znaków oraz zwraca liczbę całkowitą i tablicę dowolnych liczb. Mam zrobione to tak:

C
void przyjmujelancuch(char lancuchznakow[])
int zwracaliczbe()
float *zwracatablice()

C++
void przyjmujelancuch(string lancuchznakow) - uwaga taka sama jak wcześniej
int zwracaliczbe()
float *zwracatablice()

C#
public void przyjmujelancuch(string lancuchznakow)
public int zwracaliczbe()
public float[] zwracatablice()

Pascal
procedure przyjmujelancuch(lancuchznakow : String)
function zwracaliczbe() : integer
function zwracatablice() : array[x..y] of double 

Tylko sam do końca nie wiem czy mają to być trzy funkcje do każdego języka czy tylko jedna. Problem w tym, że jedną nie zawsze się da, skoro ma zwracać kilka rzeczy, chyba że przekazujemy coś przez wskaźnik? Może Wy macie jakiś pomysł zaawansowanego programisty na te zadanie? Będę wdzięczny za sprawdzenie tego co mam i ewentualne korekty.

Pozostało 580 znaków

2011-08-31 15:20
0

Jeżeli koniecznie chcesz zwrócić kilka rzeczy z jednej funkcji w C możesz użyć struktury a w C++ std::tuple lub też struktury (klasy). Pascal też ma zdaje się jakieś struktury a C# nie znam, ale pewnie ma coś jak std::tuple no i na pewno ma klasy.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-08-31 15:22
0
Endrju napisał(a)

Jeżeli koniecznie chcesz zwrócić kilka rzeczy z jednej funkcji w C możesz użyć struktury a w C++ std::tuple lub też struktury (klasy). Pascal też ma zdaje się jakieś struktury a C# nie znam, ale pewnie ma coś jak std::tuple no i na pewno ma klasy.

Właśnie chodzi o to aby nie komplikować tego i było zapisane jak najprościej to możliwe.

Pozostało 580 znaków

2011-08-31 15:26
0

Ale co tu jest skomplikowanego? Zdecyduj się, czy chcesz zwrócić zbiór kilku rzeczy czy wysyłać argumenty przez referencję (wskaźnik) i traktować je jako wyjście z funkcji. Z Twojego zadania wynika, że ma to być jedna funkcja.


"(...) otherwise, the behavior is undefined".

Pozostało 580 znaków

2011-08-31 15:26
msm
1

Jednoczesne zwracanie liczby i tablicy liczb w C, C++, C# czy Pascalu jest niemożliwe (w prawie wszystkich innych językach zresztą też).

Tak jak zauważyłeś, możesz to zrobić wskaźnikiem wypełnianym w funkcji, ale to ciężko nazwać zwracaniem...

float func(char *txt, int *result);

Można to też ostatecznie zapakować w strukturę:

struct struc
{
    int intResult;
    float *floatArrResult;
}
 
struc func(char *txt)

Przy czym nie wiem czy zwracanie struktury to to samo co zwracanie liczby i tablicy...

Ale IMO twoje rozwiązanie jest zgodne z tym czego wymagają.

edytowany 1x, ostatnio: msm, 2011-08-31 15:27
A Ty za to masz tam aż 2 błedy. (Odnośnie czepiania się postu niżej) - Endrju 2011-08-31 15:36
Nie czepiam się, pytałem z ciekawości. Przecinek po deklaracjach struktur i klas mnie prześladuje, po deklaracji funkcji autor też nie dawał średników więc świadomie też nie dodałem (coś jeszcze?). Uszczęśliwi Cię poprawienie tego? - msm 2011-08-31 15:59
Pal licho średnik po }, niżej jest o struct za dużo u Ciebie za mało. Mnie nie, ale autor tematu dostanie 3 zamiast 5. ;-) - Endrju 2011-08-31 16:03
Pierwszy kod jest w C, drugi w C++ - można sprawdzić po języku w tagach <code />. Faktycznie, trzeba to było napisać w poście :S - msm 2011-08-31 16:05
Zmyliło mnie char *. :-F - Endrju 2011-08-31 16:06

Pozostało 580 znaków

2011-08-31 15:29
1

W C:

typedef struct {
  int num;
  int *tab;
} my_struct;
 
my_struct f(char str[]);

W C++

std::pair<int, int*> f(std::string str);
edytowany 1x, ostatnio: hauleth, 2011-08-31 18:37
Po co Ci ten typedef skoro i tak używasz jawnie przedrostka struct? - msm 2011-08-31 15:35
Nie tyle jest nadmiarowy, co nawet nie może go być. - Endrju 2011-08-31 16:02

Pozostało 580 znaków

2011-08-31 15:30
0
MSM napisał(a)

Jednoczesne zwracanie liczby i tablicy liczb w C, C++, C# czy Pascalu jest niemożliwe (w prawie wszystkich innych językach zresztą też).

Tak jak zauważyłeś, możesz to zrobić wskaźnikiem wypełnianym w funkcji, ale to ciężko nazwać zwracaniem...

float func(char *txt, int *result);

Można to też ostatecznie zapakować w strukturę:

 
struct struc
{
int intResult;
float *floatArrResult;
}

struc func(char *txt)


> Przy czym nie wiem czy zwracanie struktury to to samo co zwracanie liczby i tablicy...
> 
> Ale IMO twoje rozwiązanie jest zgodne z tym czego wymagają.

Dzięki, a czy c# oraz pascal jest poprawnie zapisany? Bo w tych językach mam największe problemy i nie jestem ich pewien.

Pozostało 580 znaków

2011-08-31 15:34
msm
1

Kod w C# jest poprawny składniowo na pewno.
W Pascalu nie pisałem od wieków ale chyba też jest poprawny.

Pozostało 580 znaków

2011-08-31 17:04
1

w każdej deklaracji z każdego języka brakuje średnika na końcu każdej linii. w pascalu prawdopodobnie najpierw będziesz musiał zadeklarować nowy typ:
type tablica = array[x..y] of double;
i go zwracac


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq, 2011-08-31 17:05
W C# formalnie i tak będzie niepoprawnie bo same deklaracje funkcji (bez definicji) mogą wystąpić jedynie z parametrem extern, partial albo abstract. - msm 2011-08-31 17:32
z C# nie miałem dużo do czynienia więc pewnie masz rację :P - krwq 2011-09-01 10:04

Pozostało 580 znaków

2011-09-01 22:30
0

Ok dzięki za pomoc. Jakby ktoś jeszcze miał jakieś uwagi to chętnie poczytam i będę zaglądał do tego tematu.

Pozostało 580 znaków

2011-09-02 08:28
1

Tak z grubsza, bo nie mam czasu na odpalanie każdego kompilatora:

C

// lancuchy w C to (char *)
void przyjmujelancuch(char *lancuchznakow, int &outLiczba, float *buforFloat, usigned int buforSize, unsigned int &buforLen);

C++

// w C++ obiekty tylko do odczytu przesyłamy jako (const string &)
typedef std::vector<float> FloatVector;
void przyjmujelancuch(const string &lancuchznakow, int &outLiczba, FloatVector &wynik);

Pascal

type tablica = array[x..y] of double;
procedure przyjmujelancuch(const lancuchznakow : String, var liczba: integer, var buforFloat: tablica, var buforLen: integer);

Co do Pascala to zajrzyj tutaj: http://delphi.about.com/od/de[...]ps2007/qt/array_parameter.htm

P.S. Zwracanie struktur w C++ przez return nie należy do najszczęśliwszych, głównie z uwagi na

edytowany 4x, ostatnio: vpiotr, 2011-09-02 11:10
Zwracanie (przez wartość) struktury z dwoma polami to przecież tyle samo roboty co zwracanie jednej wartości i przekazywanie wskaźnika do drugiej. Czemu takie zwracanie uważasz za zły pomysł? - msm 2011-09-02 14:46
Przeca napisałem... - vpiotr 2011-09-02 14:50
No właśnie nie widzę :/ Wycieków pamięci nie ma bo zwracasz przez wartość a co do RVO to strata na szybkości i tak jest niewielka jeśli w ogóle (bo ma tylko dwa pola). Możliwe zresztą że czegoś nie rozumiem bo przed chwilą skończyłem pracę... - msm 2011-09-02 14:54
Aaa, chodzi Ci o taką zwykłą strukturę w sensie "C" bez konstruktorów, tablicy metod itd? No to w zasadzie w taki sposób jest OK, zwłaszcza że przy małym poborze pamięci cała struktura może zostać zapakowana w rejestry. Tylko ja pisałem ogólnie o C++, gdzie struktura = klasa i takie proste struktury to raczej rzadkość. - vpiotr 2011-09-02 15:03
Ok, już rozumiem w takim razie o co Tobie chodziło. W takim razie miło że wyjaśniłeś, EOT ;) - msm 2011-09-02 15:17

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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