Fórum Root.cz
Hlavní témata => Vývoj => Téma založeno: Thomas 09. 11. 2017, 19:44:38
-
Čauves,
potřebuji poradit s použitím šablon a polí v C++.
Stručně: Mám šablonu pro funkci, která mi má naplnit pole, jako argument funkce mám referenci na pole, velikost pole získávám pomocí size_t. Data do toho cpu ručně, ale vypisuje to blbosti.
Víc snad řekně zdroják.
.h soubor:
#ifndef PROTOTYP_HPP
#define PROTOTYP_HPP
#include <stddef.h>
template <class A, size_t size>
void max_prvek(A (&arr)[size], A &input);
#endif
.cpp kód samotné šablony fce.
#include <cstdlib>
#include <iostream>
#include <stddef.h>
#include "prototyp.hpp"
template <class A, size_t size>
void max_prvek(A (&arr)[size], A &input) {
A param;
input = param;
for(size_t i = 0; i < size; i++) {
arr[i] = param;
// std::cout << "Parametry: " << arr[i] << std::endl;
}
std::cout << "Parametry: " << arr[i] << std::endl;
};
a main .cpp:
#include <cstdlib>
#include <iostream>
#include "prototyp.hpp"
#include "max_prvek.cpp"
int main(int argc, char** argv) {
int size_ar;
int array[size_ar];
int inputs_par;
std::cout << "definujte velikost pole: " << std::endl;
std::cin >> size_ar;
std::cout << "Vlozte prvky pole: " << std::endl;
std::cin >> inputs_par;
max_prvek(array, inputs_par);
return 0;
}
Nechci, aby to někdo řešil za mne, ale chci, aby mi někdo pomohl objasnit kde dělám chybu a jak jim předejít při použití šablon. Já tohle z ANSI C neznám...
-
oprava .cpp souboru, vložil jsem špatný:
#include <cstdlib>
#include <iostream>
#include <stddef.h>
#include "prototyp.hpp"
template <class A, size_t size>
void max_prvek(A (&arr)[size], A &input) {
A param;
input = param;
for(int i = 0; i < size; i++) {
arr[i] = param;
std::cout << "Parametry: " << arr[i] << std::endl;
}
};
Tento je správně jako šablona.
a tento jako main.:
#include <cstdlib>
#include <iostream>
#include "prototyp.hpp"
#include "max_prvek.cpp"
int main(int argc, char** argv) {
const int size_ar = 9;
int array[size_ar];
int inputs_par;
std::cout << "Vlozte prvky pole: " << std::endl;
std::cin >> inputs_par;
max_prvek(array, inputs_par);
return 0;
}
Díky.
-
Hned na začátku max_prvek je input = param, kde param není inicializované.
Btw. -Wall -Wextra na to upozorní.
-
Hned na začátku max_prvek je input = param, kde param není inicializované.
Btw. -Wall -Wextra na to upozorní.
Mám tam A param;
Píšu to v netbeans a ty mi to přeloží bez problémů, což je teda divné..
Nicméně mám odstranit ty reference na proměnné v argumentech té funkce max_prvek???
-
Co má dělat tohle?
void max_prvek(A (&arr)[size], A &input) {
A param;
input = param;
Do funkce předáš referencí parametr input, jeho hodnotu pak změníš na hodnotu proměnné param, která není nikde inicializovaná. Tím neinicializovaným paramem pak inicializuješ prvky toho pole, což může samozřejmě dopadnout jakkoliv.
-
Mám tam A param;
Definice primitivních typů není inicializace (a to ani v ANSI C).
Píšu to v netbeans a ty mi to přeloží bez problémů, což je teda divné..
NetBeans používá GCC, kam je potřeba přidat ty parametry -Wall -Wextra.
Kód s varováními se bez problémů přeloží. Varování nezastaví překlad (pokud nepoužijete -Werror), ale upozorňují na místa, kde se program může chovat jinak, než programátor zamýšlel.
-
Mám tam A param;
Definice primitivních typů není inicializace (a to ani v ANSI C).
Píšu to v netbeans a ty mi to přeloží bez problémů, což je teda divné..
NetBeans používá GCC, kam je potřeba přidat ty parametry -Wall -Wextra.
Kód s varováními se bez problémů přeloží. Varování nezastaví překlad (pokud nepoužijete -Werror), ale upozorňují na místa, kde se program může chovat jinak, než programátor zamýšlel.
Všem děkuji za ochotu, už tu chybu vidím, chyba ze zbrklosti.
U těch netbeans se na to ještě podívám, já používám jejich defaultní nastavení gcc.