Guten Abend,
fangen Arrays mit 0 oder 1 an? Gibt es da eine klare Regel bzw.
spezielle Norm oder ist das nicht einheitlich geregelt? Gibt es auch
einen Unterschied zwischen Arrays und Matrizen oder ist jedes Array mit
2 Feldern auch eine Matrize?
Anfänger schrieb:> Gibt es auch> einen Unterschied zwischen Arrays und Matrizen oder ist jedes Array mit> 2 Feldern auch eine Matrize?
Was müsste ein Array mit 2 Feldern denn anders machen um nicht als
Maritze zu funktionieren?
cppbert schrieb:> Was müsste ein Array mit 2 Feldern denn anders machen um nicht als> Maritze zu funktionieren?
bei Matlab gibt es Arrays und Matrizen. ich weis deshalb nicht, wann
eine Matrize und dann ein Array besser ist, aber man kann mit einem
Array auch eine Matrize abbilden, so geht das z.B. in C, weil es keinen
speziellen Matrizendatentyp gibt in C wie in Matlab.
Anfänger schrieb:> User schrieb:>> ADA>> Was genau ist ADA? Ich habe davon noch nichts gehört bisher.
Gibt vermutlich schlimmeres im Leben.
The language is named after Augusta Ada King, Countess of Lovelace
thought to be the first ever programmer. Aaaah!
Eine Sprache wurde ja nicht angegeben. Such dir halt eine aus;
http://rosettacode.org/wiki/Arrays#Ada
DPA schrieb:> Wenn man es in c ab 1 statt 0 braucht, gibts da noch so einen netten> kleinen Hack:int*const array = ((int[]){1,2,3})-1;
Kill it. Kill it with fire.
Matrizen sind eine Rechenhilfe:
https://de.wikipedia.org/wiki/Matrizenmultiplikation
Ist man näher an der Hardware dran (intel cpu, Dos) dann gilt in den
automatisierten Bereichen normalerweise 0 als "Wert". Z.B. steht in den
Registern (z.B.) 0000 und wenn man das logisch verküpft mit einem
anderen Register, wo z.B. 0001 drin steht, dann ist nicht egal, was in
den Registern steht.
Strategic Head of Lunch Planning schrieb:> Man kann auch 0.5 als Arrayindex nehmen:
Ist heute der 1. April?
Eingeben kannst du das wohl, aber spätestens vorm ersten Zugriff auf das
Array wird da ein Integer-Datentyp draus - implizite Typkonversion ...
Bei Visual-Basic ist es 0.
Ich fange aber aus alter Angewohnheit immer mit 1 an. Was dazu führt das
ich bei Objekten (der Array auch mit 0 anfängt) immer -1 machen muss.
Mein Tipp. Einige dich mit dir selbst auf eine Regel, und merke dir die
Ausnahmen, das ist sicherer als wenn dir in Schleifen etc, plötzlich was
fehlt.
Gruß
Pucki
DPA schrieb:> Wenn man es in c ab 1 statt 0 braucht, gibts da noch so einen netten> kleinen Hack:int*const array = ((int[]){1,2,3})-1;(Ist zwar eigentlich> ub)
Undefined Behavior.
Ein Zeiger darf auf Elemente innerhalb des Arrays oder auf die Stelle
direkt hinter dem Array zeigen.
Dein Zeiger zeigt auf die Stelle vor Beginn des Arrays. Das ist UB und
nicht erlaubt.
MaWin schrieb:> Ein Zeiger darf auf Elemente innerhalb des Arrays oder auf die Stelle> direkt hinter dem Array zeigen.> Dein Zeiger zeigt auf die Stelle vor Beginn des Arrays. Das ist UB und> nicht erlaubt.
Ich code nicht in C. Ich HASSE die Klammern aus der tiefsten Seele
meines Herzens. Aber nett so Feinheiten zu wissen. VIELEN DANK
Gruß
Pucki
Rolf M. schrieb:> MaWin schrieb:>> (Ist zwar eigentlich ub)>>>> Undefined Behavior.>> Ja genau, ub steht für undefined behavior. :)
Ist mir bekannt. Ich wollte nur nochmal hervorheben, dass dieser "Trick"
eine sehr schlechte Idee ist. Nur falls jemand nicht weiß, was "ub" ist.
UB darf niemals in einem C-Programm auftreten. Der Compiler darf
annehmen, dass es niemals auftritt. D.h. er darf dir deine ganzen Arrays
ersatzlos und kommentarlos rausoptimieren. Oder dir stattdessen ein
Tetris-Spiel bauen. Oder dir das Haus anzünden. Alles dies erlaubt der
Standard.
Strategic Head of Lunch Planning schrieb:>> Man kann auch 0.5 als Arrayindex nehmen:>> So muss man sich nicht zwischen 0 oder 1 entscheiden!>>> Eingeben kannst du das wohl>> Das Log ist echt!http://rosettacode.org/wiki/Arrayassociative arrays
... An associative array is a collection indexed by arbitrary data
types, not just small integers ...
> associative arrays
Mein Eselnettswitche habn sowas auch!
Aber ich hab noch keine MAC mit Dezimalpunkten gesehn.
Sollte man sich vielleicht patentieren lassen.
Andreas B. schrieb:> Nö, je nachdem wie Du das Array definierst, kann es bei 0 oder 1> anfangen.
Viel allgemeiner, man kann auch definieren array[15..22].
Georg
Da sind für mich schon zwei Dinge nicht nachvollziehbar - warum steht
der Stern bei int* und nicht int *p?
Und ich kann doch einem Integer kein Pointer zuweisen, so wie in der
zweiten Zeile. Es müsste doch vielmehr lauten:
int i = &p;
Und was genau ist NULL? Das hab ich noch nie gesehen.
Alexander K. schrieb:> Ich fange aber aus alter Angewohnheit immer mit 1 an. Was dazu führt das> ich bei Objekten (der Array auch mit 0 anfängt) immer -1 machen muss.
Ist denn das sinnvoll? Angenommen, Du hast z.B. eine Datei, wo Du
Operationen Millionenfach durchführen musst, weil Du z.B. ganz viele
Messwerte hast. Und wenn Du dann bei jedem Rechenschritt die -1
abziehst, bedeutet das doch wieder einen Zusatzaufwand - oder täusche
ich mich da? Wenn es sich vielleicht um ein paar hundert
Datenoperationen handelt, kann man das gewiss machen.
Ich werde auch manchmal angemeckert, wenn ich z.B. zu viele
Typenumwandlungen in ein Programm reintue, weil das immer auch kostbare
Rechenzeit vergeuden soll - oder ist das in Wirklichkeit nicht so
wichtig?
Anfänger schrieb:> Da sind für mich schon zwei Dinge nicht nachvollziehbar - warum steht> der Stern bei int* und nicht int *p?
Ja gut. Bevor du dich in UB reinarbeitest, solltest du die Basics von C
verstehen. Kaufe dir ein Einsteigerbuch. Dort werden alle deine Fragen
in den ersten Kapiteln erklärt.
Anfänger schrieb:> Da sind für mich schon zwei Dinge nicht nachvollziehbar - warum steht> der Stern bei int* und nicht int *p?
Du kannst den * auch direkt vor das p schreiben. Manche Leute bevorzugen
die eine, andere die andere Schreibweise. Zwischen beiden Gruppen
herrscht Krieg, so dass es nicht viel bringt, darüber zu diskutieren ;-)
Zumindest in C ist
1
int*p=NULL;
konsequenter. Die andere Schreibweise
1
int*p=NULL;
kam mit C++ auf, wo die Typnotation durch Erweiterungen sowieso an
Konsistenz verlor, so dass es dort jeder so macht wie er lustig ist.
Anfänger schrieb:> Und ich kann doch einem Integer kein Pointer zuweisen, so wie in der> zweiten Zeile. Es müsste doch vielmehr lauten:>> int i = &p;
Lies mal in deinem C/C++-Buch nach, was die Operatoren * und & genau
tun. Dann wird dir das ziemlich schnell klar werden.
Anfänger schrieb:> Alexander K. schrieb:>> Ich fange aber aus alter Angewohnheit immer mit 1 an. Was dazu führt das>> ich bei Objekten (der Array auch mit 0 anfängt) immer -1 machen muss.>> Ist denn das sinnvoll?
Er schrieb ja "aus alter Angewohnheit". Wenn du diesbezüglich keine
alten Angewohnheiten hast, fang bei 0 an zu zählen. Damit hast du es in
der Computerei fast überall leichter (nicht nur bei der Indizierung von
Arrays).
Ein Professor sagte einmal: Ingenieure fangen bei 1 an zu zählen,
Informatiker bei 0.
Yalu X. schrieb:> Lies mal in deinem C/C++-Buch nach, was die Operatoren * und & genau> tun. Dann wird dir das ziemlich schnell klar werden.
Das habe ich schon. Da steht, dass mit int *p auf die Speicherstelle
zugegriffen wird und int i der Wert, der in der Speicherstelle steht.
Wenn ich jetzt i einen Wert zuweisen will, dann kriege ich doch mit dem
und-Operator &p den Wert, der an der Speicherstelle steht und kann die
dann dem i zuweisen. Oder habe ich da grade einen Denkfehler?
Anfänger schrieb:> Das habe ich schon. Da steht, dass mit int *p auf die Speicherstelle> zugegriffen wird und int i der Wert, der in der Speicherstelle steht.
1
int*p;
ist nur die Variablendeklaration bzw. -definition von p, mehr nicht.
Entsprechendes gilt für
1
inti;
> Wenn ich jetzt i einen Wert zuweisen will, dann kriege ich doch mit dem> und-Operator &p den Wert, der an der Speicherstelle steht und kann die> dann dem i zuweisen. Oder habe ich da grade einen Denkfehler?
Das stimmt nicht. Steht das tatsächlich so in deinem Buch? Ich glaube
eher nicht :)
Um auf die Speicherstelle zuzugreifen, auf die p zeigt, nimmt man nicht
&, sondern *, also
1
i=*p;
Man kann nun die Variablendefinition mit einer Initialisierung
verbinden, so dass die Variable gleich bei ihrer Entstehung einen
definierten Wert erhält. Das sieht dann so aus:
Anfänger schrieb:> Ich werde auch manchmal angemeckert, wenn ich z.B. zu viele> Typenumwandlungen in ein Programm reintue, weil das immer auch kostbare> Rechenzeit vergeuden soll - oder ist das in Wirklichkeit nicht so> wichtig?
Naja, ich hatt erst unlängst n Fall mit m Excel-Sheet aus staatlicher
Quelle, da hat der Verfasser das Kunststück fertig gebracht eine
einfache lineare Funktion in eine Funktion fünften Grades zu pressen und
die zig tausendfach in unzählige Tabellenseiten zu verteilen. Mein
angegrauter P4 ist schon gleich nach dem laden eingefroren, unbenutzbar.
Durch ersetzen der Funktion lief das dann auf der alten Kiste tadellos
... es kann schon sinnvoll sein sich über die Prozessorlast Gedanken zu
machen auch wenn das heut nicht so populär ist.
Gustl B. schrieb:> Negative Indizes sowie umgekehrte Reihenfolge 7 downto 0 ist natürlich> auch möglich je nach Sprache.
Bei Python kann man auch negative Indizes verwenden, aber da gibt's
einfach einen automatischen Wrap-Around. Damit ist a[-1] also einfach
der letzte Eintrag des Arrays a.
Anfänger schrieb:> Da sind für mich schon zwei Dinge nicht nachvollziehbar - warum steht> der Stern bei int* und nicht int *p?
Das ist ganz egal, wo der steht. Du kannst int* p oder int *p oder int*p
oder int * p schreiben. Das ist alles das gleiche. Sogar
1
int
2
*
3
p
wäre das gleiche.
> Und ich kann doch einem Integer kein Pointer zuweisen, so wie in der> zweiten Zeile.
Wird ja nicht. *p ist eine Dereferenzierung. Es wird das zugewiesen,
worauf er zeigt.
> Es müsste doch vielmehr lauten:>> int i = &p;
Das wiederum würde nicht gehen, denn das wäre die Adresse des Zeigers
selbst (nicht zu verwechseln mit der Adresse, die er enthält).
> Und was genau ist NULL? Das hab ich noch nie gesehen.
Ein Nullzeiger. Das ist ein Zeiger, der bewusst so gewählt ist, dass er
auf kein gültiges Objekt zeigt. Deshalb ist auch das Verhalten
undefiniert. Das Dereferenzieren des Nullzeigers löst selbiges aus.
> Alexander K. schrieb:>> Ich fange aber aus alter Angewohnheit immer mit 1 an. Was dazu führt das>> ich bei Objekten (der Array auch mit 0 anfängt) immer -1 machen muss.>> Ist denn das sinnvoll?
Meiner Meinung nach nicht, aber nicht primär aus Performance-Gründen,
sondern weil die Gefahr zu groß ist, es irgendwo zu vergessen.
> Ich werde auch manchmal angemeckert, wenn ich z.B. zu viele> Typenumwandlungen in ein Programm reintue, weil das immer auch kostbare> Rechenzeit vergeuden soll - oder ist das in Wirklichkeit nicht so> wichtig?
Typumwandlungen in C brauchen normalerweise keine signifikante
Rechenzeit, wenn überhaupt. Aber du solltest dir dennoch sicher sein,
dass du sie nur machst, wenn du sie auch wirklich brauchst. Einfach,
weil sie ein sehr großes Potenzial für Fehler haben. Man sollte sich in
C immer bewusst sein, mit welchem Datentyp man gerade arbeitet und
warum.
Yalu X. schrieb:> Ein Professor sagte einmal: Ingenieure fangen bei 1 an zu zählen,> Informatiker bei 0.
Und was machen Informatik-Ingenieure?
Rolf M. schrieb:> Yalu X. schrieb:>> Ein Professor sagte einmal: Ingenieure fangen bei 1 an zu zählen,>> Informatiker bei 0.>> Und was machen Informatik-Ingenieure?
Informatik = 0
Ingenieure = 1
Informatik-Ingenieure = 0 - 1 = -1
Klarer Fall, die fangen bei -1 an zu zählen!