Anfängerfrage C 2 Arrays übergeben

spitfire2k

Fleet Captain Special
Mitglied seit
13.11.2002
Beiträge
285
Renomée
0
Standort
Berlin
Hallo,
1. ich muss für die Uni ein kleines Schiffeversenken für die Konsol programmieren. Mein Problem ist das ich nicht so genau weis wie ich das mit dem Platzieren der CPU-Schiffe machen kann. Programmiersprache ist dabei C, sollte aber eigentlich uninteressant sein, da ich einfach nur ein paar Tipps brauch welche Möglichkeite man so allgemein hat. gelöst!

2. Gibt es in C die Möglickeit an eine Funktion 2 Arrays zu übergeben.
 
Zuletzt bearbeitet:
Wie meinst du das?

Per Zufallsgenerator ein Feld auswählen, wenn das Schiff größer als ein Feld ist dann nochmals zufällig die Orientierung festlegen. Prüfen ob das Feld bzw. die Felder noch frei sind oder überhaupt existieren (Spielfeldrand) und Schiff platzieren.
Wenn kein Platz ist solange neues Feld aussuchen, bis halt was passendes gefunden wird.
 
Ok, danke.
Habs jetzt so hinbekommen.
 
Zwei Arrays an eine Funktion übergeben geht genauso wie ein einzelnes array auch.
Merke, ein "array" ist nichts anderes als ein Pointer auf eine Speicheradresse.
Wenn du das array deklarierst wird speicher in der entsprechenden größe reserviert und der name des Arrays (die variable) ist nur ein pointer auf den ersten Block.
Wenn du Array[1] aufrufst ist das gleichebdeutend mit *(Array + 1*siezof(Datentyp))
Also er zählt Arrayindex * datentypbreite zum pointer (startadresse) hinzu und landet so im entsprehcenden Array-Element.
Da ein Array also nichts anderes als ein Pointer ist, kannst du davon beliebig viele an eine Funktion übergeben. Theoretisch bis zum Stackoverflow...
 
Merke, ein "array" ist nichts anderes als ein Pointer auf eine Speicheradresse.
Nicht ganz. Ein Array ist schon noch etwas anderes. Das sollte man nicht vermischen, sonst kann es böse Überraschungen geben, zB:
Code:
sizeof(array)
vs
Code:
sizeof(pointer)

Ein Array kann bei Bedarf allerdings implizit in einen Zeiger auf das erste Element umgewandelt werden. Was bei Parameterübergaben an Funktionen auch gemacht wird.


Wenn du das array deklarierst wird speicher in der entsprechenden größe reserviert und der name des Arrays (die variable) ist nur ein pointer auf den ersten Block.
Wie gesagt, dem ist nicht so. Der Bezeichner eines Arrays ist kein Zeiger. Das ist ein weit verbreiteter Irrglaube. Übrigens, bei einer Deklaration wird noch nichts reserviert. Das geschieht idR bei der Definition.
 
Naja, dann ist zumidnest mein Informatik-Prof im ersten semester dem Irrglauben auch aufgesessen... aber eigentlich ist das Haarspalterei... in bezug auf die Threadfrage geht das übergeben 2er Arrays via pointer.
Ich denke mich zu erinnern dass e sin späteren C-Versionen auch anere Möglichkeiten gab... aber in dem Borland Turbo C auf 16Bit, mit dem ich C gelernt habe war das AFAIK der einzige Weg.
Da konnte man auch durchaus
int x[10];
und statt x[1] dann *(x+1) schreiben.
Ob das nun implizit umgewandelt wird oder nicht, ist nicht wirklich von belang... man kann solche Spielchen betreiben...
Schön ist es natürlich nicht... und es gibt noch einige andere freveltaten die man begehen kann, aber das macht je gerade die flexibilität von C aus...
 
Naja, dann ist zumidnest mein Informatik-Prof im ersten semester dem Irrglauben auch aufgesessen... aber eigentlich ist das Haarspalterei... in bezug auf die Threadfrage geht das übergeben 2er Arrays via pointer.
Ich denke mich zu erinnern dass e sin späteren C-Versionen auch anere Möglichkeiten gab... aber in dem Borland Turbo C auf 16Bit, mit dem ich C gelernt habe war das AFAIK der einzige Weg.
Jup, man übergibt dann halt noch einen zweiten Parameter. Es gibt noch eine weitere Möglichkeit, indem man alles in einen eigenen Datentyp packt (struct) und dann eine entsprechend initialisierte Instanz davon als Zeiger übergibt. "Echte" Parameterübergabe von Arrays funktioniert nur mit C++ mittels Referenzen.
Und als Haarspalterei würde ich das nicht bezeichnen, wenn man sich mit dem ISO Standard auseinandersetzt. Das kann schon mal in Glaubenskriege ausarten. Nicht weniger dramatisch als AMD vas Intel. :)

Da konnte man auch durchaus
int x[10];
und statt x[1] dann *(x+1) schreiben.
Auch hier wird durch den "+"-Operator eine implizite Umwandlung durchgeführt.
 
Moin gruffi,

ich denke deine auslegungen sind so nicht richtig.

Das array muss im scope der function definiert werden damit sizeof() so arbeitet, siehe auch:
http://en.wikibooks.org/wiki/C_Programming/Pointers_and_arrays#sizeof

Daraus schließe ich, dass nur in dem Scope, in dem die Array-Variable definiert wurde, das sizeof() die korrekte größe liefert - überall anders, egal wie übergeben, NICHT.

Außerdem würde ich jedem der normales C++ programmiert raten, möglichst Container-Klassen zu verwenden. Alles andere ist nur ein schuss ins eigene Bein.

Gruß,

Hannnibal
 
Zuletzt bearbeitet:
Mach dir mal keine Sorgen, meine Aussagen sind vollkommen richtig. Diese Diskussion habe ich gefühlt schon hundertmal gesehen.

Es ging doch nicht darum, wo ein Array definiert werden muss, damit sizeof ein entsprechendes Ergebnis liefert. Es ging um den semantischen Unterschied von Arrays und Zeigern.
 
Zurück
Oben Unten