Sehe ich das richtig, das man mit int Testarray[7]={0}; zwar alle Felder mit 0 vorbelegen kann aber nicht mit int Testarray[7]={5}; alle Felder mit 5 vorbelegt werden? warum?!
Ramon schrieb: > alle Felder mit 5 vorbelegt werden? ja, ist so. > warum?! Weil die angebenene Werte verwendet werden, und ein eventueller Rest implizit mit Nullen aufgefüllt wird. So ist es nun mal :-)
:
Bearbeitet durch User
tatsächlich sind die reslichen udefiniert. Habe es eben mal getestet... Zufällig hatte ich anfangs auch immer 0..aber eben das war nur Zufall.. Das hasse ich an C!! Bei Sprachen wie Pascal gibt es NUR richtig oder falsch.. In C gibt es dann noch..funktioniert...kann funktionieren...ist aber nicht richtig..irgendwann eghts in die Hose...
Ramon schrieb: > Bei Sprachen wie Pascal gibt es NUR richtig oder falsch.. Deswegen programmiert ja auch die ganze Welt in pascal, und nur ein paar Deppen in C... > In C gibt es dann noch..funktioniert...kann funktionieren...ist aber > nicht richtig..irgendwann eghts in die Hose... Nein, da liegst du falsch. In C ist ein Verhalten definiert, dann kann man sich drauf verlassen, oder es ist nicht definiert, dann kann man sich nicht drauf verlassen. So einfach ist das. Das überfordert aber offensichtlich Pascal-Programmierer :-)
Ramon schrieb: > Das hasse ich an C!! Na ja, du kennst wohl einigermaßen Pascal und wunderst dich nun, dass du bei etwas Anspruchsvollerem mit der Methode "hier und da im Internet etwas aufschnappen" nicht weit kommst. Besorge dir mal ein vernünftiges Buch und den Standard (oder zumindest einen kostenlosen Draft), sonst wird so etwas immer wieder passieren.
öhm..weil C einfach geschichtlich am weitestehend verbreitet ist? Weil wenn alle es benutzen, ich als Angestellter nicht sagen kann, nö ich nehem nicht C?!? Weil sich nicht immer das bessere durchsetzt?(Wobei ist das jetzt nicht mal auf C oder Pascal beziehen möchte, denn tatsächlich hat C natürlich seine stärken und flexibilität die Pascal bei weitem nicht hat, dafür kann man bei Pascal einfach davon ausgehen das es fehlerfreier ist!) " dann kann man sich nicht drauf verlassen. " lol und das findest Du jetzt gut oder was ? :-) Was an meiner Aussage war denn dann falsch..Du sagst man kann sich nicht drauf verlassen und ich sage..irgendwann gehts in die Hose..erklär mir jetzt mal den unterscheid :-) Nein danke, dann doch lieber nur richtig oder falsch! "Deswegen programmiert ja auch die ganze Welt in pascal, und nur ein paar Deppen in C..." dieser Satz wiederum offenbart mir, das eine Diskussion mit Dir nicht zielüführend sein wird. Weder bezcihne ich C Leute als Deppen noch behaupte ich das Pascal der heilige Gral ist.. Es gibt nunmal nicht nur schwarz oder weiß..aber diese Eigenschaften nerven nunmal an C! Falls Du mal länger und umfangreicher mit PAscal (nicht version 4 oder sowas) gearbeitet hast auch in der Schule, kannst Du sicher auch offener damit umgehen. Ich habe etwas mit Basic (als Kind auf einem Schnedier CPC6128) dann Pascal eben auf diesem CPC und seite einigen jahren schaue ich immer mal wieder rüber zu C...aber gerade für die mikcrocontroller scheint mir C eigentlich nicht so gut geeignet wie viele hier meinen. Klar, der totale nerd, bekommt sicher 1a C Programme hin, und der ist hier sicher auch gut aufgehoben, aber 80% der Gelegenheits und Hobbyprogrammeirer werden wohl die meiste Zeit mit der Fehlerbeseitigung der C geschichten beschäftigt sein..
Ramon schrieb: > dafür > kann man bei Pascal einfach davon ausgehen das es fehlerfreier ist Mutige Aussage... Ramon schrieb: > " dann kann man > sich nicht drauf verlassen. " > lol und das findest Du jetzt gut oder was ? :-) Du wirst lachen: Ja. Wenn der Standard mir sagt dass ein Verhalten nicht definiert ist, dann sagt mir der Standard und mein Verstand, das das Verhalten nicht definiert ist, und ich mich nicht darauf verlassen soll, dass es sich definiert verhält. Ja, das ist gut. Ramon schrieb: > Falls Du mal länger und umfangreicher mit PAscal... Hab ich. Länger als mir lieb war. Pascal ist eine Lehr- und Lernsprache. Nicht weniger, aber auch nicht mehr. Dafür wurde es gemacht. Ramon schrieb: > aber 80% der Gelegenheits und > Hobbyprogrammeirer werden wohl die meiste Zeit mit der Fehlerbeseitigung > der C geschichten beschäftigt sein.. Man soll nicht von sich auf andere schließen ;-)
Ramon schrieb: > warum?! weil es im C89/C99-Standard so definiert wurde und sich der GGC daran hält. Ich zitiere aus Beitrag "Re: Arduino: Arduino startet mitten im Code neu" > Damit setzt du aber nur das erste Array-Element auf 0!? Ja, das stimmt. Und nach C89 (3.5.7) oder C99 (6.7.8/21) auch den Rest des Arrays.
Nur um es nochmal ausrücklich zu sagen: Gibt man bei einer Array Initialisierung weniger Elemente an als das Array groß ist wird der Rest mit Nullen aufgefüllt. @Ramon Scheinbar hält sich dein Compiler dann nicht an den C Standard. Ich habe es gerade nocheinmal nachgeschaut. Aus dem C89 Standard: If there are fewer initializers in a list than there are members of an aggregate, the remainder of the aggregate shall be initialized implicitly the same as objects that have static storage duration. [...] If an object that has static storage duration is not initialized explicitly, it is initialized implicitly as if every member that has arithmetic type were assigned 0 and every member that has pointer type were assigned a null pointer constant.
So ist es. Es gibt in C keine "halb" initialisierten Arrays oder Strukturen. Entweder sind nach einer Variablendefinition alle Elemente initialisiert oder gar keines. @Ramon: Nur aus Interesse: Welchen Compiler hast du für deinen Test verwendet?
:
Bearbeitet durch Moderator
Ramon schrieb: > int Testarray[7]={5}; mit dem GCC kannst Du auch schreiben: int Testarray[7] = {[0 ... 6] = 5}; belegt alle Felder mit dem Wert 5.
Ramon schrieb: > Sehe ich das richtig, das man mit > int Testarray[7]={0}; > > zwar alle Felder mit 0 vorbelegen kann aber nicht mit > > int Testarray[7]={5}; > > alle Felder mit 5 vorbelegt werden? Mit was sollte deiner Meinung nach folgendes Array gefüllt sein?
1 | int Testarray[7]={5,3}; |
@ mec (Gast)
>Warum wollen alle immer vorbelegte Arrays und Anderes?
Weil dort manchmal Konstanten wie Tabellen, Strings etc. drin stehen?
In C++ kann man sich eine Hilfs-Funktion schreiben, die ein Array produziert das komplett mit einem Wert gefüllt wird. Ist 1x etwas Tipparbeit aber dann kann man sich einfach gefüllte Arrays produzieren. Das Array kann dabei auch im Flash landen, denn der Füll-"Algorithmus" wird vom Compiler selbst berechnet und das Ergebnis (= das gefüllte Array) kann direkt in das Programm eingebaut werden.
1 | #include <array> |
2 | #include <cstddef> |
3 | #include <iostream> |
4 | |
5 | /*
|
6 | Helper-Code
|
7 | */
|
8 | |
9 | namespace Helper { |
10 | template<size_t...> struct Seq{ using type = Seq; }; |
11 | |
12 | template<class S1, class S2> struct ConcatI; |
13 | |
14 | template<size_t... I1, size_t... I2> |
15 | struct ConcatI<Seq<I1...>, Seq<I2...>> |
16 | : Seq<I1..., (sizeof...(I1)+I2)...>{}; |
17 | |
18 | template<class S1, class S2> |
19 | using Concat = typename ConcatI<S1, S2>::type; |
20 | |
21 | template<size_t N> struct GenSeqI; |
22 | template<size_t N> using GenSeq = typename GenSeqI<N>::type; |
23 | |
24 | template<size_t N> |
25 | struct GenSeqI : Concat<GenSeq<N/2>, GenSeq<N - N/2>>{}; |
26 | |
27 | template<> struct GenSeqI<0> : Seq<>{}; |
28 | template<> struct GenSeqI<1> : Seq<0>{}; |
29 | |
30 | template <typename T, size_t N, typename S> |
31 | struct FillArray; |
32 | |
33 | template <typename T, size_t N, size_t... I> |
34 | struct FillArray<T, N, Seq<I...>> { |
35 | static constexpr std::array<T, N> fillArray (const T& value) { |
36 | return {{ (static_cast<void> (I), value)... }}; |
37 | }
|
38 | };
|
39 | }
|
40 | |
41 | template <typename T, size_t N> |
42 | constexpr std::array<T,N> fillArray (const T& value) { |
43 | return Helper::FillArray<T, N, Helper::GenSeq<N>>::fillArray (value); |
44 | }
|
45 | |
46 | // Ein Array von Typ int, mit Größe 7 anlegen, und mit 42 auffüllen.
|
47 | constexpr auto myArray = fillArray<int, 7> (42); |
48 | |
49 | int main () { |
50 | std::cout << "myArray enthält: "; |
51 | for (int i : myArray) std::cout << i << ", "; |
52 | std::cout << std::endl; |
53 | }
|
Falk Brunner schrieb: > @ mec (Gast) > >>Warum wollen alle immer vorbelegte Arrays und Anderes? > > Weil dort manchmal Konstanten wie Tabellen, Strings etc. drin stehen? hab mich schlecht ausgedrückt. Warum sollte ich wollen, das ein Speicherbereich zuerst mit Nullen gefüllt wird die ich nie benötige, wenn ich dann sowieso kurz darauf die wirklichen Werte reinschreibe.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.