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

Poprawne zwracanie tablicy o określonej liczbie elementów

Object Storage Arubacloud
0 głosów
526 wizyt
pytanie zadane 22 marca 2017 w C i C++ przez chacken Użytkownik (820 p.)

Jak w poprawny sposób zwrócić z funkcji np. 10 elementową tablice, tak żeby tablica zwracana zapisała się do zmiennej która również jest 10 elementową tablicą.
W pliku z funkcjami mam coś takiego:
 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdlib.h>
#include "header.h"

int menu(){
    int g=0, liczba=0;
    int tab[10];
    printf("Wybierz ktore zadanie pokazac:\n");
    printf("1. zadanie 1\t2. zadanie 2\t3. zadanie 3\t4. zadanie 4\n");
    printf("k. koniec\n");
    switch(getchar()) {
    case '4':
        //o ten moment dokladnie chodzi
        *tab = zad_4_wypelnienie();
        printf("%d\t%d\t%d\t%d\t%d\t%d\t", tab[0],tab[1],tab[2],tab[3],tab[4],tab[5]);
        printf("Jakiej liczby szukac?\n");
        clearIn();
        scanf("%d", &liczba);
        zad_4(tab, liczba);
        break;

A tak wygląda sama funkcja:
 

int* zad_4_wypelnienie() {
    static int tablica[10];
    srand(time(0));
    for(int i = 0; i<10; i++){
        tablica[i]=rand() % 10 + 1;
        printf("%d\t", tablica[i]);
        }
        endl();
    return tablica;
}

Dodam że w pliku nagłówkowym mam prototyp ww. fukncji.
Gdy w taki sposób zwracam tablice to w zmiennej do jakiej ją przypisuję zazwyczaj zgadza się tylko pierwsza liczba a reszta to 0 albo random.

Pomóżcie ;/

2 odpowiedzi

+1 głos
odpowiedź 22 marca 2017 przez mokrowski Mędrzec (155,460 p.)
wybrane 23 marca 2017 przez chacken
 
Najlepsza

Jak nie chcesz alokacji dynamicznej, to jesteś skazany albo na stałą wielkość tablicy albo na tablice VLA które występują tylko w C (nie w C++). Tu masz przykład stałej wielkości (10 elementowej) tablicy oraz VLA. Pamiętaj tylko że brak alokacji dynamicznej ma konsekwencje związane z wielkością tablicy. Nie przekroczysz zajętości ~2 MB (orientacyjnie w zależności od ustawień systemu operacyjnego) bo pamięć jest alokowana jest na stosie.


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

/* Uwaga: Reguła DRY naruszona dla łatwiejszego analizowania
 * pojedynczego przykładu.
 */
typedef int table_t[10];
static const size_t table_length = sizeof(table_t) / sizeof(int);

void fill_table(table_t table) {
    srand(time(NULL));
    for(size_t i = 0; i < table_length; ++i) {
        table[i] = rand() % 10 + 1;
    }
}

void show_table(table_t table) {
    for(size_t i = 0; i < table_length; ++i) {
        printf("%d\t", table[i]);
    }
    putchar('\n');
}

void fill_vla_table(int * table, size_t length) {
    srand(time(NULL));
    for(size_t i = 0; i < length; ++i) {
        table[i] = rand() % 10 + 1;
    }
}

void show_vla_table(int * table, size_t length) {
    for(size_t i = 0; i < length; ++i) {
        printf("%d\t", table[i]);
    }
    putchar('\n');
}

int main(void) {
    table_t table;
    fill_table(table);
    show_table(table);

    printf("Podaj wielkość tablicy VLA: ");
    size_t length;
    scanf(" %lu", &length);
    int table_vla[length];
    fill_vla_table(table_vla, length);
    show_vla_table(table_vla, length);

    return EXIT_SUCCESS;
}

 

komentarz 23 marca 2017 przez chacken Użytkownik (820 p.)
Woah! Dzięki wam! Doszczętnie wytłumaczone na każdy sposób. Właśnie tak chciałem ;)
+1 głos
odpowiedź 22 marca 2017 przez tangarr Mędrzec (154,860 p.)
int* zad_4_wypelnienie() {
    int *tablica = (int*)malloc(10*sizeof(int));
    srand(time(0));
    for(int i = 0; i<10; i++){
        tablica[i]=rand() % 10 + 1;
        printf("%d\t", tablica[i]);
    }
    endl(); 
    return tablica;
}
komentarz 22 marca 2017 przez chacken Użytkownik (820 p.)
edycja 22 marca 2017 przez chacken
Rozumiem że bez alokowania pamięci nie przejdzie :)?

EDIT: A gdzie potem musiałbym zwolnić pamięć? dopiero na samym końcu programu?
komentarz 22 marca 2017 przez criss Mędrzec (172,590 p.)
Gdzie chcesz. Zależy od ciebie.

Podobne pytania

0 głosów
1 odpowiedź 195 wizyt
pytanie zadane 18 października 2017 w PHP przez betman Bywalec (2,630 p.)
0 głosów
3 odpowiedzi 436 wizyt
pytanie zadane 22 lipca 2019 w C i C++ przez Luki78 Początkujący (280 p.)
0 głosów
3 odpowiedzi 1,489 wizyt
pytanie zadane 9 września 2018 w C i C++ przez maria Nowicjusz (200 p.)

92,568 zapytań

141,422 odpowiedzi

319,634 komentarzy

61,956 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!

...