Forum: Compiler & IDEs Ein Array zurückgeben


von romeo (Gast)


Lesenswert?

Guten morgen,
ich habe zwei Array addieren und will das Ergebnis all Array zurückgeben 
aber klappt nicht ich bekomme nur das erste Element.

#include <avr/io.h>
#define MAX  6

char cMyFstArray[MAX]={1,7,9,4,6,11};
char cMySndArray[MAX]={9,6,3,4,6,10};
char cMyResultat[MAX];
uint8_t u8LenFstArray;
char *OperatioArray(char *pFstArray, char *pSndArray, uint8_t 
u8lenArray1 );
int main(void)
{
    u8LenFstArray=sizeof(cMyFstArray);
    char *add;
    add=OperatioArray(cMyFstArray,cMySndArray,u8LenFstArray);

}
char *OperatioArray(char *pFstArray, char *pSndArray, uint8_t 
u8lenArray1 )
{
   for (int i=0;i<u8lenArray1; i++)
      {
         cMyResultat=pFstArray[i]+pSndArray[i];
      }
      return cMyResultat;
}

von Blackbird (Gast)


Lesenswert?

1
cMyResultat[i]=pFstArray[i]+pSndArray[i];

In "add" steht nur der pointer auf das Array "cMyResultat". Und der 
zeigt nun mal auf das erste Element.

Blackbird

von romeo (Gast)


Lesenswert?

wie soll ich das verändern um das richtiges Ergebnis zu bekommen?

von Ralf G. (ralg)


Lesenswert?

'cMyResultat' hast du doch global. Da brauchst du gar keinen 
Rückgabewert. Und sonst so, wie von Blackbird geschrieben.

von Blackbird (Gast)


Lesenswert?

Du kannst nicht ein ganzes Array mit einer Funktion zurückgeben. Immer 
nur einen Wert. Was du machen kannst, ist in den Aufrufparametern die 
Pointer von Arrays (also nicht nur "cMyFstArray" und "cMySndArray", 
sondern auch das Ergebnisarray "cMyResultat") anzugeben.
Aber damit arbeitest Du auch nur außerhalb der Funktion auf den global 
vorhandenen Arrays und nicht lokal in der Funktion.
Das Ergebnisarray wird nicht in voller Länge nach Return der Funktion 
auf dem Stack liegen, sondern nur der Pointer auf das erste Element.

Blackbird

von Ralf G. (ralg)


Lesenswert?

Blackbird schrieb:
> Das Ergebnisarray wird nicht in voller Länge nach Return der Funktion
> auf dem Stack liegen, sondern nur der Pointer auf das erste Element.

Und in dem Fall vom TO nicht mal das, sondern eigentlich nur Mist. Es 
wird das Ergebnis der Addition selbst ein Zeiger. Und nicht dort 
eingetragen, wo der Pointer hinzeigt.

Wenn's der Übersicht dient, könnte man vielleicht 'cMyResultat' in der 
Funktion als 'static' deklarieren und einen Zeiger darauf zurückgeben.

von unbekannt (Gast)


Lesenswert?

Hallo,

wenn ich gut vestanden habe, ist meine Code nicht ganz falsch.Es gibt 
nur nicht die Möglichkeit ein ganzes Array zurückzugeben.

von Ralf G. (ralg)


Lesenswert?

unbekannt schrieb:
> Hallo,
>
> wenn ich gut vestanden habe, ist meine Code nicht ganz falsch.Es gibt
Doch, ist falsch. Siehe:
Blackbird schrieb:
> cMyResultat[i]=pFstArray[i]+pSndArray[i];

> nur nicht die Möglichkeit ein ganzes Array zurückzugeben.
Das geht schon, ist aber nicht üblich. Kostet viel Speicher.

von Rolf Magnus (Gast)


Lesenswert?

Ralf G. schrieb:
>> nur nicht die Möglichkeit ein ganzes Array zurückzugeben.
> Das geht schon, ist aber nicht üblich.

Es geht nicht. Die einzige Möglichkeit, sowas indirekt hinzutricksen, 
wäre eine Struktur zu definieren, die ein Array enthält und diese 
zurückzugeben. Direkt kann man komplette Arrays weder an Funktionen 
übergeben, noch per return zurückgeben. Es wird dabei immer automatisch 
ein Zeiger auf das erste Element daraus.

von Udo S. (urschmitt)


Lesenswert?

Braucht man doch auch gar nicht.
Entweder man übergibt der Prozedur 3 Zeiger auf Arrays, die man schon 
ausserhalb angelegt bzw. dafür Speicher reserviert hat:

void AddArray(char result[], char ar1[], char ar2[], int length)

oder man addiert das Array ar2 zu ar1 dazu und das Ergebnis steht dann 
in ar1

void AddArray(char ar1[], char ar2[], int length)

von Ralf G. (ralg)


Lesenswert?

Rolf Magnus schrieb:
> Die einzige Möglichkeit, sowas indirekt hinzutricksen,
> wäre eine Struktur zu definieren, die ein Array enthält

Ja, sowas hatte ich gedacht. Unüblich => nur Zeiger hin- und 
herzureichen macht man ja, damit es effektiv wird.

von apr (Gast)


Lesenswert?

Ralf G. schrieb:
> Ja, sowas hatte ich gedacht. Unüblich => nur Zeiger hin- und
> herzureichen macht man ja, damit es effektiv wird.

ef­fi­zi­ent

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.