Frage zur funktion
-
Master User schrieb:
Ja aber ich will die zahl1 eins nicht als copy weitergeben sondern als zeiger??wie siht die fun2 aus das meinte ich mit funk2(---)??
Zeiger und Werteübergaben sind ein bisschen kompliziert, ich versuchs mal zu erklären.
Ein Zeiger wird per Wert übergeben:
void foo(int* p);
int val;
int* i=&val;
foo(i);hier ist p eine Kopie von i. Aber sowohl p als auch i zeigen auf val. Wenn wir nun *p verändern, zB so: *p=3; ändern wir val. val wird hier auf den Wert 3 gesetzt.
Ändern wir aber p, zB so; p=malloc(1*sizeof int); so zeigt p auf etwas anderes als i. Wenn foo nun beendet wird, geht p verloren - es wird zerstört und der angeforderte Speicher ist unnerreichbar. Weil p ja nur eine Kopie von i war.
Wenn du jetzt einen Zeiger per Referenz übergeben willst, musst du einen Zeiger auf den Zeiger übergeben:
void foo(int** p);
jetzt können wir
*p=malloc(1*sizeof int);
schreiben, und auch i wird verändert. Denn p zeigt hier nicht auf val sondern auf i.Wenn du jetzt also einen Zeiger auf val an foo2 übergeben willst, eght das so:
void foo2(int* p);
void foo(int* p) { foo2(p); }p ist in foo2 eine Kopie von p, welches eine Kopie von i ist. Und alles zeigt auf val.
halbwegs verständlich?
Wenn nicht, frag nach.
Zeiger sind leider n bisschen kompliziert
Du kannst dir ja auch mal: http://pw1.netcom.com/~tjensen/ptr/pointers.htm durchlesen...
-
Hier der Grund:
http://users.aber.ac.uk/auj/voidmain.shtml
-
Man anti void man ist das was auf der seite da steht eigntlich c???
Man ich verstehe schon diese zeiger aber zeiger auf zeiger das verstehe ich nicht hast du vileicht infos auf deutsch??Und kannst du mal dieses programm mal anschauen und mir sagen wo der fehler bei der zeiger-zeiger ist???Ich finde sie eigendlich nicht kanst du mal nachkuken danke im voraus oder kannst du kurz ein miniprogramm sreiben das zeigt wie von einer funktion eine ander funktion aufgeruft wird und dort die variable ferendert und wider bei der main ausgeben wird??#include<stdio.h> // //Dilosh sunartisewn // int Max3(int *Ar1,int *Ar2,int *Ar3,int *Ar4,int *IfCounter, int SwapCounter); int Max2(int *Ar1,int *Ar2,int *Ar3,int *IfCounter, int SwapCounter); int Max1(int *Ar1,int *Ar2,int *IfCounter, int SwapCounter); int Max0(int *Ar1,int *IfCounter, int SwapCounter); void Swap(int *Num1,int *Num2,int *SwapCounter); //Skopos alagi duon Metablhton // // //Kuria sunarthsh int main(void) { //Dhlosh metablhton int a; //Protos Ari8mos int b; //Deuteros Ari8mos int c; //Tritos Ari8mos int d; //Tetartos arithmos int Max; //Metalhth int SwapCounter; //Metriths ton Alagon int IfCounter; //Metriths ton sungrisewn // a=0; b=0; c=0; d=0; Max=0; SwapCounter=0; IfCounter=0; //Kurio programma //Eisagwgh dedomenon apo to plhktrologio printf("Dwse 4 arithmous:\n"); scanf("%d %d %d %d", &a, &b, &c, &d); //Psaxnei kai ektiponh to megalhtero apo tous tesseris ari8mous Max=Max3(&a, &b, &c, &d, &IfCounter, &SwapCounter); printf("\n\b\t%d<",Max); Max=0; //psaxnei kai ektiponh to megalhtero apo tous hpolipous treis ari8mous Max=Max2(&b, &c, &d, &IfCounter, &SwapCounter); printf("%d<",Max); Max=0; //psaxnei kai ektiponei to megalhtero apo tous ypolipous duo api8mous Max=Max1(&c, &d, &IfCounter, &SwapCounter); printf("%d<",Max); Max=0; //psaxnei kai ektiponi to megalhtero apo tous ena ari8mous Max=Max0(&d, &IfCounter, &SwapCounter); printf("%d\n",Max); Max=0; return 0; } //-----------------------------------------------------------------\\ ////////////////////////Sunarthshseis\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\ //-----------------------------------------------------------------\\ ///////////////////////////////////////////////////////////////////// //Syngrienei tessereis arithmous kai bgazei to megalhtero // ///////////////////////////////////////////////////////////////////// int Max3(int *Ar1,int *Ar2,int *Ar3,int *Ar4,int *IfCounter, int *SwapCounter) { //Dhlosh Metablhton int TempMax; //Megalhteros arithmos mesa sthn sunarthsh // //TempMax=0; //Kurio Programma TempMax=Max2(&Ar1, &Ar2, &Ar3, &IfCounter, &SwapCounter); TempMax=Max1(&TempMax, &Ar3, &IfCounter, &SwapCounter); return TempMax; } ///////////////////////////////////////////////////////////////////// //Shngreinh treis ari8mous kai bgazei to megalhtero // ///////////////////////////////////////////////////////////////////// int Max2(int *Ar1,int *Ar2,int *Ar3,int *IfCounter, int *SwapCounter) { //Dhlosh Metablhton int TempMax; //Megaliteros arithmos mesa sthn sunarthsh. //int PusherAr1; // //TempMax=0; TempMax=Max1(&Ar1, &Ar2, &IfCounter, &SwapCounter); TempMax=Max1(&TempMax, &Ar3, &IfCounter, &SwapCounter); return TempMax; } ///////////////////////////////////////////////////////////////////// // Sungrinei duo ari8mous kaitous kattasei sosta, se afthn thn // // sunarthsh stirizontai olles oi alles // ///////////////////////////////////////////////////////////////////// int Max1(int *Ar1,int *Ar2,int *IfCounter, int SwapCounter) { *IfCounter+=1; if(!(*Ar1<*Ar2)) { Swap(&Ar1, &Ar2, &SwapCounter); } return 0; } ///////////////////////////////////////////////////////////////////// // Den kani tipota aplos dinei piso thn metablhth, apofasisa na // // na dimiourgiso authn thn sunarthsh gia thn oloklhrosh ths domhs// ///////////////////////////////////////////////////////////////////// int Max0(int *Ar1,int *IfCounter,int *SwapCounter) { //Kuris sunarthsh return *Ar1; } ///////////////////////////////////////////////////////////////////// // Skopos ths sunartiseis alagh ton duo metablhton pou usagonte se// // se afthn thn sunarthsh // ///////////////////////////////////////////////////////////////////// void Swap(int *Num1,int *Num2,int *SwapCounter) { //Dhlosh metablhton int Temp; //Prosorinh metablhth // Temp=0; //Kurio programma Temp = *Num1; *Num1 = *Num2; *Num2 = Temp; *SwapCounter= *SwapCounter+1; }
-
arrrrrrrrrrrrrrrrrghhhhhhhhhhhhhhhhhhhhhhhh:
ferendert und wider
aaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhhh!!!!!!!!!!!Ich mach so was normal nicht, musste aber raus.
Och nöh oder:
nachkuken
Ich unterstelle dir jetzt die Fehler sind nur in der Hektik entstanden nicht wahr
Also eine Anleitung oder gar ein neues Programm will ich dir nicht schreiben.
aber du kannst hier mal nachgucken und ich verspreche dir du wirst
eine sehr gut Anleitung in deutsch erhalten die Tutorials habe ich bereits teils selbst gelesen:http://www.c-plusplus.net/c.htm
nimm z.B. Softwareentwicklung in C das ist denke ich genau das richtige.
Ein Zeiger auf einen Zeiger ist auch nichts weltbewegendes du benötigst später dann eben zwei **(Auflösungszeichen) um auf die Speicherstelle z.B. einen
ganzzahligen Wert oder so zuzugreifen.Zeiger benutzt man ja bekanntlich so:
int *ptoint; //du definierst einen Zeiger auf einen int-Wert, kannst
//also später hier Adressen von int-Werten ablegen/*z.B. so*/
ptoint = &i; // i ist ein int-Wert das Sternchen kann nun weg bleiben bei
// Poinervariablen ptoint vergiss nicht das &
// mit welchem du die Adresse von i in ptoint speicherst/*Es folgen jetzt vielleich irgendwelche Operationen mit dem Pointer*/
*ptoint = *ptoint + 1; // Erhöht den Wert an der Speicherstelle auf den du
// mit "*" zugreifst z.B. um eins.Für eventuelle Fehler und auch Schreibfehler meinerseits keine Garantie
mit C habe ich schon 'ne Weile nichts mehr gemacht und über Pointer gibt's noch mehr zu berichten.
-
*ptoint = *ptoint + 1; sorry das ist falsch man versucht hier einem Wert einen Wert zuzuweisen.
man könnte eher das hier schreiben:
i = *ptoint + 1;
-
@Master
Wie wärs, wenn du bei einem Thread bleiben würdest?? Dein Problem dürfte eigentlich im anderen Thread schon gelöst worden sein und es ist genau das gleiche Problem. Ist ja auch der gleiche Quellcode.Also hier gehts weiter: http://www.c-plusplus.net/forum/viewtopic.php?t=59805
-
interpreter schrieb:
Wer weis rad??
leg dir ma ein anständiges Buch zu
Ja, am besten einen Duden. :p
*SCNR
der musste jetzt kommen
-
Hab mir einen duden gekauft bei lidel für 6.99 ein richtigen diken gibt auch fur deutsch-andere sparchen.(Schleichwerbung)
Weist du du bist nicht der einzige der mich verarscht, mich verarchen die mathematiker in einen mathematik forum, meine mitschuler und sogar mein Profesor!!!! Wiso aber??? Das komische ist aber bei der kanze sache ich schreibe schlecht deutsch, schlecht griehisch, und seeeeehr schlecht englisch das ist aber sehr komisch???
Zuruck zur frage:
Wiso ist das ein fehler ich kann dochi=i+1;
schreiben wiso dan nicht
i*=i*+1;
fehler ist nur wenn es &i=&+1; were nur das were ein fehler da ich bei der adrese von i noch eins dazu rechne also ich &i+1 ist dan ein speicher platz neben &i, wiso aber ist *i+1 ein fehler???
-
okey ich höre auf hoer zu schreiben und schreibe nur noch bei ander ding ich glaube das heist treat
-
Entweder du willst uns heir kräftig verar*chen oder du sprichst sehr schlecht deutsch, was zumindest deine schlechte Rechtschreibung entschuldigen würde; wenn du eben schlecht deutsch sprichst, und vielleicht aus dem Ausland kommst
vergiss die Vorwürfe und sag es vorher; dann wissen alle bescheid........!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!