Hallo,
habe eine Frage zu C.
Ich initialisiere ein int array[3] und verwende darauf sizeof(array).
Dabei erhalte ich 12 (= 3*4bit) was Sinn macht.
Nun übergebe ich den Pointer data an eine Funktion und will
intern wieder diese 12 bestimmen.(zur Fehlerkontrolle)
allerdings erhalte ich sowohl bei sizeof(data) oder sizeof(*data) = 4.
Wie komm ich an die 12 ran?
Gruß
Jan
> Ich initialisiere ein int array[3]...> Dabei erhalte ich 12 (= 3*4bit) was Sinn macht.
Macht keinen Sinn. Ein int ist in .NET 32-Bit, und auf nem "normalen"
System 16-Bit. Daher vermute ich, dass du .NET programmierst, was dann
korrekt ist:
3x 32-Bit = 3x 4 Byte = 12
> Nun übergebe ich den Pointer data an eine Funktion und will> intern wieder diese 12 bestimmen.(zur Fehlerkontrolle)> allerdings erhalte ich sowohl bei sizeof(data) oder sizeof(*data) = 4.
Zeig doch mal, WIE du übergibst.
Ralf
Oh ja,
du hast recht es sind 3*4 Byte.
übergeben tue ich so: (also die Funktionsdefinition)
function(WORD *data)
prinzipiell will ich genau das tun, was tuppes implementiert hat.
Folglich scheint das nich zugehen ohne, dass ich die Länge übergebe.
Jan S. schrieb:> Folglich scheint das nich zugehen ohne, dass ich die Länge übergebe.
Richtig.
Und webnn du dir die Funktionssignatur ansiehst
function(WORD *data)
dann steht da auch warum. Die Funktion erhält nur noch einen Pointer.
Die weiß nichts von einem Array.
Noch ein genereller Hinweis zu sizeof(): Dieser Operator wird bereits
zum Kompilierzeitpunkt ausgewertet. Daher wirst du den niemals zur
Fehlerkontrolle einsetzen können. Arrays musst du in C fast immer mit
einer Längenangabe ausstatten, sonst ist diese Information verloren. Die
Ausnahme sind Strings (char[]), die definitionsgemäss per Nullbyte
abgeschlossen werden. Das lässt sich natürlich auch für andere Arrays
anwenden, ist aber eher unüblich.
Gruss,
Philipp
>> Macht keinen Sinn. Ein int ist in .NET 32-Bit, und auf nem "normalen">> System 16-Bit.> also bei mir ist ein int auch 32bit unter c,c++.
Ähm... Okay, sorry, wieder was gelernt. Kann sein, dass ich bei der
Antwort entweder noch in Uralt-16Bit-PC-Zeiten war, oder
(wahrscheinlicher) bei meinem C-Compiler für Microcontroller :)
Ralf
>> Das bringt gar nichts. Die 10 wird ignoriert, also ist das das gleiche> wie [...]
War so auch nicht gemeint. War eher so gemeint, dass man Länge 10
annimmt und der Compiler im Zweifelsfall meckert. Verlangt natürlich
nach etwas Disziplin.
Sven P. schrieb:> War so auch nicht gemeint. War eher so gemeint, dass man Länge 10> annimmt und der Compiler im Zweifelsfall meckert. Verlangt natürlich> nach etwas Disziplin.
Gibt es Compiler, die da meckern?
Rolf Magnus schrieb:> Sven P. schrieb:>> War so auch nicht gemeint. War eher so gemeint, dass man Länge 10>> annimmt und der Compiler im Zweifelsfall meckert. Verlangt natürlich>> nach etwas Disziplin.>> Gibt es Compiler, die da meckern?
Mir ist keiner bekannt, deshalb ja die Disziplin :-)
Ne, sollte man vermutlich eher als Konvention verstehen, die Sache
lesbar zu machen. Natürlich ginge auch ein einfacher Zeiger (int *),
aber dann sieht man nicht mehr auf den ersten Blick die geforderte
(Mindest-)Länge.
in C++ könnte man die Array-Länge als Template-Parameter vom Compiler
automatisch einfüllen lassen, mit Konstrukten wie:
1
namespace{
2
template<typenametext>
3
classsomething_i{};
4
5
template<intlen>
6
classsomething_i<char[len]>{
7
public:
8
staticvoiddo_something(constcharop[len]){
9
for(inti=0;i<len;++i){...}
10
}
11
};
12
}
13
template<typenametext>
14
voiddo_something(consttext&op){
15
something_i<text>::do_something(op);
16
}
17
18
....
19
20
do_something("Hallo Welt");
Würde in den Beispiel ein strlen einsparen, und trotzdem mit "\000"
innerhalb der String-Konstante funktionieren.
Aber wenn man eh C++ nimmt, geht das alles sowieso viel besser mit
std::vector, std::string &co.
Sven P. schrieb:> Rolf Magnus schrieb:>> Sven P. schrieb:>>> War so auch nicht gemeint. War eher so gemeint, dass man Länge 10>>> annimmt und der Compiler im Zweifelsfall meckert. Verlangt natürlich>>> nach etwas Disziplin.>>>> Gibt es Compiler, die da meckern?>> Mir ist keiner bekannt, deshalb ja die Disziplin :-)
Und genau aus dem Grund halt ich diese [] Schreibweise in Argumentlisten
für problematisch: Sie suggeriert etwas, was einfach nicht stimmt.
So kann man das auch sehen. Aber Makros suggerieren auch etwas, das
nicht ist.
Katze -> Schwanz :-}
Die Schreibweise mit [] im Prototyp hat hingegen doch einen Sinn. Dann
nämlich, wenn die Vektorlängen eine Rolle spielen, etwa bei
mehrdimensionalen Vektoren. Dann erspart man sich Zeigerrechnung.