Šablony C++

Thomas

Šablony C++
« kdy: 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...


Thomas

Re:Šablony C++
« Odpověď #1 kdy: 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.

Sten

Re:Šablony C++
« Odpověď #2 kdy: 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í.

Thomas

Re:Šablony C++
« Odpověď #3 kdy: 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???

Neviditelný

Re:Šablony C++
« Odpověď #4 kdy: 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.


Sten

Re:Šablony C++
« Odpověď #5 kdy: 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.

Thomas

Re:Šablony C++
« Odpověď #6 kdy: 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.