Matrix mit Feldern UND Zeigern???
-
Hiho
Ich hab mal wieder ne Schulaufgabe. Bis jetzt hab ich eigentlich viele alleine hingekriegt *freu*, aber bei dieser hier hab ich Probleme...
Bzw. eigentlich erfüllt es den gewünschten Zweck, aber es ist wohl nicht so geschrieben wie verlangt...also. hier erstmal die aufgabe:
Schreibe mit Hilfe von Zeigern ein Programm, welches eine 3*3-Matrix einliest, jedes Element um 2 erhöht und die neue Matrix wieder ausgibt!
So. Eigentlich ist das Proggi selbst kein Problem gewesen.
Ich hab es so realisiert:#include <stdio.h> main() { int matrix[3][3], i, I, m, M; for(I=0;I<3;I++){ for(i=0;i<3;i++){ scanf("%d", &matrix[I][i]);}} printf("\n"); for(M=0;M<3;M++){ for(m=0;m<3;m++){ matrix[M][m]=matrix[M][m]+2; printf("%4.d ", matrix[M][m]);} printf("\n");} scanf ("%d", &i); }
So weit so gut. Das Problem ist nur, hier hab ich nicht einen einzigen Zeiger wie in der Aufgabe gewünscht verwendet... *g*
Wisst ihr, wie das gemeint ist? Wo könnte man da etwas durch Zeiger ersetzen?
Etwa in einer anderen Funktion? (hab schon bissi überlegt, aber hat zu nix geführt um ehrlich zu sein).Thx && cu
-
z.B.
int i,j; double tmp; double **value; value=(double **)calloc(3,sizeof(double)); for(i=0;i<3;i++) value[i]=(double *)calloc(3,sizeof(double)); for(i=0;i<3;i++) for(j=0;j<3;j++) { tmp+=2; value[i][j]=tmp; }
Ausgabe wirste dann ja wohl hinbekommen, oder ?
Winn
-
Du arbeitest doch mit Zeigern. Ist ja z.B. ein Zeiger den du an scanf übergibst.
Warum benutzt du für die Ausgabe nicht mit den gleichen Indexvariablen wie bei der Eingabe?
-
@winn: hui, da sind viele Befehle drinne die ich noch gar nicht kenne...^^
(darf ja nur die benutzen, die ich kenne. das währen dann nur if- else, funktionen, die schleifen und break bzw. continue. mehr (unnd natürlich zeiger^^) kenn ich noch nicht..calloc und sizeof sagen mir z.b. nichts
@entryl_sa: naja ich meinte mit * und allem drum und dran^^
das hab ich jetz nur gemacht mit zwei indexbuchstaben wegen der überischtlichkeit. ich willte das einlesen und ausgeben deutlich von einander trennen...hmm. wie könnte man das noch machen? (ohne clloc und sizeof)
thx
cu
-
Hier eine Lösung die auch ein * beinhaltet. Ich halte es aber Prinzipiel nicht für sinnvoll bestimte Elemente gezwungenermassen in ein Programm zu stecken.
#include <stdio.h> void einlesen(int (*m)[3]){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) scanf("%d", &m[i][j]); } } void erhoehen(int (*m)[3]){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) m[i][j]+=2; } } void ausgeben(int (*m)[3]){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%4.d", m[i][j]); printf("\n"); } } int main() { int matrix[3][3]; einlesen(matrix); erhoehen(matrix); ausgeben(matrix); return 0; }
Die Version mit dynamischen Speicher von Winn beinhaltet natürlich mehr Zeiger, aber wenn du noch nicht weisst wie man Speicher alokiert ist das schlecht. Sehe aber auch keinen Grund eine Matrix fester grösse dynamisch anzulegen.
-
hey danke!!!!
hast mir prächtig geholfen damit
aber das mit dem zwingend befehle etc. benutzen find ich auch. ich hab meinem lehrer nämlich den quelli gezeigt, den ich oben hatte da schnautst der alte (der übrigens sein quelltexte ausgedruckt und während der arbeit mit füller auf papier haben will......!) mich an "nein ich will das nicht. du sollst da zeiger einbauen. alles andere zählt hier nicht. verstanden?"waaah. so ein n00b
*g*
aber danke für deine Hilfe!!!
cya
-
sry, ich hab da noch paar kleine fragen zu
*g*
void einlesen(int (*m)[3]){
warum hastn du um das *m ne klammer gemacht? bzw. warum dann ausserhalb das mit dem array, und warum haste nur eins genommen statt beide? (also nur [3] statt [3][3])?
ich hab zeiger eigentlich so verstanden: wenn man eine varibale wie z.b. "b" hat und vor das b ein * setzt, dann wird nicht der inhalt von b ausgegeben, sondern wenn z.b. in b 1231 drinn is, dann sucht er im speicher 1231 und gibt das aus... hab ich das richtgi verstanden??? weil in m wäre doch dann das selbe wie in der gesamten matrix oder??} void erhoehen(int (*m)[3]){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) m[i][j]+=2; } } void ausgeben(int (*m)[3]){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%4.d", m[i][j]); printf("\n"); } }
kann ich hier nicht die beiden ausgaben bei 'ausgeben' einfach in die fiefere schleife bei erhöhen reinschreiben? so wird gleich der erhöhte wert ausgegeben... oder???
danke
cu
-
Also das hier:
void einlesen(int (*m)[3])
entspricht dem hier:
void einlesen(int m[][3])
und ist absolut grauenvoller Code, den ich nur geschrieben habe weil du ja umbedingt einen * da drinnen haben wolltest. Aber es verdeutlicht das da eigentlich schon ein Zeiger übergeben wird, selbst wenn da kein * steht.
Kleine Randbemerkung: Wenn man ein zweidimensonales statisches (also nicht dynamischens) array übergibst, dann musst du die zweite Dimension angeben, da er sonst die Indexberechnung nicht durchführen kann.
Mit Zeigern zu arbeiten macht bei diesem Problem einfach keinen Sinn.
Natürlich kannst du das erhoehen und ausgeben auch in einer Funkion machen, aber wie soll ich die dann nennen erhoehen_und_ausgeben ? Ich kapsele Dinge die nicht umbedingt zusammen gehören einfach gerne voneinander ab.
-
Hier nochmal eine Version die etwas mehr * hat, und wohl etwas schoener ist. Ich habe die Matrix hier einfach aufgebaut wie man das bei einer dynamischen machen würde.
#include <stdio.h> void einlesen(int **m){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) scanf("%d", &m[i][j]); } } void erhoehen(int **m){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) m[i][j]+=2; } } void ausgeben(int **m){ int i,j; for(i=0;i<3;i++){ for(j=0;j<3;j++) printf("%4.d", m[i][j]); printf("\n"); } } int main() { int *matrix[3]; int x[3]; int y[3]; int z[3]; matrix[0]=x; matrix[1]=y; matrix[2]=z; einlesen(matrix); erhoehen(matrix); ausgeben(matrix); return 0; }
Schönen Gruß an deinen Lehrer, wenn er umbedingt Zeiger haben will, dann soll er doch auch erklären warum.
-
vielleicht meint er (der lehrer) einfach die schreibweise. was ich meine:
c[3] ist doch dasselbe wie *(c + 3)
-
sry, aber eine kleinigkeit hab ich immer noch nich verstanden *g*
warum hastn du bei dem m 2 * gemacht?? also ** ???
ich weiss gar nicht warum du doppelt zeigst..thx!!!
bye
-
hilfe^^
-
@schmank
das **m bedeutet pointer auf einen pointer er hätte glaub ich auch *m[] schreiben können...hoffe deine frage ist beantwortet:-)
greets ciro
-
zeiger sind blöde
ich glaub das dauert noch ne weile bis ichd a durchblicke. weil ich hätte jetz stattdessen die adresse von ner variable übergeben. also so:#include <stdio.h> void erhoehen(int *zeiger) { *zeiger=*zeiger++; } void main(void) { int Zahl; printf("Zahl: "); scanf("%d",&Zahl); erhoehen(&Zahl); printf("\nErgebnis: %d\n",Zahl); getch(); }
wäre das nich eigentlich so gedacht????^^^cya
-
Erst mal:
*zeiger=*zeiger++;
das hier ist etwas überflüssig, denn der ++ operator herhöht die Variable schon, den erhöhten Wert an sich selber zuzuweisen ist daher überflüssig. Hier würde also
*zeiger++
ausreichen.
Sonst ist dein Beispiel ja OK.
Bei Arrays sieht das aber halt etwas anders aus, weil ein Array ja nichts anderes ist wie ein Zeiger auf das erste Element. Bei:
int m[10];
m schon eine Zeiger auf int ist, also direkt als solcher übergeben werden kann.
Wenn du das noch nicht verstanden hast solltest du dir vielleich nochmal ein Tutorial besorgen was sich mit Arrays beschäftigt, wenn ich das richtig sehe liegt dein Problem wohl eher bei der Repräsentation von Arrays als bei Zeigern selbst.
Gruß
Entyl Sa
-
weil ein Array ja nichts anderes ist
wie ein Zeiger auf das erste Elementarrays sind keine zeiger, sie zerfallen freundlicherweise in diese, sind aber keine
bye
tt
-
was noch ein bisschen sinn machen könnte, wäre wenn man, anstatt von normalen schleifenwariablen, pointer inkrementiert.
#include <stdio.h> int main() { int matrix[3*3], *i; for(i=&matrix[0];i<&matrix[9];i++) { scanf("%d", i); } printf("\n"); for(i=&matrix[0];i<&matrix[9];i++) { i* += 2; printf("%4.d ", *i); if((i - &matrix[0]) % 3) printf("\n"); } scanf ("%d", &i); }
is ungetestet, könnte sich also irgendwo ein kleiner fehler eingeschlichen haben...
mfg japro
-
der kleine fehler von oben ist genau hier:
scanf ("%d", &i);
das geht zwar warscheinlich, weil zeiger und integer häufig gleich gross sind. aber es muss nicht gehen. ich würds durch ein:
getchar();
ersetzen.
mfg japro
-
Entyl_Sa schrieb:
Erst mal:
*zeiger=*zeiger++;
das hier ist etwas überflüssig, denn der ++ operator herhöht die Variable schon, den erhöhten Wert an sich selber zuzuweisen ist daher überflüssig. Hier würde also
*zeiger++
ausreichen.
Sonst ist dein Beispiel ja OK.
Falsch!!! Siehe Rangfolge von Operatoren! Du erhöhst nur den Zeiger aber nicht den Wert, auf den der Zeiger zeigt.
-
TheTester schrieb:
weil ein Array ja nichts anderes ist
wie ein Zeiger auf das erste Elementarrays sind keine zeiger, sie zerfallen freundlicherweise in diese, sind aber keine
Entschuldige meine unpräziese ausdrucksweise, ich wollte damit natürlich nicht aussagen das ein Array ein Zeiger ist, wäre ja auch etwas schwierig so viele Zahlen (oder andere Sachen) in einem Zeiger zu speichern. Aber da es hier um die Übergabe an Funktionen ging habe ich erwartet das man das richtig interpretiert.
AJ schrieb:
Falsch!!! Siehe Rangfolge von Operatoren! Du erhöhst nur den Zeiger aber nicht den Wert, auf den der Zeiger zeigt.
Da habe ich wohl in der Tat nicht auf die Rangfolge geachtet, aber was er gemeint hat war ja wahrscheinlich auch (*zeiger)++ was alleine natürlich ausreicht.
Gruß
Entyl Sa
-
Also ich hab das mir nochmal durchgelesen
ich glaub ich habs so einigermaßen verstanden jetzt. aber ein problem hab ich immer noch. dieser quelltext will nicht:#include <conio.h> #include <stdio.h> void funktion(int*); void funktion(int* array) { array[0][2]=array[0][2]+2;} main() { int array[3][3]; scanf("%d",&array[0][2]); funktion(array); printf("\n%d",array[0][2]); system("PAUSE"); }
wsarum gwht das nich? ich deklariere einen 3x3 array. dann lese ich in das feld 0;2 nr zahl ein. dann wird die adresse vom feld 0;0 an die funktion übergeben. dort addiere ich 2 zu dem feld hinzu. jetzt wird zurückgeschrpungen und der wert nach der addition ausgegeben. warum geht das nicht? ich erhalte immer folgende meldung:
"subscripted value is neither array nor pointer" ???
thx
cu