Diskuze: extern array[variable]
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.

Člen

Zobrazeno 6 zpráv z 6.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí C++, jsme si ověřili nabyté zkušenosti z kurzu.
Takto vytvářet pole o velikosti rovno hodnotě zadané proměnné nelze.
Správně by bylo scanf("%d", &velikost_pole);
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é.
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
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
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;
}
Po vypnuti notebooku a opetovnem zapnuti hlaska zmizela, takze jeste neumim pracovat s IDE.
Zobrazeno 6 zpráv z 6.