sizeof(Parameter einer Funktion)
-
lucky_tux schrieb:
Übergabe via Call by Value:
void give_out(char c[])Kommt immer noch 4 raus. Wenn, dann mit templates, oder sonst einfach nen vector nehmen.
#include <iostream> void give_out(char c[]) { std::cout << sizeof(c) << std::endl; } template <int size> void GiveOut(char (&c)[size]) { std::cout << sizeof(c) << std::endl; } int main() { char x[123]; give_out(x); GiveOut(x); }4 123mfg.
-
Aloha,
erstmal vielen dank für die schnellen Antworten.
So wie es aussieht wird es wohl auf std::string rauslaufen, auch wenn mir das noch nicht so zusagt.
Rein von der wissbegierde nun:
#include <iostream> using namespace std; void give_out(char c[]) { cout << c; cout << "\nsizeof: " << sizeof(c); // wieso kommt hier nicht 2048, sondern die 4 der lokalen Kopie c... cout << "\nstrlen: " << strlen(c); } int main() { char c[2048]; c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = 'd'; give_out(c); cin.get(); return 0; }... mag sein dass ich einfach schon zu lange vor der Kiste sitze, aber auch damit klappt es nicht.
MfG
-
da war jemand schneller .
-
@VerdammteKopie
Siehe mein Post. Das mit den Templates sollte ne gute Möglichkeit sein für dich.
mfg.
-
Warum soll die Variante mit Call by Value nicht funktioniert. Habe ich ausgetestet und es kam das korrekte Ergebnis heraus. Wodran könnte es liegen, dass bei dir die falschen Werte ausgegeben werden?
-
Vielen dank

Nur noch eine Frage, da ich bisher leider noch nicht mit Templates gearbeitet habe. Wie würde ein Prototyp solch eines Templates + Funktion aussehen und wie würde dieser Prototyp in eine Klasse eingebaut werden?
//hmmm... ? template <int size> void give_out(char[size]);MfG
-
Tschuldigung für den Doppel-Post, hatte nicht aktualisiert.
@lucky_tux
Also bei mir kam leider Gottes wieder die verfluchte 4.
Wenn das bei dir ohne weiteres klappt muss es mit dem System zusammenhängen.
Vielleicht löst es auch dein Compiler anderst auf?Ich habe hier ein Intel x86 Chip, Windows und MS VC++.Net ...
MfG
-
Asche über mein Haupt mir ist ein recht dummer Fehler beim kompilieren unterlaufen. Es liegt weder an der Plattform noch am Compiler.
Die vorgestellte Lösung mit den Templates scheint problemlos zu funktionieren.

-
VerdammteKopie schrieb:
Vielen dank

Nur noch eine Frage, da ich bisher leider noch nicht mit Templates gearbeitet habe. Wie würde ein Prototyp solch eines Templates + Funktion aussehen und wie würde dieser Prototyp in eine Klasse eingebaut werden?
//hmmm... ? template <int size> void give_out(char[size]);MfG
So:
template <int size> // Der Name size ist nicht dringend void give_out(char (&arrname)[size]) { // arrname ist der Name des Parameters //... }Bei dir:
template <int size> void give_out(char (&c)[size]) { cout << c; cout << "\nsizeof: " << sizeof(c); cout << "\nstrlen: " << strlen(c); }@lucky_tux
Welchen Compiler hast du? Ich hab MinGW.mfg.
edit: Okay, dann ist ja alles klar.
-
Vielen dank allerseits

Ich wünsche eine Gute Nacht.
-
Es tut mir leid, aber irgendwie lässt es mir keine Ruhe.
Es funktioniert alles soweit, bis ich anfange, dass auf meine Winsock Klasse zu übertragen. Das ganze vereinfacht ist folgendes:
// main.cpp: #include "head.h" // Nichtaufgeloestes Symbol? ... int main() { char c[2048]; c[0] = 'a'; c[1] = 'b'; c[2] = 'c'; c[3] = 'd'; give_out(c); cin.get(); return 0; }// head.h: #include <iostream> using namespace std; template <int size> void give_out(char (&c)[size]);//func.cpp: template <int size> void give_out(char (&c)[size]) { cout << c; cout << "\nsizeof: " << size; // wieso kommt hier nicht 2048, sondern die 4 der lokalen Kopie c... cout << "\nstrlen: " << strlen(c); }Und nun passiert folgendes, der Linker meldet:
parameter error LNK2001: Nichtaufgeloestes externes Symbol "void __cdecl give_out<2048>(char (&)[2048])" (?give_out@?$@$FYAXAAY0IAA@D@Z)
Wie immer die 2 Fragen:
- Wieso? Das Ding ist doch aufgelöst!
- Wie behebe ich die Sache?MfG
-
Templates kann der Compiler nur auflösen, wenn er den Quellcode und den Aufrufcode an einem Ort hat. Bei deiner Konstellation kann er in der "func.cpp" nicht wissen, ob er im Endeffekt give_out<10>(), give_out<1024>() oder give_out<-50>() benötigen wird (und ehe er alle Möglichkeiten implementiert (das braucht zu viel Platz), überspringt er es gleich. In der "main.cpp" weiß der Compiler, daß er die give_out<2048>() benötigt - aber er hat keine Ahnung, wie die aussehen soll, da er nur den Prototyp kennt.
(aus dem Grund werden Templates grundsätzlich direkt in den Header geschrieben)
-
Hallo
das alte Problem : Template-Implementationen müßen wie die Deklarationen im Header stehen, damit sie vom Compiler für andere Übersetzungseinheiten benutzt werden können.
/Edit : zu langsam...
bis bald
akari
-
lucky_tux schrieb:
Übergabe via Call by Value:
void give_out(char c[])Du hast ja bereits selbst gemerkt, dass das nicht funktioniert. Es ist praktisch das Gleiche wie
void give_out(char* c)Halt nur eine andere Schreibweise.
@VerdammteKopie
An deiner Stelle würde ich der give_out Funktion einen zweiten Parameter spendieren, der die Grösse des Arrays angibt. Die Template Version funktioniert zwar auch, aber nur solange, wie die Grösse eine compile-time Konstante ist. Dynamische Arrays kannst du damit vergessen.