ubuntuusers.de

[C] 2-dimensionales Array an Funktion übergeben

Status: Ungelöst | Ubuntu-Version: Nicht spezifiziert
Antworten |

cs071007

Anmeldungsdatum:
23. Oktober 2007

Beiträge: Zähle...

guten tag

Ich würde gerne im Zuge einer Programmieraufgabe einer Funktion einen zweidimensionalen Array übergeben. Leider bin ich atm ein wenig auf dem holzweg und hoffe deshalb, dass mir hier wer weiterhelfen kann.

Was ich im Moment habe:

main:
...
double f1[10][10];
double f2[10][10];
funktion(f1, f2, [noch andere parameter])
...

funktion:
double **funktion(double** f1, double** f2, size_t xcount, size_t ycount, int repeats, int extra) {
...
return f1;
}


Der compiler wirft in dem Fall die Warnung "projekt.c:28: Warnung: Übergabe des Arguments 1 von »funktion« von inkompatiblem Zeigertyp", wobei Zeile 28 der Funktionsaufruf ist. kann mir irgendwer erklären, woran das liegt? bin schon ein wenig am verzweifeln.

thx im voraus
cs

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Das liegt daran, das der Typ von f1 (und f2) nicht double** ist, sondern double (*)[10] und diese Zusatzinformation über die Grösse der "zweiten Ebene" mag der Compiler nicht einfach so "wegwerfen". Du wirst beim Aufruf nach double** casten müssen wenn Dich die Warnung stört. (Und das sollte sie.)

cs071007

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2007

Beiträge: 24

ah, jetzt hab ich den schmäh raus. ich mach nur nen einfachen pointer draus und zähl zu dem dann halt die addressen dazu. also

double* funktion(double* f1, double* f2, size_t mmax, size_t nmax, int repeats) {
    //z.B.
    printf("$lf", *(f1+m*mmax+n));
} 


so haut das nämlich wunderbar hin und ich spar mir den *hust* mit doppelten pointern (weil mir das in der schnelle zu kompliziert ist)

und thx für die hilfe, wär nämlich von selber nicht auf die idee gekommen, dass man pointer auch casten kann (hab das immer nur in verbindung mit double/int/etc gesehn) \^^

DeJe

Anmeldungsdatum:
2. Januar 2008

Beiträge: 2377

Um ehrlich zu sein, ich bin eher der "Datentyp".
Eine gründliche Analyse und Projektierung der Daten spart eine Menge Programmieraufwand und hebt die Lesbarkeit, meist. 😉

wie wäre es mal mit typedef und schnöder Zeiger-Arithmetik? 😉

typedef double dFeld_t[10][10];
typedef dFeld_t *pdFeld_t;

dFeld_t f1, f2;

pdFeld_t funktion(pdFeld_t f1, pdFeld_t f2, size_t xcount, size_t ycount, int repeats, int extra) {
	...
	return ++f1;
}

cs071007

(Themenstarter)

Anmeldungsdatum:
23. Oktober 2007

Beiträge: 24

hm, auch ne möglichkeit. (muss ja ehrlich sagen, dass ich mich mit typedef noch nicht so sehr auseinandergesetzt habe obwohls eigentlich u.a. im prüfungsstoff is)

aber jetzt rennt das ganze proggi schon gut mit den einfachen pointern auf den feldanfang und ich hab die gewisse angst, dass ich es ruinieren und bis zur abgabe nicht mehr hinbekommen könnte, wenn ich jetzt noch am status quo was verändere. (aber ich werd's mir im Hinterkopf behalten, für's nächste mal)

sxfreak

Avatar von sxfreak

Anmeldungsdatum:
27. Juni 2006

Beiträge: 436

Für den Zweck sind Backups geeignet. 😉

Marc_BlackJack_Rintsch Team-Icon

Ehemalige
Avatar von Marc_BlackJack_Rintsch

Anmeldungsdatum:
16. Juni 2006

Beiträge: 4687

Wohnort: Berlin

Oder eine Versionsverwaltung wie subversion oder mercurial. Dann kann man immer alle Veränderungen nachvollziehen und zu älteren Revisionen zurück kehren.

Antworten |