Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.
Pouze tento týden sleva až 80 % na e-learning týkající se Swiftu. Zároveň využij výhodnou slevovou akci až 30 % zdarma při nákupu e-learningu - více informací.
discount 30 + hiring
Avatar
Michal Pánek:14.10.2021 20:05

pouzit pole v jinem modulu

Zkusil jsem: zkousel jsem:

main.c
/*
int velikost_pole;
scanf("%d", velikost_pole);
int pole_cisel[ve­likost_pole];
/
main.h
/

extern int velikost_pole;
extern int pole_cisel[ve­likost_pole]; // no ale zde mi to u promenne velikost_pole pise, ze to neni konstanta
*/

Chci docílit: Chci, abych pole o velikosti zadane promennou mohl pouzit i v jinych modulech

 
Odpovědět
14.10.2021 20:05
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Pánek
DarkCoder:15.10.2021 3:59

Takto vytvářet pole o velikosti rovno hodnotě zadané proměnné nelze.

  1. Pokud načítám hodnotu pomocí funkce scanf(), je třeba předávat adresu proměnné a nikoli hodnotu.

    Správně by bylo scanf("%d", &velikost_pole);

  2. Pokud vytvářím pole za běhu, je třeba pole vytvářet dynamicky za použití funkci malloc() nebo calloc().

    Pokud bychom chtěli vytvořit pole staticky, je třeba, aby rozměr pole byl konstantní výraz známý v době překladu.

    Lze použít instrukci preprocesoru #define nebo výčtový typ enum. Nelze použít modifikátor typu const.

    To ovšem nemá smysl, pokud chceš, aby byl rozměr pole určen za pomoci zadávané hodnoty proměnné.

  3. Aby bylo možné se na proměnné odkazovat z jiného souboru pomocí klíčového slova extern, je třeba, aby proměnné pole a

    rozměr pole byly deklarovány jako globální, tedy vně všech funkcí.

Jak používat pole v jiných modulech ukazuje následující příklad.

Mějme tři soubory - hlavní modul main.c, druhý modul func.c a třetí modul hlavičkový soubor func.h. V hlavním modulu jsou globálně deklarovány dvě proměnné, size a ukazatel na int pro dynamicky vytvořené pole. Poté je požadováno zadání celočíselné hodnoty představující rozměr pole. Následně je dynamicky vytvořeno pole o velikosti zadané hodnotě pomocí funkce malloc(). Poté jsou volány dvě funkce z modulu func.c (fill_arr() a print_arr()). Naplnění pole hodnotami rovno danému indexu a vypsání velikosti pole (pro kontrolu) a obsahu pole. První funkce přebírá parametry, druhá pro ukázání použití proměnných deklarovaných z jiného modulu (main.c), záměrně bez parametrů. Modul func.h obsahuje odkazy na použití proměnných z jiného modulu za pomocí klíčového slova extern a prototypy funkcí definovaných v modulu func.c. Při předání řízení programu funkci print_arr() jsou využívány proměnné definované v hlavním modulu main.c. Nakonec je uvolněna alokovaná paměť pomocí funkce free().

main.c

#define _CRT_SECURE_NO_WARNINGS

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

int size;
int* arr = NULL;

int main(void) {

        printf("Zadej rozmer pole: ");
        scanf("%d", &size);

        if (size < 1) exit(1);

        arr = (int*)malloc(size * sizeof(int));
        if (!arr) exit(2);

        fill_arr(arr, size);
        print_arr();

        free(arr);
        arr = NULL;

        return 0;
}

func.c

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

void fill_arr(int* array, int size_array) {
        for (int i = 0; i < size_array; i++) *(array + i) = i;
}

void print_arr(void) {
        printf("%d - ", size);
        for (int i = 0; i < size; i++) printf("%d ", *(arr + i));
}

func.h

#ifndef FUNC_H
#define FUNC_H

extern int size;
extern int *arr;

void fill_arr(int* array, int size_array);
void print_arr(void);

#endif
Akceptované řešení
+20 Zkušeností
+1 bodů
Řešení problému
Nahoru Odpovědět
15.10.2021 3:59
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
Michal Pánek:15.10.2021 8:34

moc dekuji

 
Nahoru Odpovědět
15.10.2021 8:34
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Michal Pánek:17.10.2021 23:26

Mohu se jeste zeptat ?
Proc mi funguje kus kodu

int *pole_cisel = NULL;
pole_cisel = ((int *) malloc(velikost_pole * sizeof(int)));
if (!pole_cisel) exit(1);

ale tento ne

if ((pole_cisel = ((int *) malloc(velikost_pole * sizeof(int)))) == NULL){
    fprintf(stderr, "málo místa\n");
    exit(1);
}

v prvnim radku je podtrzena promenna pole_cisel a vscode mi k tomu dodava:

assignment to 'int' from 'int' makes pointer from integer without a cast [-Wint-conversion] gcc

 
Nahoru Odpovědět
17.10.2021 23:26
Avatar
DarkCoder
Člen
Avatar
Odpovídá na Michal Pánek
DarkCoder:18.10.2021 11:25

I druhý úryvek kódu je naprosto v pořádku a to za předpokladu, že si při modifikaci kódu nechtěně nepozměnil datové typy proměnných. VSCode nepoužívám a tak pro lepší analýzu sem připoj celý kód, včetně deklarací i hlavičkových souborů.

Popřípadě si ověř správnou funkčnost a chování překladače na následujícím kódu:

#include <stdlib.h>

int main(void) {

        int* val = NULL;

        if ((val = (int*)malloc(sizeof(int))) == NULL) exit(1);

        free(val);
        val = NULL;

        return 0;
}
Nahoru Odpovědět
18.10.2021 11:25
"Chceš-li předávat své znalosti, měj kvalitní podklady."
Avatar
Odpovídá na DarkCoder
Michal Pánek:20.10.2021 20:58

Po vypnuti notebooku a opetovnem zapnuti hlaska zmizela, takze jeste neumim pracovat s IDE.

 
Nahoru Odpovědět
20.10.2021 20:58
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 6 zpráv z 6.