Forum: Compiler & IDEs Wie Array übergeben?


von paule (Gast)


Lesenswert?

Hallo,

ich möchte gern ein Array, das aus einer Queue gespeist wird an eine 
andere Funktion in einer anderen c Datei übergeben, wie muss ich dies 
anstellen?

Denn das Array wird in der anderen Funktion gebraucht um verarbeitet zu 
werden.

Gruß
paule

von XXX (Gast)


Lesenswert?

Hallo

bei einem 2*2 Array vielleicht noch machbar.
Aber bei 1000*898 Array nicht mehr so praktikabel.

Übergib einen Zeiger auf das Array.

Gruß
Joachim

von paule (Gast)


Lesenswert?

Hallo,

hm blöderweise hab ich in dieser Datei eine Funktion, die ein array 
erwartet.
Dort wird ein Protokoll zusammengesetzt und das funktioniert auch schon 
ganz gut. Diese Funktion verwendet schon einen Zeiger.

Wenn ich dann an diese Funktion noch einen Zeiger übergebe, dann 
funktioniert das wohl nicht mehr ohne weiteres?

von Rolf Magnus (Gast)


Lesenswert?

XXX schrieb:
> bei einem 2*2 Array vielleicht noch machbar.
> Aber bei 1000*898 Array nicht mehr so praktikabel.
>
> Übergib einen Zeiger auf das Array.

Man kann keine Arrays an Funktionen übergeben.

paule schrieb:
> Wenn ich dann an diese Funktion noch einen Zeiger übergebe, dann
> funktioniert das wohl nicht mehr ohne weiteres?

Warum sollte man an eine Funktion nicht mehrere Zeiger übergeben können?

von Guru (Gast)


Lesenswert?

Zeig am besten mal die Deklaration des Arrays und die der Funktion, die 
den Unhalt des Arrays verarbeiten soll.

Unter "ein Array übergeben" verstehen wir hier, dass das Array als 
Ganzes übergeben wird. Dazu ist normalerweise der Stack zu schade oder 
sogar zu klein und in C geht das überhaupt nicht. Daher werden Zeiger 
übergeben wie hier auch schon geraten. Deine Einrede bzw. Frage:

>Diese Funktion verwendet schon einen Zeiger.
>Wenn ich dann an diese Funktion noch einen Zeiger übergebe, dann
>funktioniert das wohl nicht mehr ohne weiteres?

ist an sich irrelevant und ausserdem missverständlich.

Es ist unklar, ob Du davon ausgehst, das die Parameterliste nur einen 
Zeiger enthalten darf. Das ist nicht der Fall; es können beliebig viele 
Zeiger übergeben werden.
Oder es ist unklar, ob Du mit "noch einem Zeiger" evtl. effektiv einen 
Zeiger auf einen Zeiger auf das Array erzeugst, bzw. zu erzeugen 
glaubst. An sich ist das kein Problem, nur ist es wahrscheinlich 
garnicht nötig.

von Random .. (thorstendb) Benutzerseite


Lesenswert?

Guru schrieb:
> Das ist nicht der Fall; es können beliebig viele
> Zeiger übergeben werden.

LOL, du kannst sogar einen zeiger auf ein array übergeben, welches 
zeiger auf deine arrays beinhaltet :-)

**duckUndWeg**
1
int Func(char *buf)
2
{
3
  int success;
4
5
  buf[index].....
6
  
7
  return success;
8
}
9
10
void main()
11
{
12
  char buf[512];
13
14
  Func(buf);
15
}

hoffe, ich hab mich jetzt auf die schnelle nicht vertippert :-)

von paule (Gast)


Lesenswert?

Hallo,


Random ... schrieb:
> Guru schrieb:
>> Das ist nicht der Fall; es können beliebig viele
>> Zeiger übergeben werden.
>
> LOL, du kannst sogar einen zeiger auf ein array übergeben, welches
> zeiger auf deine arrays beinhaltet :-)
>
> **duckUndWeg**
> int Func(char *buf)
> {
>   int success;
>
>   buf[index].....
>
>   return success;
> }
>
> void main()
> {
>   char buf[512];
>
>   Func(buf);
> }
>
> hoffe, ich hab mich jetzt auf die schnelle nicht vertippert :-)


okay, ich habe das auch soweit main und dann zeiger übergeben an Func.
Aber die Funktion Func soll jetzt eine neue Funktion Func1 aufrufen bei 
der, wieder ein Zeiger auf den Buffer übergeben wird, damit ich 
buf[index]
kann.

Wie sieht dann der Prototyp aus und wie muss ich dann Func1 aufrufen.

Ich hoffe das war etwas verständlicher ;)

Gruß
paule

von Guru (Gast)


Lesenswert?

