teo
Πολύ δραστήριο μέλος





Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Subject to change
e-steki.gr Founder



Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


Ποια θα ειναι η γενικη μορφη της function template(γενικη συναρτηση που μπορει να υποστηριζει πολλους τυπους δεδομενων.)
Εχω μπερδευτει λιγο γι΄αυτο αμα μπορεις να βοηθησεις!
π.χ εστω οτι θελω να υπολογισω τον Μ.Ο για τους παρακατω τεσσερις πινακες:
char chrArr[]={1,3,5,9,11,13};
int intArr[]={1,3,5,9,11,13};
long lonArr[]={1L,3L,5L,9L,11L,13L};
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
Αυτη η γενικη συναρτηση(function template) θα πρεπει να υπολογιζει τον Μ.Ο για τις παραπανω περιπτωσεις.
Δηλ. αντι να γραψω τεσσερις διαφορετικες συναρτησεις(μια για καθε τυπο δεδομενων) θελω να γραψω μια γενικη συναρτηση(function template) που θα υπολογιζει το μεσο ορο των περιεχομενων ενος πινακα. Αρα η συναρτηση(function template) θα πρεπει να υποστηριζει μεταβλητες τυπου int ,long,double και char.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Subject to change
e-steki.gr Founder


Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


για να το ψαξω λιγακι
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Γιώργος
Τιμώμενο Μέλος


Θα το δω λίγο τώρα.

Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
netharis
Νεοφερμένο μέλος


template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Γιώργος
Τιμώμενο Μέλος


Από καθαρή περιέργεια, ο αντίστοιχος κώδικας στη C ποιος θα ήταν; Δηλαδή μία συνάρτηση για όλα;Μπορείς να δηλώσεις τη συνάρτηση με αυτό το τρόπο:
template <class P>
P foo(P a[])
{
//κώδικας εδώ
return mesos_oros;
}
Καλωσήρθες στην παρέα μας.

Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
netharis
Νεοφερμένο μέλος



Σε C δεν υπάρχει τύπος συνάρτησης που είναι ικανός να χειρίζεται, όλους τους τύπους δεδομένων (ουσιαστικά να μετατρέπει).
Υποθέτω μπορείς να το υλοποιήσεις, με ένα κοινό όνομα συνάρτησης, και με κάποια typedef στο τύπο που θές. (κατα πάσα περίπτωση σε preprocessor directive). Γενικά πάντως η C δεν σου παρέχει αυτή την ευκολία.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.


πχ,
void function(void *arg){
int type; /* o τύπος που θες να μετατρέψεις */
type= *((int *)arg); /*μετατροπή του void ορίσματος στο επιθυμητό */
printf("%d",type);
}
Καλώς ήρθες.

Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.


Ένα παράδειγμα με templates.
Το template θα φροντίσει για τους τύπους των δεδομένων σου.Οπότε θα χρειαστεί μόνο να ορισεις την αρχικη συνάρτηση.
Το μονο που θα πρέπει να φροντίσεις είναι να ελέγχεις το μήπως των arrays σου.(περνώντας το μήκος ως όρισμα).
Χρόνια πολλά.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


using namespace std;
template<class atype,class btype>
btype mesos_oros(atype* array, btype size)
{
btype sum=0; //βοηθητική μεταβλητή.
for(btype j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //Μέσος όρος.
}
int intArr[]={1,3,5,9,11,13};
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
int main()
{
cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
return 0;
}
Εξοδος προγραμματος:
ΜΟ= 7
ΜΟ= 7(εδω κανονικα θα επρεπε να μου δωσει 7.0, δεν γινεται σωστα η μετατροπει απο int σε double)
Αμα μπορει κανεις να βοηθησει!
Ευχαριστώ!
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.


Για να δεις οτι δουλευει σωστα το πρόγραμμα σου βάλε στο πρωτο στοιχείο του πινακα 1.01 και τρεξε το.
Αυτό που μπορεις να κανεις ειναι να μορφοποιείς την έξοδο σου σε ακριβεια δεκαδικών ψηφιων μετα την υποδιαστολη.
Ο κωδικας που το κανει αυτο ειναι :
std::cout.setf(ios::fixed, ios::floatfield);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
#include<iostream>
using namespace std;
template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή.
for(int j=0;j<size;j++)
sum+=array[j];
return sum/size; //Μέσος όρος.
}
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


#include<iostream>
using namespace std;
template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή.
for(int j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //μέσος όρος.
}
int intArr[]={1,3,5,9,11,13};
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
int main()
{
std::cout.setf(ios::fixed, ios::floatfield);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
return 0;
}
Και ΜΟ=7.00 για τον πινακα τυπου double
το προγραμμα αυτο βγαζει ΜΟ=7.00 και για τους δυο πινακες οι οποιοι ο καθενας εχει διαφορετικο τυπο δεδομενων
ΕΥΧΑΡΙΣΤΟ!
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος



Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.


Μπορει να σε βοηθήσει αυτό
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


using namespace std;
template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή.
for(int j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //μέσος όρος.
}
int intArr[]={1,3,5,9,11,13};
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
int main()
{
cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
std::cout.setf(ios::fixed, ios::floatfield);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
return 0;
}
ολα οκ ευχαριστω πολυ!
εξοδος προγραμματος:
ΜΟ= 7
ΜΟ= 7.00
:clapup::clapup::clapup:
:):):)
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.


Απο κει και κατω αμα πας να τυπωσεις κατι αλλο θα βγει και αυτο με 2 δεκαδικα ψηφια μετα την υποδιαστολη.Αν χρειαστει να εκτυπωσεις κατι αλλο απο εκει και περα θα χρειαστει να ξανατροποποιησεις την εξοδο.
Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
teo
Πολύ δραστήριο μέλος


using namespace std;
template<class atype,class btype>
float mesos_oros(atype* array, btype size)
{
float sum=0.0; //βοηθητική μεταβλητή
for(int j=0;j<size;j++)
sum=sum+array[j];
return(sum/size); //μέσος όρος
}
int intArr[]={1,3,5,9,11,13};
double dubArr[]={1.0,3.0,5.0,9.0,11.0,13.0};
long lonArr[]={1L,3L,5L,9L,11L,13L};
char chrArr[]={1,3,5,9,11,13};
int main()
{
cout<<"\n MO= "<<mesos_oros<int>(intArr,6);
cout<<"\n MO= "<<mesos_oros<long>(lonArr,6);
cout<<"\n MO= "<<mesos_oros<char>(chrArr,6);
std::cout.setf(ios::fixed, ios::floatfield);
std::cout.setf(ios::showpoint);
std::cout.precision(2);
cout<<"\n MO= "<<mesos_oros<double>(dubArr,6);
return 0;
}
εξοδος:
ΜΟ= 7 (Integer)
MO= 7 (long)
MO=7 (char)
MO=7.00 (double)



Σημείωση: Το μήνυμα αυτό γράφτηκε 17 χρόνια πριν. Ο συντάκτης του πιθανόν να έχει αλλάξει απόψεις έκτοτε.
Χρήστες Βρείτε παρόμοια
-
Φορτώνει...
-
Το forum μας χρησιμοποιεί cookies για να βελτιστοποιήσει την εμπειρία σας.
Συνεχίζοντας την περιήγησή σας, συναινείτε στη χρήση cookies στον περιηγητή σας.