C Funktion Problem

Diskutiere C Funktion Problem im Developer Network Forum im Bereich Hardware & Software Forum; Hi, habe folgendes Problem. Ich erstelle zwei char Arrays mit malloc. Das eine gebe ich in die Funktion rein, in das andere soll dann das Ergebnis...
  • C Funktion Problem Beitrag #1
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Hi, habe folgendes Problem.
Ich erstelle zwei char Arrays mit malloc.
Das eine gebe ich in die Funktion rein, in das andere soll dann das Ergebnis der Funktion zurückgeliefert werden. Ist das möglich, wenn ja, wie?

So zum Beispiel:
Array1 = Funktion(Array2);
 
  • C Funktion Problem Beitrag #2
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Du übergibst das zweite Array einfach auch als Argument. Da das automatisch als Pointer übergeben wird kannst du darin auch deine Ergebnisse eintragen.
 
  • C Funktion Problem Beitrag #3
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
mir fallen so spontan mehrere möglichkeiten ein.

1) wenn das original verändert werden darf/soll: einfach als parameter an die funktion übergeben. da arrays referenztypen sind, wirkt sich das verändern in der funktion auf das original aus.

2) wenn nicht, 2 arrays an die funktion übergeben. das zum arbeiten und das zum befüllen mit rückgabewerten.

3) in der funktion den speicher für ein array allokieren, und zurückliefern. bei dieser möglichkeit ist richtige speicherverwaltung sehr wichtig, da es sonst schon mal passieren kann, dass ein pointer ins nirvana zeigt. ein beispiel:

Code:
#include <stdio.h>

int* sort(int* zuSortieren);

int main(){
    int i = 0;
    int* zahlen = malloc(5*sizeof(int));
    int* verarbeitet = NULL;
    
    printf("Bitte geben Sie fuenf zahlen ein:\n");
    for(i = 0; i < 5; i++) {
        scanf("%d", zahlen+i);
    }
    verarbeitet = sort(zahlen);
    for(i = 0; i < 5; i++) {
        printf("%d", *(verarbeitet+i));
    }
    getch();
    free(zahlen);
    free(verarbeitet);
    zahlen = NULL;
    verarbeitet = NULL;
    return 0;
}

int* sort(int* zuSortieren) {
    int x = 0;
    int y = 0;
    int* rueckgabe = malloc(5*sizeof(int));
    for(x = 0; x<5; x++) {
        *(rueckgabe+x) = *(zuSortieren+x);      
    }
    for(x = 0; x<5; x++) {
        for(y = x+1; y<5; y++) {
            if(*(rueckgabe+x) > *(rueckgabe+y)) {
                int temp = *(rueckgabe+x);
                *(rueckgabe+x) = *(rueckgabe+y);
                *(rueckgabe+y) = temp;
            }
        }
    }
    return rueckgabe;
}
 
  • C Funktion Problem Beitrag #4
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Also ich habs wie ihr gesagt habt als Argument übergeben. Bringt es auch, aber ich hab die Frage heir rein gestellt, weil ich das bisher ine bisschen unschön fand und allein von der Wissensfrage her, ob es möglich ist return (Array2); richtig zu verwenden. Der Speicher wird in einer anderen Funktion allokiert, weswegen ich das dann nicht in dieser Funktion machen will, die Funktion soll ein Array rein bekommen und der Rückgabewert soll ein anderes sein. Ich versteh nicht ganz die Methoden von dir WhiskeyCola, sorry ^^
 
  • C Funktion Problem Beitrag #5
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
ist beim beispielcode was unklar, oder wie meinst du?
 
  • C Funktion Problem Beitrag #6
U

UnimatrixZero