>Aber die Funktion Func soll jetzt eine neue Funktion Func1 aufrufen bei
>der, wieder ein Zeiger auf den Buffer übergeben wird, damit ich
>buf[index] kann.

>Wie sieht dann der Prototyp aus und wie muss ich dann Func1 aufrufen.

Du kannst den Zeiger gerade so übergeben, wie Du ihn an Func übergeben 
hast. Welcher Satz oder Absatz, in dem C Buch das Du liest, lässt Dich 
glauben, dass es anders ist?
1
int Func1 (char * buf)
2
{
3
  ...
4
}
5
6
int Func (char * buf)
7
{
8
  int success;
9
10
  buf[index].....
11
12
  Func1 (buf);
13
14
  return success;
15
}

In Func ist buf ein char *. Übergibst Du buf dann erwartet die 
aufgerufene Funktion wieder ein char *.

von paule (Gast)


Lesenswert?

Ich habs auch so versucht, nur irgendwie wird die Größe des Array falsch 
übergeben, deswegen dachte ich es liegt an der falschen deklaration.

Das mit den Zeigern ist mir immer noch ein wenig suspekt, da muss ich 
mich noch mehr einlesen und ausprobieren.

Als Literatur verwende ich "Die Programmiersprache C. Ein 
Nachschlagewerk" der Universität Hannover.

von paule (Gast)


Lesenswert?

Sry für den Doppelpost, aber

kann es sein das mir der sizeof Befehl dann nicht die richtige Länge 
zurückgibt, wenn ich diesen in Func anwende auf buf?

von Guru (Gast)


Lesenswert?

>Ich habs auch so versucht, nur irgendwie wird die Größe des Array falsch
>übergeben

Nein, die Grösse wird so überhaupt nicht übergeben. (Das hättest Du 
bitte früher schreiben sollen, das das eine Nebenbedingung ist).

Ist aber auch kein Problem. Du kannst die Grösse mit übergeben.
1
int Func1 (char buf [128])
2
{
3
  ...
4
  ... sizeof (buf);
5
}
6
7
int Func (char buf [128])
8
{
9
  int success;
10
11
  buf[index].....
12
13
  ... sizeof (buf);
14
15
  Func1 (buf);
16
17
  return success;
18
}
19
20
main {
21
  char buf[128];
22
23
  Func (buf);
24
}

Damit Du nur an einer Stelle die Buffergrösse ändern musst bzw. gegen 
Tipfehler gefeit bist, empfiehlt es sich ein typedef zu verwenden.

von Guru (Gast)


Lesenswert?

>kann es sein das mir der sizeof Befehl dann nicht die richtige Länge
>zurückgibt, wenn ich diesen in Func anwende auf buf?

Ja. Genau.

Wenn Du die Form Func (char * buf) verwendest, ist die 
Grösseninformation in der Funktion nicht mehr vorhanden. Wenn Du dagegen 
die Form Func (char buf [128]) verwendest kann sizeof auch innerhalb der 
Funktion die Grösse zurückgeben.

von Guru (Gast)


Lesenswert?

Kleine Anmerkung noch zu Deiner sizeof Frage.

Es ist ein Irrtum anzunehmen, das sizeof innerhalb einer mit Func (char 
* buf) deklarierten Funktion die Grösse "falsch" zurückgibt. Es gibt die 
Grösse durchaus richtig an.
Aber, im Gegensatz zu Deiner Erwartung, gibt sizeof(buf) die Grösse des 
Zeigers zurück und nicht die ohnehin nicht mehr bekannte deklarierte 
Grösse des Arrays.

von paule (Gast)


Lesenswert?

Ja okay, da liegt also das Problem.
Oder ich übergebe die Größe direkt von der main aus, als Variable?
Denn die Größe des Arrays ist Variable und kann bis 255 betragen.

von Guru (Gast)


Lesenswert?

>Oder ich übergebe die Größe direkt von der main aus, als Variable?
>Denn die Größe des Arrays ist Variable und kann bis 255 betragen.

Hm. Das musst ja Du entscheiden, ob Du das willst und ob das notwendig 
ist.
Falls ja, dann nehme ich an, dass Du mit (m)alloc/free arbeitest. Kannst 
Du machen, ist aber wieder ein ganz anderer Fall. (Hättest Du auch 
wieder von Anfang an schreiben sollen, du Dackel ;-) )

Ja. Dann übergib die Grösse des Arrays als gesonderte Variable. Kein 
Problem.

von Guru (Gast)


Lesenswert?

>Ja. Dann übergib die Grösse des Arrays als gesonderte Variable. Kein
>Problem.

Das ist nicht korrekt. Es muss heissen: Ja. Dann übergib die Grösse des 
Arrays als gesonderten Parameter .

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.