Gå til innhold

c funksjon som tar 2-dim array av ukjent størrelse


Anbefalte innlegg

Skrevet

Sitter her og prøver å lage en funksjon som tar i mot en to-dimensjonal array av ukjent størrelse. Og jeg har forsåvidt klart det. Men synes grensesnitet på funksjonen blir dårlig. Har ikke klart å finne noen bra guider som dekker dette, annet enn et sted som sa at det var vanskelig.

 

funksjonen skal ta i mot x, b og A somt dimensjonene til disse som er m og n. funksjonen skal så lagre b*A i x. Dette er min implementasjon:

 

int MatrixVectorMultiply(double x[], double *A, double b[], int m, int n)
{
int i, j;
for(i = 0; i < m; i++)
{
 x[i] = 0;
 for(j = 0; j < n; j++)
 {
 	x[i] += A[i*n+j]*b[j];
 }
}	
return 0;
}

 

og jeg kan så bruke dette for å kalle funksjonen:

 

double A[3][4] = {{1,2,3,4},{4,5,6,7},{7,8,9,10}};
double b[] = {1,2,3,4};
double x[3];
MatrixVectorMultiply(x,&A[0][0],b,3,4);

 

Dette fungerer men jeg vil heller kunne skrive:.

 

MatrixVectorMultiply(x,A,b,3,4);

 

Noen ideer for hvordan jeg kan oppnå det?

Videoannonse
Annonse
Skrevet (endret)
int MatrixVectorMultiply(double x[], double A[][], double b[], int m, int n){
int i, j;
double *B=(double *)A;

for(i = 0; i < m; i++){
 x[i] = 0;
 for(j = 0; j < n; j++){
   x[i] += B[i*n+j]*b[j];
 }
} 
return 0;
}

Endret av JBlack
Skrevet

Takker for svar, fungerer fint.!

Så da drister jeg meg til et spørsmål til. Dette er da altså starten på et lineæralgebrabibliotek jeg skla prøve å lage. Foreløpig kompilerer jeg bare med komandoen:

 

gcc -o superd main.c mnlinalg.c

 

.., men jeg vil gjerne lage et bibliotek slik at jeg bare kan bruke

 

#include <mnlinalg.h>

 

der jeg trenger det (f.eks i main). Noen som vet om en bra guide til det.

Skrevet (endret)

Det er ikke verre enn som så:

gcc mnlinalg.c -shared -o libmnlinalg.so

Deretter må du plassere funksjonene du vil eksportere fra mnlinalg i en header mnlinalg.h og plassere den i en standard include-katalog.

Endret av A_N_K
Skrevet

Vet ikke hvor stort dette biblioteket skal bli, men dersom det ikke er så veldig stort, anbefaler jeg å eksportere funksjonene til en .lib bibliotek, som deretter kan linkes statisk inn i applikasjonen senere. Ellers anbefaler jeg jeg å eksportere en .dll og linke mot .lib (som blir laget når du lager en dll og eksporterer funksjonene), og distribuere evt. programmer med denne .dll filen.

 

Dersom biblioteket er veldig lite, kan du legge både deklarasjon og definisjon i en header, men jeg vet ikke hvor mange stygg blikk jeg får for å foreslå noe sånt her :)

Skrevet (endret)

Hmm .. mulig det er hull i heuristikken min, men jeg gjetter at han tenker på Linux. Lite mening med .dll på den plattformen.

 

Edit: Dessuten tror jeg ikke C støtter inline definisjoner.

Endret av A_N_K
Skrevet

Det kan nok stemme. Jeg jobber (dessverre) bare på windows for tiden, så jeg vet lite om linux. Dessuten jobber jeg med C++, så jeg var nok litt ute å kjøre da jeg svarte.

Skrevet

Btw: det vil være ryddigere, dersom du skal lage et bibliotek, å lage structs som inneholder dataene. Da kan man lage funskjoner som jobber direkte mot disse struct'ene i stedet. Og man slipper å kalle funksjoner med størrelser på array'ene fordi disse allerede er lagret i struct'ene.

 

Med matrise-matte kan man få igjen array'er med andre dimensjoner enn de man putter inn. Da forenkler man mye ved å putte den informasjonen i den returnerte struct'en.

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...