Forum: Compiler & IDEs array vorbelegung


von Ramon (Gast)


Lesenswert?

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?!

von Klaus W. (mfgkw)


Lesenswert?

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
von Oliver (Gast)


Lesenswert?

Nein. Weder noch.

Oliver

von Klaus W. (mfgkw)


Lesenswert?

Oliver schrieb:
> Nein. Weder noch.

Sondern? Mit Dreien? Vieren? Viren?

von Ramon (Gast)


Lesenswert?

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...

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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 :-)

von Eysenbarth (Gast)


Lesenswert?

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.

von Ramon (Gast)


Lesenswert?

ö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..

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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 ;-)

von DirkZ (Gast)


Lesenswert?

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.

von Kaj (Gast)


Lesenswert?

DirkZ schrieb:
> GGC
GCC :P

von Sebastian V. (sebi_s)


Lesenswert?

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.

von Yalu X. (yalu) (Moderator)


Lesenswert?

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
von DirkZ (Gast)


Lesenswert?

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.

von Johann L. (gjlayde) Benutzerseite


Lesenswert?

Das ist aber kein C, sondern GNU-C ;-)  Genauso wie Ranges in case etc.

von Rolf M. (rmagnus)


Lesenswert?

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};

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Und womit das hier?
1
char Text[20] = "Huhu";

von mec (Gast)


Lesenswert?

Warum wollen alle immer vorbelegte Arrays und Anderes?

von Falk B. (falk)


Lesenswert?

@ mec (Gast)

>Warum wollen alle immer vorbelegte Arrays und Anderes?

Weil dort manchmal Konstanten wie Tabellen, Strings etc. drin stehen?

von Dr. Sommer (Gast)


Lesenswert?

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
}

von uwe (Gast)


Lesenswert?


von mec (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.