Übergabe eines arrays mit pointern
-
Hoi.. ich wollte wissen wie es sich mit den übergaben über pointern verhällt..
int KoordinatenAbfrage() { int ax, ay, bx, by; int *p_xy=0; bool error; do { error=false; scanf("%i",&ax); scanf("%i",&ay); scanf("%i",&bx); scanf("%i",&by); } while(error==true); int xy[4]={ax,ay,bx,by}; return xy[0]; } int main() { unsigned int function_return; unsigned int *point_arr; unsigned int x, y, ax, ay, bx, by; function_return=KoordinatenAbfrage(); *point_arr=&function_return; printf("%i ",point_arr); point_arr=point_arr+1; printf("%i ",point_arr);
hab einige rausgeschnitten die nicht relevant sind.
meines wissen sind bei einem Array die Speicheradressen direkt nacheinander, nicht? mein problem ist, ich will einen Pointer zurück geben und quasi durch aufaddieren auf die anderen werde kommen.
nur irgendwie bin ich glaub ich zu blöd dafür
wär nett wenn ihr mir helfen/nennen könntet was ich falsch mache
-
Auf dem Stack erzeugte lokale Variabeln existieren nur innerhalb der Funktion, so auch dein int xy[4] Array.
Nach dem Verlassen der Funktion ist die Adresse des Arrays nicht mehr gültig.
Eine Ausnahme wäre, wenn du das Array static deklarieren würdest. Dann hätte das Array eine feste Adresse im Speicher:int* KoordinatenAbfrage() { static int xy[4] = {4,3,2,1}; return &xy; } int main() { int *ptr = KoordinatenAbfrage(); printf("%i ",*(ptr)); printf("%i ",*(ptr+1)); printf("%i ",*(ptr+2)); printf("%i ",*(ptr+3)); }
Ob das von praktischem Nutzen ist, sei mal dahingestellt.
Einen Zeiger auf ein mit malloc erzeugtes Array zurückzugeben, würde auch funktionieren.
-
Was würde es denn bewirken, wenn ich die Fkt selbst als static deklariere? In dem Fall garnichts? Und im Allgemeinen? - Ich bin bischer nicht dahintergekommen, was static bei Funktionen in C bewerkstelligen soll.
-
bluppi schrieb:
Was würde es denn bewirken, wenn ich die Fkt selbst als static deklariere? In dem Fall garnichts? Und im Allgemeinen? - Ich bin bischer nicht dahintergekommen, was static bei Funktionen in C bewerkstelligen soll.
In diesem Fall würde es nichts bewirken. Wenn eine Funktion nur innerhalb einer Datei genutzt werden soll, deklariert man sie static.
Ist eine Art Kapselung.
-
der zickt bei der static zeile.
"initializer element is not constant"sieht jetzt so aus:
#include <stdio.h> #include <conio.h> #include <stdbool.h> #define endl printf("\n") int *KoordinatenAbfrage() { int ax, ay, bx, by; scanf("%i",&ax); scanf("%i",&ay); scanf("%i",&bx); scanf("%i",&by); static int xy[4]={ax,ay,bx,by}; return &xy; } int main() { unsigned int *ax; *ax=KoordinatenAbfrage(); printf("%i ",*ax); getch();
möchte halt in der unterfunktion variablen defineren und in der main funktion diese 4 auch wieder in variabeln einlesen.
bzw von malloc hab ich noch garnix gehört, wie würde dass denn aussehen?
mir gehts ja im groben eh nur um die übergabe 4er variablen in einer subfunktion
-
wenns relevant sein sollte. mein IDE ist Dev-Cpp
-
yus schrieb:
mir gehts ja im groben eh nur um die übergabe 4er variablen in einer subfunktion
Dafür ist in der Tat eine static Deklaration sowie malloc ungeeignet.
Mach das doch so:
int KoordinatenAbfrage ( int* array ) { // Hier Eingabe mit Fehlerprüfung, muss noch geschrieben werden. // Simulierte Eingabe: array [0] = 4; array [3] = 3; array [2] = 2; array [1] = 1; return 0; // Eingabe war erfolgreich. } int main ( void ) { int Koordinaten [4] = {0}; KoordinatenAbfrage ( Koordinaten ); printf("%i ", Koordinaten [0] ); printf("%i ", Koordinaten [1] ); printf("%i ", Koordinaten [2] ); printf("%i ", Koordinaten [3] ); return 0; }
Zu der Fehlermeldung "initializer element is not constant":
Die Elemente mit denen xy initialisiert wird sind keine Konstanten.
So würde die Initialisierung klappen: static int xy[4]={0,0,0,0};
-
#include <stdio.h> #include <conio.h> #include <stdbool.h> #define endl printf("\n") int KoordinatenAbfrage( int* xy) { int ax, ay, bx, by; bool error; do { error=false; system("cls"); printf("Zum beenden des Programms eine Variable auf 0 setzen!\n\n"); printf("Koordinaten fuer Karte1 eingeben (x,y):\n"); scanf("%i",&ax); scanf("%i",&ay); printf("\n\nKoordinaten fue Karte2 eingeben (x,y):\n"); scanf("%i",&bx); scanf("%i",&by); if(ax==0 || ay==0 || bx==0 || by==0) return 1; else if(ax==bx && ay==by) { error=true; printf("\nFehler! Die Koordinaten der Karten sind Identisch! Bitte neueingeben!\n"); system("pause"); } else if(0>ax || ax>4 || 0>ay || ay>4 || 0>bx || bx>4 || 0>by || by>4) { error=true; printf("\nFehler! Mind. 1 Koordinate ist inkorrekt! Bitte neueingeben!\n"); system("pause"); } } while(error==true); xy[0]=ax; xy[1]=ay; xy[2]=bx; xy[3]=by; return 0; } int main() { int ax, ay, bx, by; int Koordinaten={0}; KoordinatenAbfrage( Koordinaten ); if(Koordinaten[0]==1) return 0; ax=Koordinaten[0]; ay=Koordinaten[1]; bx=Koordinaten[2]; by=Koordinaten[3]; printf("%i %i %i %i",ax,ay,bx,by); getch(); }
so hab mich jez an deinem vorschlag orientiert aber iwie zickt der mit:
58 C:\Dokumente und Einstellungen\Administrator\Desktop\C++\Memory.c [Warning] passing arg 1 of `KoordinatenAbfrage' makes pointer from integer without a cast 60 C:\Dokumente und Einstellungen\Administrator\Desktop\C++\Memory.c subscripted value is neither array nor pointer
-
ups.. jez hab ich den ganzen quelcode geschickt.. sorry
-
die deklaration int Koordinaten={0}; in der main funktion
muss heissen:
int Koordinaten [4] = {0};
die eingabe in deiner do while schleife solltest du noch absichern. wird nämlich ein buchstabe anstatt einer zahl eingegeben, gibt es probleme.
warum darf eine koordinate nicht den wert 0 haben?gruß
B.B.
-
welch banaler fehler..
ich danke dir sehr ^^!!