Fórum Root.cz

Hlavní témata => Vývoj => Téma založeno: Thomas 09. 11. 2017, 19:44:38

Název: Šablony C++
Přispěvatel: 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:
Kód: [Vybrat]
#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.

Kód: [Vybrat]
#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:

Kód: [Vybrat]
#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...
Název: Re:Šablony C++
Přispěvatel: Thomas 09. 11. 2017, 19:49:39
oprava .cpp souboru, vložil jsem špatný:

Kód: [Vybrat]
#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.:

Kód: [Vybrat]
#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.
Název: Re:Šablony C++
Přispěvatel: Sten 09. 11. 2017, 20:56:24
Hned na začátku max_prvek je input = param, kde param není inicializované.

Btw. -Wall -Wextra na to upozorní.
Název: Re:Šablony C++
Přispěvatel: Thomas 09. 11. 2017, 21:07:41
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???
Název: Re:Šablony C++
Přispěvatel: Neviditelný 09. 11. 2017, 21:46:51
Co má dělat tohle?
Kód: [Vybrat]
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.
Název: Re:Šablony C++
Přispěvatel: Sten 09. 11. 2017, 22:01:39
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.
Název: Re:Šablony C++
Přispěvatel: Thomas 10. 11. 2017, 09:16:03
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.