Hallo, ich verstehe nicht warum mein Programm zur Berechnung von
Matrizen, keine größere Zeilenanzahl als 4 zulässt, ab zeile = 5 stürzt
das Programm immer ab. Bei Zeilenwerten unter 5 funktioniert alles
einwandfrei.
Über eine Antwort würde ich mich sehr freuen:
1
#include<stdio.h>
2
#include<stdlib.h>
3
#include<time.h>
4
5
#define nl printf("\n");
6
7
//Hier werden der Matrix Werte übergeben(und hier ist wohl auch der Fehler:
8
voidinit(int**matrix,intzeile,intspalte){
9
intzahl,eingabe,i,k;
10
printf("Jeden Wert einzeln(0), oder nur mit einem einigen Wert initialisieren(1)");nl
11
scanf("%d",&eingabe);
12
13
//Jede Zahl einzeln initialisieren:
14
if(eingabe==0){
15
printf("Initialisiere die Matrix:");nl
16
for(i=0;i<zeile;i++){
17
for(k=0;k<spalte;k++){
18
scanf("%d",&zahl);
19
matrix[i][k]=zahl;
20
}
21
}
22
//Mit nur einen Zahl initialisieren:
23
}else{
24
printf("Welche Zahl?");nl
25
scanf("%d",&zahl);
26
for(i=0;i<zeile;i++){
27
for(k=0;k<spalte;k++){
28
matrix[i][k]=zahl;
29
// printf(" %d ", i); KOntrolle von i, mit dem Ergnis, das es gar nicht alle Spalten der 5. Zeile abgearbeitet werden
30
// *(*(matrix+i)+k)=zahl; Alternativschreibweise
31
}
32
}
33
}
34
}
35
//Hier bekommen alle Werte einer Matrix den Wert 0:
36
voidinit_zero(int**matrix,intzeile,intspalte){
37
inti,k;
38
for(i=0;i<zeile;i++){
39
for(k=0;k<spalte;k++){
40
41
matrix[i][k]=0;
42
}
43
}
44
}
45
//Hier wird die Matrix ausgegeben:
46
printm(int**matrix,intzeile,intspalte){
47
inti,k;
48
49
for(i=0;i<zeile;i++){
50
for(k=0;k<spalte;k++){
51
printf("%d\t",matrix[i][k]);
52
}
53
nl
54
}
55
}
56
//Hier werden der Matrix Zufallswerte übergeben:
57
voidinit_random(int**matrix,intzeile,intspalte){
58
intzahl,i,k;
59
time_tt;
60
srand((unsigned)time(&t));
61
zahl=rand()%10;
62
for(i=0;i<zeile;i++){
63
for(k=0;k<spalte;k++){
64
zahl=rand()%10;
65
matrix[i][k]=zahl;
66
}
67
}
68
}
69
70
//Hier bekommt die Matrix die Anzahl der Zeilen und Spalten:
//Hier bekommt die Matrix die Anzahl der Zeilen und Spalten:
2
int**structm(int**matrix,intzeile,intspalte){
3
4
inti;
5
matrix=malloc(zeile*sizeof(int));
6
if(matrix==NULL){
7
printf("kein Speicherplatz vorhanden");nl
8
return0;
9
}
10
11
for(i=0;i<zeile;i++){
12
matrix[i]=malloc(spalte*sizeof(int));
13
if(matrix[i]==NULL){
14
printf("kein Speicherplatz vorhanden");nl
15
return0;
16
}
17
}
18
returnmatrix;
19
}
> matrix=malloc(zeile*sizeof(int));
Das ist Murks. matrix ist kein int*, sondern ein int**, also ist hier
sizeof int nur dann zufälligerweise korrekt, wenn sizeof int == sizeof
int* ist.
Warum übergibst Du der Funktion den Parameter "matrix"? Was erhoffst Du
Dir davon?
> #define nl printf("\n");
Gewöhn Dir das gleich wieder ab. Du kannst auch einfach \n an Deine
Ausgaben anhängen, so, wie es der Rest der Welt auch macht.
Okay, klingt einleuchtend, aber wie würde es dann korrekt aussehen?
Den Parameter "matrix" übergebe ich weil ich der Matrix Speicher
zuweisen will.
Ist denn der Rest mit dem "int **matrix"(zum Beispiel bei den
Funktionen) richtig, oder ist bei mir alles eher zufällig geglückt...für
bestimmte Werte.
Okay, danke für den Hinweis beim "nl".
David O. schrieb:> Den Parameter "matrix" übergebe ich weil ich der Matrix Speicher> zuweisen will.
Da Du die Variable mit dem Rückgabewert der Funktion überschreibst, geht
das gut, aber es ist überflüssig und nutzlos, das als Parameter zu
übergeben.
Wolltest Du tatsächlich den übergebenen Parameter verändern, müsstest Du
a) den Rückgabewert der Funktion nicht an matrix zuweisen und b) einen
Pointer auf matrix übergeben und den innerhalb Deiner Funktion
dereferenzieren:
1
//aufruf
2
3
int**mm;
4
5
if(!structm(&mm,3,4))
6
{
7
//fehlerbehandlung
8
}
9
10
11
12
13
//Hier bekommt die Matrix die Anzahl der Zeilen und Spalten:
14
int**structm(int***matrix,intzeile,intspalte)
15
{
16
inti;
17
18
*matrix=malloc(zeile*sizeof(int*));
19
if(*matrix==NULL)
20
{
21
printf("kein Speicherplatz vorhanden\n");
22
return0;
23
}
24
25
for(i=0;i<zeile;i++)
26
{
27
*matrix[i]=malloc(spalte*sizeof(int));
28
if(*matrix[i]==NULL)
29
{
30
printf("kein Speicherplatz vorhanden\n");
31
return0;
32
}
33
}
34
return*matrix;
35
}
Der Rückgabewert hat hier keinen weiteren Gebrauchswert als daß er im
Erfolgsfall nicht 0 ist, was beim Aufruf entsprechend ausgewertet werden
kann. Du könntest die Funktion daher auch irgendeinen anderen Typen als
int** zurückgeben lassen, ein einfacher int würde reichen, der 0 bzw. 1
annimmt.
Findest Du nicht auch, daß ein paar Leerzeichen den Code lesbarer
machen?
Rufus Τ. F. schrieb:> Da Du die Variable mit dem Rückgabewert der Funktion überschreibst, geht> das gut, aber es ist überflüssig und nutzlos, das als Parameter zu> übergeben.>> Wolltest Du tatsächlich den übergebenen Parameter verändern, müsstest Du> a) den Rückgabewert der Funktion nicht an matrix zuweisen und b) einen> Pointer auf matrix übergeben und den innerhalb Deiner Funktion> dereferenzieren:
Ja, danke, das stimmt...
Hab die Korrektur jetzt mal eingefügt(In der Funktion structm), jetzt
geht allerdings gar nicht mehr, wo also hängts bei mir noch, der Rest
sieht meiner Meinung nach richtig aus....bzw ich raff es nicht...
Rufus Τ. F. schrieb:> Findest Du nicht auch, daß ein paar Leerzeichen den Code lesbarer> machen?
Ja, da ist schon was dran :)
Rolf M. schrieb:> Ich würde den Compiler selber den richtigen Typ finden lassen:
Das ist wartungsfreundlicher. Punkt für Dich.
> Das müßte heißen:
Du hast natürlich auch hier recht.
Alternativ könnte man schreiben
matrix->[i] = malloc(...)
aber das würde vermutlich wieder Leute auf die Barrikaden bringen, die C
unlesbar finden.
Rufus Τ. F. schrieb:> matrix->[i] = malloc(...)
Gaht das? Ich glaube nicht. Den "->"-Operator kann man in C doch nur auf
einen Struct-Pointer anwenden.
Rufus Τ. F. schrieb:> aber das würde vermutlich wieder Leute auf die Barrikaden bringen, die C> unlesbar finden.
Dafür wäre evtl. Folgendes ganz gut geeignet:
1
i[*matrix]=malloc(...);
Damit spart man sich die runden Klammern in
1
(*matrix)[i]=malloc(...);
was den Code deutlich kürzer und übersichtlicher macht ;-)
Yalu X. schrieb:> Rufus Τ. F. schrieb:>> matrix->[i] = malloc(...)>> Gaht das? Ich glaube nicht.
Ich auch nicht. a->b ist die Entsprechung von (*a).b. Aber (*matrix).[i]
ergibt keinen Sinn. Damit ergibt auch matrix->[i] keinen.
Yalu X. schrieb:> Dafür wäre evtl. Folgendes ganz gut geeignet:>>
1
>i[*matrix]=malloc(...);
2
>
>> was den Code deutlich kürzer und übersichtlicher macht ;-)
Könnte bei denen für Verwirrung sorgen die nicht wissen dass:
a[i] == *(a+i) == *(i+a) == i[a] ist. ;-)