.
|
|
| Autor | Beitrag |
|---|---|
|
000 30.05.2005, 16:53 epidemic |
Hi ich bin noch ziemlicher Anfänger, daher entschuldigt bitte wenn diese Frage eine offensichtlich dumme Frage ist, aber weder Forensuche noch google haben mir weiter geholfen. Ich hab mein Problem mal auf das folgende sehr kleine Programm reduziert: bzw. in Zeile 19: Meine Frage lautet nun: Wie kann ich der Funktion ShowInts(const int &content) klar machen, dass der Parameter, den sie bekommen wird, ein Array ist? -- Der Optimist glaubt, dass wir in der Besten aller Welten leben. Dieser Beitrag wurde am 30.05.2005 um 16:57 von epidemic bearbeitet. |
|
Profil || Suche |
|
001 30.05.2005, 18:23 HammerBlade |
Du musst ShowInts den Array als Pointer und nicht als Referenz übergeben. Also so:
"Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 30.05.2005 um 18:27 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
002 30.05.2005, 18:53 CN |
wenn du nicht grade nen schreibkrampf willst dann kannst du auch das hier machen: |
|
Profil || Suche |
|
003 30.05.2005, 20:13 theDon |
Und idealerweise solltest du ShowInts() in einem zweiten Parameter die Groesse deines Arrays uebergeben, da das vermutlich nicht immer genau 3 sein wird. Wenn du das nicht machst, besteht die Gefahr, dass du ueber die Grenze hinaus liest (schreiben ist nicht, da das ja ein const int * ist). Da kommt aber mit ziemlicher Sicherheit Muell bei raus, das willst du nicht haben. ;) --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
004 30.05.2005, 23:03 epidemic |
danke, die Lösung funktioniert einwandfrei! Allerdings hat das einige andere Fragen aufgeworfen :) 2) Ich habe testweise mal wirklich einen int übergeben. Bei content[0] hat er mir auch das richtige Ergebnis (den Wert des ints) angezeigt, bei den anderen beiden hat er mir zu meinem Erstaunen zwei zufällige Zahlen gezeigt (worauf theDon wohl auch hinaus wollte). Zwei zufällige Zahlen heisst, dass er von irgendwo etwas ausgelesen haben muss, also von irgendeinem Speicherplatz - was ja auch logisch klingt, der int hat keine sinnvollen Informationen an der Stelle, an der ein Array die Addresse des nächsten Elements trägt. Und was auch immer er da bei dem int vorgefunden hat, muss als Addresse verwendet ja irgendeinen Käse hervorgerufen haben. 3) In Volkards Kurs steht, eine Referenz sei ein Zeiger, der so tut als sei er die Variable selbst. Der Optimist glaubt, dass wir in der Besten aller Welten leben. Dieser Beitrag wurde am 30.05.2005 um 23:31 von epidemic bearbeitet. |
|
Profil || Suche |
|
005 30.05.2005, 23:40 HammerBlade |
1) Wenn du der Funktion nur einen int übergibst führt das zu einem Complierfehler:
Das geht nicht siehe 1), oder ich verstehe dich falsch. Meinst du einen int-Array mit nur einem Element, also 'int list[1]' ? Das mit dem "über-das-Ende-hinaus-lesen" stimmt so und führen nicht zu einer Accessvialotion. 3) Weil 'const int &content' ein int ist, also ein 'Objekt' und kein Pointer. Das & sorgt dafür das der int mit Call-By-Reference übergeben wird und deshalb Änderungen die die Funktion an ihm macht auch noch ausserhalb bestehen beiben. C/C++ kann bei Array's nur Call-By-Reference. Wenn du unbedingt in der Funktion was am Array ändern willst und es soll nur in der Funktion geändert sein, dann musst du entwerder dir lokal in der Funktion eine Kopie vom Array machen oder einen std::vector<int> benutzen und diesen mit Call-By-Value übergeben. -- "Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 30.05.2005 um 23:46 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
006 31.05.2005, 00:01 epidemic |
1)
2) Kann man mit dem über-das-Ende-hinaus-lesen eigendlich auch Speicherplatz ändern, der eigendlich zu einem ganz anderen Programm gehört (z.B. zum Betriebssystem) ? 3) Der Optimist glaubt, dass wir in der Besten aller Welten leben. |
|
Profil || Suche |
|
007 31.05.2005, 00:36 HammerBlade |
1) Wenn du das so machst dann ist der eine int für die Funktion 'ShowInts' wie ein Array mit einem Element, welcher dann natürlich den []-Operator hat. 2) Das ist so, C/C++ ist halt keine Sprache wie Java oder C#, wo das nicht geht. Ehm... Nein jedes Programm hat seinen eigene virtuellen Addressraum, zumindest ist das bei Windows so, ich kenne mich mit Linux in der Hinsicht nicht so aus, aber da wird es genau so sein. Um im Speicher andere Prozesse rumzufummeln muss man unter Windows mit 'WriteProcessMemory' und 'ReadProcessMemory' arbeiten. Du kannst dir also nur deine eigenen Speicher ungewollt verunstallten. -- "Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 31.05.2005 um 00:37 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
008 31.05.2005, 01:44 epidemic |
1) Mhm, der Groschen fällt in Zeitlupe, aber irgendwann kommt er unten an ^^ 2) Der Optimist glaubt, dass wir in der Besten aller Welten leben. |
|
Profil || Suche |
|
009 31.05.2005, 07:21 Onkel Dittmeyer |
1) Nicht ganz. Ein Array kann mit einem Zeiger auf sein erstes Element übergeben werden, aber natürlich auch einzelne Werte. Es musst nicht ein Array hinter einere Addresse stehen. Ein Zeiger kann auch irgendwo hinzeigen, wenn man nicht aufpasst, also weder auf eine einzige Variable noch ein Array. |
|
Profil || Suche |
|
010 31.05.2005, 08:19 oxff |
Naja Onkelchen: Arrays sind halt einfach Zeiger, es gibt nur einige vereinfachte Schreibformen: array[n] = *(array + n) // s.o. edit: Wo bleibt eigentlich CN? :D --mwcollect - mein Projekt | oxlog - mein blog | happyhardcore.com Stream - gute Musik Dieser Beitrag wurde am 31.05.2005 um 08:20 von 0xFF bearbeitet. |
|
Profil || Suche |
|
011 31.05.2005, 08:57 hausi |
Das stimmt so aber AFAIR auch nicht ganz. Eigentlich müsste das so sein: array[n] = *(array + n * sizeOf( *array )) // Syntax könnte jetzt falsch sein, arbeite schon länger nicht mehr mit C/C++ Zu empfehlen ist dazu auch das... -- |
|
Profil || Suche |
|
012 31.05.2005, 13:30 Spin |
ne, 0xFF hat schon recht -- |
|
Profil || Suche |
|
013 31.05.2005, 15:11 CN |
0xff da bin ich, normale menschen haben schule >:P oder arbeiten oder so doch man kann da drauf zugreifen, nur ist das mehr oder weniger (eher mehr) zufall wenn da was bei rauskommt nicht wenns const is achja das [pass by const reference] hat übrigens den vorteil das bei grossen objekten nicht erst ne kopie erstellt werden muss die an die funktion übergeben wird, ändern kann man das objekt ja dann trotzdem nicht hält sich in grenzen. superhausi Dieser Beitrag wurde am 31.05.2005 um 15:25 von CN bearbeitet. |
|
Profil || Suche |
|
014 31.05.2005, 15:58 Onkel Dittmeyer |
@Superhausi, das war auch nur auf diesen Fall bezogen und da wars ein int, was genauso groß ist wie ein *int. |
|
Profil || Suche |
|
015 31.05.2005, 17:54 CN |
onkel Dieser Beitrag wurde am 31.05.2005 um 17:54 von CN bearbeitet. |
|
Profil || Suche |
|
016 31.05.2005, 18:33 hausi |
Ich frage mich, wieso ich falsch liegen sollte... Nehmen wir an, wir hätten ein int[3] an der Position 0 (zum vereinfachen). Der erste liegt also bei 0, der zweite bei 4 und der dritte bei 8, da ja ein int auf einem 32-Bit System 4 Byte hat. my_int_array[0] greift jetzt also auf 0, my_int_array[2] auf 8 und nicht auf 2 zu. Also my_int_array + 2 * 4. Es ist dabei natürlich zu beachten, dass wir von einem int * und nicht void * oder byte * ausgehen... -- |
|
Profil || Suche |
|
017 31.05.2005, 19:02 HammerBlade |
Also... Das was da in CN's Link zu Zeigerarithmetik steht ist richtig. Superhausi, du liegst falsch, ein Pointer auf eine int (4 Byte bei 32-Bit gross) kann nicht in Byte-Schritten bewegt werden, dazu müsste man ihn in eine Byte/Char casten. Fazit: ein Pointer kann immer nur Vielfache der Grösse seines Typs annehmen. Hier ein Beispiel mit int: "Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon Dieser Beitrag wurde am 31.05.2005 um 19:10 von HammerBlade bearbeitet. |
|
Profil || Suche |
|
018 31.05.2005, 21:32 theDon |
Genaugenommen sind eher beides Pointer: Der Name eines Arrays ist ein Zeiger auf das erste Element. (Zeiger + 1) zeigt auf das zweite Element etc. Daraus ergibt sich ein recht kranker Zusammenhang: \o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|
019 31.05.2005, 21:34 hausi |
Genau das hab ich ja schon die ganze Zeit versucht zu sagen. Hab ich mich jetzt wirklich so unklar ausgedrückt? Quellcode:array[n] = *(array + n * sizeOf( *array )) Von meinem ersten Post; sagt doch genau das aus, dass es um n * 4 (sizeof( *array ) sollte sizeof( int ) sein) und nicht um n erhöht wird...Auch in meinem zweiten Post hab ich versucht, das zum Ausdruck zu bringen: Sagt doch auch genau das aus... Naja, wenn wir uns alle einer Meinung sind, dann ist das ja kein Problem... Nur ich scheine irgendwie Verständigungsprobleme zu haben O.o -- |
|
Profil || Suche |
|
020 31.05.2005, 21:53 HammerBlade |
Ich hab dich irgendwie vorher nicht richtig verstanden. Lag wohl daran, dass bei dir jegliche Einheit fehlt und so daran herum interpertiert weden kann.
Hättest du hier ein paar Einheiten eingestreut wäre es (für mich) wesentlich klarer gewesen: my_int_array[0] greift jetzt also auf <base> + 0 * 4 byte = <base> + 0, my_int_array[2] auf <base> + 2 * 4 byte = <base> + 8 byte und nicht auf <base> + 2 byte zu. -- "Mit C++ (noch besser mit C) kann man sich _sehr_ leicht in den Fuss schiessen." - theDon |
|
Profil || Suche |
|
021 31.05.2005, 21:55 hausi |
Ok, dann ist ja alles klar... Hab wohl einfach zu lange keinen C-Code mehr geschrieben... Aber irgendwie bin ich froh, dass ich nicht alles was C/C++ angeht vergessen habe in den Jahren... -- |
|
Profil || Suche |
|
022 01.06.2005, 00:04 epidemic |
eine Frage hätte ich noch (zwar ganz unabhängig vom Threadtitel, aber die ist mir eingefallen als ich das von euch hier gelesen habe): Und stimmt es, dass man noch besser einen int (32Bit=4Byte) benutzten soll, selbst wenn man wirklich nur 2 Zustände haben wird, weil die Rechner alle auf 32Bit getrimmt sind ? Der Optimist glaubt, dass wir in der Besten aller Welten leben. Dieser Beitrag wurde am 01.06.2005 um 00:11 von epidemic bearbeitet. |
|
Profil || Suche |
|
023 01.06.2005, 00:10 Exec |
genau die frage hab ich mir heute auch gestellt, als ich die delphi-hilfe durchgelesen hab o_O -- "selbermachen rockt am meisten :D" - -LeJean- |
|
Profil || Suche |
|
024 01.06.2005, 00:13 theDon |
Der Datentyp `bool' ist fuer Wahrheitswerte gedacht. Wie viel Speicher der intern belegt, kann (und sollte) dir erstmal voellig egal sein. Und nein, man nimmt nicht besser einen Int. Ein guter Compiler erzeugt Code, der das Alignment beruecksichtigt, dh. er baut Platzhalter zwischen die einzelnen Speicherplaetze. Wenn man ganz viele bools auf einmal zu vermalten hat, nimmt man am besten std::bitvector (bzw. std::vector<bool>, das ist aequivalent). Dann werden intern Bitfelder benutzt, platzsparender geht es also nicht mehr. --\o tanz den naziprau! o/ And more than ever, I hope to never fall, |
|
Profil || Suche |
|

