Zwracanie tablicy w funkcji.

0

Witam!

Mam problem. Napisałem funkcję w C, która teoretycznie powinna wypełnić tabelę i ją zwrócić, tylko że jak wywołuję ją w main i chcę aby pokazał mi wartość komórki np. tab[4] to pokazuje 0.

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

void wczyt(int N)
{
    int i;
    float* tab[100];

    for(i=1;i<=N;i++)
    {
        printf("Prosze podac wartosc przy x^%d:\n", i);
        scanf("%f", &tab[i]);
    }
    return tab;
}

 

Fukncja główna:

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

int main()
{
    int N;
    float C;
    char n [256];
    float tab[100];
    printf("Program sluzy do obliczania calek oznaczonych metoda Monte Carlo. Uzytkownik zostanie poproszony o podanie kilku niezbednych informacji.\n");

    for(;;)
    {
        printf("Prosze podac stopien wielomianu z przedzialu 0<n<100:\n");
        fgets(n,256,stdin);
        N = atoi(n);

            if (N>99 && N<1)
                {
                    printf("Wprowadzono bledne dane\n");
                }
            if (N<100 && N>0)
            {
                break;
            }

    }

   printf("Prosze podac wartosc wyrazu wolnego:\n");
    scanf("%f", &C);

    wczyt(N);

        printf("%f", tab[4]);
	return 0;
}

 
1

Utworzyłeś sobie tablicę stu wskaźników na float (sto elementów float*), a nie wskaźnik na tablicę.

0

Czyli powienienem wrzucić

float *tab[100] 

?. Jeśli tak to całość się rypie.

0
float * wczyt(int N)
{
    int i;
    float tab[100];
 
    for(i=1;i<=N;i++)
    {
        printf("Prosze podac wartosc przy x^%d:\n", i);
        scanf("%f", &tab[i]);
    }
    return tab;
}
 

To powinno być tak

0

Wrzuciłem i nadal w fukcji głównej mi nie wypisuje tab[4]

0

Nigdzie nie zapisujesz zwracanego wskaźnika z funkcji wczyt().

0
 if (N>99 && N<1)

W jakim przypadku N może być jednocześnie mniejsze od 1 i większe od 99? :P
W funkcji wczyt masz float* tab[100]; - chyba jednak nie chodziło Ci o tablicę stu wskaźników na float, prawda? Zresztą, kompilator powinien Cię ostrzec, że coś jest nie tak:

$ gcc --pedantic -Wall -Wextra -std=c11 wczyt.c
wczyt.c: In function 'wczyt':
wczyt.c:12:17: warning: format '%f' expects argument of type 'float *', but argument 2 has type 'float **' [-Wformat=]
         scanf("%f", &tab[i]);
                 ^
wczyt.c:14:12: warning: 'return' with a value, in function returning void
     return tab;
            ^~~
wczyt.c:4:6: note: declared here
 void wczyt(int N)
      ^~~~~ 

Prześlij wskaźnik na float jako parametr funkcji wczyt. Albo jeszcze lepiej:

void wczyt(int N, float tab[restrict static 100]) { ... }
0

Rzeczywiście w tamtym warunku jest błąd :D Poprawiłem. Kompilator kompiluje i na nic nie patrzy. Po wprowadzeniu

  float tab[restrict static 100]

do warunkow funcji, jakgdyby źle odczytuje N. Okreslam N jako 4, a program kończy działanie po N=1 z returnem -1 (0xFFFFFFF)... Jak próbuję poprawić według waszych wskazówek do za każdym razem się krzaczy.

0
void wczyt(int N, float tab[restrict static 100]) {
    for(int i=1; i<=N; i++) {
        printf("Prosze podac wartosc przy x^%d:\n", i);
        scanf("%f", &tab[i]);
    }
}

//w main
wczyt(N, tab);

To restrict static znaczy tam tyle, że tab ma być wskaźnikiem na istniejącą pamięć (nie NULL! ...chociaż pewnie się skompiluje jak prześlesz NULL, ale będzie to błąd), która to pamięć musi być wystarczająco duża, żeby pomieścić przynajmniej 100 floatów (innymi słowy, tab ma być wskaźnikiem na pamięć przynajmniej 100-elementowej tablicy float).

0

Ok. Zrobiłem wedle wskazówek, wskazałem na taba w main o rozmiarze 100, ale nadal mi nie przepisuje wartosci z wczyt do taba z main. Drukuje 0.

0

No to coś robisz inaczej niż ja.

int main(void) {
	float tab[100];
	wczyt(5, tab);
	printf("%f", tab[4]);
} 
$ gcc --pedantic -Wall -Wextra -std=c11 wczyt.c && ./a
Prosze podac wartosc przy x^1:
11.1
Prosze podac wartosc przy x^2:
22.2
Prosze podac wartosc przy x^3:
33.3
Prosze podac wartosc przy x^4:
44.444
Prosze podac wartosc przy x^5:
55.5
44.444000 
0

Robię to identycznie, z tym, że po prostu wczytuję N od użytkownika zwykłym scanfem. Może to kwestia codeblocks'a?

0

No to debugger w łapę i do roboty! :P

0

Dobra. Umieściłem po prostu pętlę z wczyt.c do maina i wszystko działa. Coś musiałem namieszać w tych wskaźnikach. Coś jeszcze pokombinuję ;)

0

Może to trochę offtopic ale czemu najpierw piszesz że proszę wprowadzić liczbę 0 < n < 100 A potem sprawdzasz czy nie jest mniejsza niż 1 lub większa niż 99? Przecież 0.0000000000000000000001 jest większe od 0 ale mniejsze od 1 :D

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