Bekanntes Mitglied
Dabei seit
27.06.2001
Beiträge
645
Reaktionspunkte
0
Du kannst kein Array bei return zurückgeben, sondern nur einen Zeiger darauf. Da ist nichts ungewöhnliches dabei. Du mußt nur aufpassen, daß Du zu jedem malloc / new auch genau ein free / delete hast.
 
  • C Funktion Problem Beitrag #7
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Wenn das Array woanders allokiert wird, dann muss es der Funktion als Parameter übergeben werden, sonst weiß die Funktion ja nicht, wohin sie ihre Ergebnisse schreiben soll.
Die dritte Methode von WhiskeyCola16 ist natürlich auch möglich, allerdings reserviert dann jeder Funktionsaufruf den Speicher für ein Ergebnisarray (dessen Pointer du dann durchaus mit return zurückgeben kannst). Du musst dann allerdings irgendwo Buch führen, welche Speicherbereiche reserviert sind, und die dann wieder freigeben. Das ist je nach Anwendung nicht ganz einfach und daher fehleranfällig.
Bei Java z.B. geht das meines Wissens so, dass du einfach in der Funktion ein Array erzeugst und mit return zurückgibst. Auch hier wird soweit ich weiß nur ein Pointer zurückgegeben, allerdings sorgt der Garbage-Collector dafür, dass der Speicher automatisch freigegeben wird, sobald er nicht mehr benötigt wird. (Schön finde ich das persönlich trotzdem nicht :D ).
 
  • C Funktion Problem Beitrag #8
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Wenn das Array woanders allokiert wird, dann muss es der Funktion als Parameter übergeben werden, sonst weiß die Funktion ja nicht, wohin sie ihre Ergebnisse schreiben soll.
Die dritte Methode von WhiskeyCola16 ist natürlich auch möglich, allerdings reserviert dann jeder Funktionsaufruf den Speicher für ein Ergebnisarray (dessen Pointer du dann durchaus mit return zurückgeben kannst). Du musst dann allerdings irgendwo Buch führen, welche Speicherbereiche reserviert sind, und die dann wieder freigeben. Das ist je nach Anwendung nicht ganz einfach und daher fehleranfällig.
Bei Java z.B. geht das meines Wissens so, dass du einfach in der Funktion ein Array erzeugst und mit return zurückgibst. Auch hier wird soweit ich weiß nur ein Pointer zurückgegeben, allerdings sorgt der Garbage-Collector dafür, dass der Speicher automatisch freigegeben wird, sobald er nicht mehr benötigt wird. (Schön finde ich das persönlich trotzdem nicht :D ).

so ist es soweit ich weiß in c/c++ java c# vb, da arrays per definition referenztypen sind. "schön" - ja, darüber lässt sich streiten ;)
man muss eben sehr auf die speicherverwaltung achten:

Du kannst kein Array bei return zurückgeben, sondern nur einen Zeiger darauf. Da ist nichts ungewöhnliches dabei. Du mußt nur aufpassen, daß Du zu jedem malloc / new auch genau ein free / delete hast.

genauso ist es.
 
  • C Funktion Problem Beitrag #9
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Ja, fehleranfällig ist nicht so gut, das Programm soll recht groß werden und ist schon ordentlich was. Überblick behalten möchte ich da dann nicht unbedingt, aber free brauche ich ohnehin nur am ende des Programmes, da die Arrays eigentlich dauerhaft gebraucht werden. (Program wird ne Art "logische Textverarbeitung", ka wie ich das nennen soll^^).
Ich habe es nun so gemacht:

*Array1 = Funktion(Array2);

Und die Funktion:
char* Funktion(char *Array2) {
....
return (*Array1);
}
Aber es kommt der Fehler, conflicting Types for Funktion.:confused:
 
  • C Funktion Problem Beitrag #10
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
wo wird das Array denn angelegt?
 
  • C Funktion Problem Beitrag #11
WhiskeyCola16

WhiskeyCola16

Bekanntes Mitglied
Dabei seit
22.12.2001
Beiträge
971
Reaktionspunkte
1
Ort
Österreich
Ja, fehleranfällig ist nicht so gut, das Programm soll recht groß werden und ist schon ordentlich was. Überblick behalten möchte ich da dann nicht unbedingt, aber free brauche ich ohnehin nur am ende des Programmes, da die Arrays eigentlich dauerhaft gebraucht werden. (Program wird ne Art "logische Textverarbeitung", ka wie ich das nennen soll^^).
Ich habe es nun so gemacht:

*Array1 = Funktion(Array2);

Und die Funktion:
char* Funktion(char *Array2) {
....
return (*Array1);
}
Aber es kommt der Fehler, conflicting Types for Funktion.:confused:

Array1 = Funktion(Array2);
statt *Array1...

du lieferst einen pointer zurück, also musst / darfst du Array1 nicht dereferenzieren
 
  • C Funktion Problem Beitrag #12
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Klappt leider auch nicht.
 
  • C Funktion Problem Beitrag #13
N

nic_power

Senior Moderator
Dabei seit
27.12.2000
Beiträge
7.838
Reaktionspunkte
2
Hallo,

Im "return" muss ebenfalls der Pointer spezifiziert werden:

char *func(char *array2)
{
.... code ....
return (array1)
}

"array1" muss als "char *array1" deklariert sein.

Nic
 
  • C Funktion Problem Beitrag #14
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Okay, hab das nun so gemacht, nun kommt dennoch der Fehler "conflicting type for Funktion", der Compiler schreibt dann noch, dass irgendwie was "makes pointer from integer without a cast" habe aber nirgendwo einen int drin.
Und noch etwas wie "previous deklaration of Funktion was here". Muss ich die Funktion vielleicht noch irgendwo/ irgendwie deklarieren?

Edit: Das war der Fehler, hab ihn grade gefunden. Das "previous deklaration" war komisch. Ich hatte die Funktion in einer anderen Datei als den Hauptcode, hatte die mittels #include aber erst nach dem Funktionsaufruf eingebunden, was mir nicht mehr aufgefallen ist.
Alles hat geklappt, danke für euere Hilfe.
 
Zuletzt bearbeitet:
  • C Funktion Problem Beitrag #15
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Nochwas zu der mysteriösen Fehlermeldung:
Wenn du eine Funktion verwendest, bevor sie deklariert wurde, dann nimmt der Compiler automatisch an, dass der Rückgabewert int ist. Das verursacht dann den Fehler bei der Zuweisung, und später, wenn der Compiler auf die richtige Deklaration trifft, den Fehler, dass die Funktion zweimal unterschiedlich deklariert wurde.

Übrigens sollte man die includes in den Quelldateien immer alle sehr weit oben haben, vor dem Code. Dann kann sowas nicht so leicht passieren.
Wenn die Funktion nicht in einer externen Datei deklariert wird, musst du vor der ersten Verwendung (am besten auch ganz oben) einen Prototype für die Funktion machen.
 
  • C Funktion Problem Beitrag #16
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Achso, alles klar, vielen Dank nochmals:goil:
Edit: Kann mir hier wer kurz eine Funktion nennen, die mir den Dateinamen des laufenden Programmes ausgiebt, dann muss ich nicht extra einen neuen Thread aufmachen, da ich leider nichts finde.
 
  • C Funktion Problem Beitrag #17
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Der erste Parameter im argv-Array der main-Funktion ist der Pfad zur exe-Datei.
 
  • C Funktion Problem Beitrag #18
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
Sry, vergessen zu sagen, wie sieht es bei Winapi aus? Wo finde ich den da?
 
  • C Funktion Problem Beitrag #19
cmddegi

cmddegi

Bekanntes Mitglied
Dabei seit
12.07.2001
Beiträge
4.740
Reaktionspunkte
0
Ort
Austria
Die winmain hat die selben Parameterarrays, oder meinst du was anderes?
 
  • C Funktion Problem Beitrag #20
Anno1989

Anno1989

Bekanntes Mitglied
Dabei seit
30.04.2006
Beiträge
1.293
Reaktionspunkte
0
Ort
NRW
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
PSTR szCmdLine, int iCmdShow)
{
Wo ist da das Array für den Filename, ich blick da grade nicht durch.
 
Thema:

C Funktion Problem

ANGEBOTE & SPONSOREN

https://www.mofapower.de/

Statistik des Forums

Themen
213.179
Beiträge
1.579.172
Mitglieder
55.878
Neuestes Mitglied
Satan666
Oben