Salvation Δημοσ. 20 Ιανουαρίου 2011 Δημοσ. 20 Ιανουαρίου 2011 Καλημερα! Αντιμετωπίζω δυστυχώς ένα πρόβλημα με ένα πρόγραμμα που έχω κάνει. Το πρόγραμμα ζητάει από το χρήστη τις διαστάσεις 2 πινάκων (δισδιάστατων) έστω F kai T. Στη συνέχεια δίνει τυχαίες τιμές στους πίνακες και τοποθετεί ένα "frame" από μηδενικά στον F. Αν υποθέσουμε ότι ο πινακας F είναι 4χ3 και ο Τ 3χ2 προσθέτει στον F Tx-1 σειρές μηδενικών από πάνω και κάτω στον F και Τy-1 (Τx,Ty συντεταγμένες του Τ) στήλες μηδενικών αριστερά και δεξιά του F. Δηλαδή αν ο F είναι: > 1 2 3 4 5 6 7 8 9 Θα γίνει: > 0 0 0 0 0 0 0 0 0 0 0 1 2 3 0 0 4 5 6 0 0 7 8 9 0 0 0 0 0 0 0 0 0 0 0 Επισυνάπτω τους κώδικες. Στον πρώτο αν τον τρέξετε δουλέυει σωστά). Στο δεύτερο είναι που έχω πρόβλημα. Θέλω αντί για δισδιάστατους πίνακες να ορίσω μονοδιάστατους μεγέθους ίσου μεγέθους με τους δισδιάσταστους και να τους χειρίζομαι σαν δισδιάστατους σύμφωνα με αυτό http://en.wikipedia.org/wiki/Row-major_order Παρά τις αλλαγες που έκανα στον δεύτερο κώδικα παίρνω λανθασμένα αποτελέσματα.. Αν γίνεται παρακαλώ βοηθέιστε! Ευχαριστώ! (ΔΟΥΛΕΥΕΙ) >#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <time.h> void init(double** pFArray, double** TArray, int pFX, int pFY,int Fx,int Fy, int Tx, int Ty) { int i,j; srand(time(NULL)); for(i=0;i<pFX;i++) { for(j=0;j<pFY;j++) pFArray[i][j]=0; } for(i=0;i<Tx;i++) { for(j=0;j<Ty;j++) TArray[i][j]=(double)rand()/RAND_MAX; } for(i=((pFX-Fx)/2);i<(pFX-(pFX-Fx)/2);i++) { for(j=((pFY-Fy)/2);j<(pFY-(pFY-Fy)/2);j++) pFArray[i][j]=(double)rand()/RAND_MAX; } } int main(void) { int mF,nF,mT,nT,i,j,ii,jj; double** pF; double** T; double** Y; printf("Please enter mF: "); scanf("%d",&mF); printf("\nPlease enter nF: "); scanf("%d",&nF); printf("\nPlease enter mT: "); scanf("%d",&mT); printf("\nPlease enter nT: "); scanf("%d",&nT); int pFx=(mT-1)*2+mF; int pFy=(nT-1)*2+nF; int mY=mF+mT-1; int nY=nF+nT-1; Y=(double**)malloc(mY*sizeof(double*)); for(i=0;i<mY;i++) Y[i]=(double*)malloc(nY*sizeof(double)); pF=(double**)malloc(pFx*sizeof(double*)); for(i=0;i<pFx;i++) pF[i]=(double*)malloc(pFy*sizeof(double)); T=(double**)malloc(mT*sizeof(double*)); for(i=0;i<mT;i++) T[i]=(double*)malloc(nT*sizeof(double)); init(pF,T,pFx,pFy,mF,nF,mT,nT); for(i=0;i<mY;i++) { for(j=0;j<nY;j++) Y[i][j]=0; //Initialize Y } for(i=0;i<pFx;i++) { printf("\n"); for(j=0;j<pFy;j++) printf(" %.2lf",pF[i][j]); } printf("\n\n"); for(i=0;i<mT;i++) { printf("\n"); for(j=0;j<nT;j++) printf(" %.2lf",T[i][j]); } printf("\n\n"); free(pF); free(T); free(Y); return 0; } >#include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <time.h> void init(double* pFArray, double* TArray, int pFX, int pFY,int Fx,int Fy, int Tx, int Ty) { int i,j; int tempx1=(pFX-Fx)/2; int tempx2=pFX-(pFX-Fx)/2; int tempy1=(pFY-Fy)/2; int tempy2=pFY-(pFY-Fy)/2; srand(time(NULL)); for(i=0;i<Tx;i++) { for(j=0;j<Ty;j++) TArray[i*Ty+j]=(double)rand()/RAND_MAX; } for(i=0;i<pFX;i++) { for(j=0;j<pFY;j++) pFArray[i*pFY+j]=0; } for(i=tempx1;i<tempx2;i++) { for(j=tempy1;j<tempy2;j++) pFArray[i*tempy2+j]=(double)rand()/RAND_MAX; } } int main(void) { int mF,nF,mT,nT,i,j,ii,jj; double* pF; double* T; double* Y; printf("Please enter mF: "); scanf("%d",&mF); printf("\nPlease enter nF: "); scanf("%d",&nF); printf("\nPlease enter mT: "); scanf("%d",&mT); printf("\nPlease enter nT: "); scanf("%d",&nT); int pFx=(mT-1)*2+mF; int pFy=(nT-1)*2+nF; int mY=mF+mT-1; int nY=nF+nT-1; Y=(double*)malloc(mY*nY*sizeof(double)); pF=(double*)malloc(pFx*pFy*sizeof(double)); T=(double*)malloc(mT*nT*sizeof(double)); init(pF,T,pFx,pFy,mF,nF,mT,nT); for(i=0;i<pFx;i++) { printf("\n"); for(j=0;j<pFy;j++) printf(" %.2lf",pF[i*pFy+j]); } printf("\n\n"); for(i=0;i<mT;i++) { printf("\n"); for(j=0;j<nT;j++) printf(" %.2lf",T[i*nT+j]); } return 0; }
pinball_elf Δημοσ. 20 Ιανουαρίου 2011 Δημοσ. 20 Ιανουαρίου 2011 Δεν έχω το έχω δοκιμάσει διεξοδικά, αλλά ο παρακάτω κώδικας μετα απο 1-2 δοκιμές μου έβγαζε το επιθυμητό αποτέλεσμα: > #include <stdio.h> #include <stdlib.h> #include <sys/time.h> #include <time.h> void init(double* pFArray, double* TArray, int pFX, int pFY,int Fx,int Fy, int Tx, int Ty) { int i,j,k; int added_lines = (Tx - 1); int added_columns = (Ty - 1); int line_no = 1; int column_no = 1; srand(time(NULL)); for(i=0;i<Tx*Ty;i++) { TArray[i]=(double)rand()/RAND_MAX; } for(i=0;i<pFX*pFY;i++) { pFArray[i]=0; } for(i=0;i<pFX*pFY;i++) { /* check if we are in a non "added" line */ if (line_no > added_lines && (line_no + added_lines) <= pFX) { /* check if we are in a non "added" column */ if (column_no > added_columns && (column_no + added_columns) <= pFY) { pFArray[i]=(double)rand()/RAND_MAX; } } /* determine line and column number */ if (column_no == pFY) { line_no++; column_no = 1; } else { column_no++; } } } int main(void) { int mF,nF,mT,nT,i,j,ii,jj; double* pF; double* T; /* double* Y; not used */ printf("Please enter mF: "); scanf("%d",&mF); printf("\nPlease enter nF: "); scanf("%d",&nF); printf("\nPlease enter mT: "); scanf("%d",&mT); printf("\nPlease enter nT: "); scanf("%d",&nT); int pFx = mF + 2 * (mT - 1); int pFy = nF + 2 * (nT - 1); /* int mY=mF+mT-1; not used */ /* int nY=nF+nT-1; not used */ /* Y=(double*)malloc(mY*nY*sizeof(double)); not used */ pF =(double*)malloc(pFx*pFy*sizeof(double)); T =(double*)malloc(mT*nT*sizeof(double)); init(pF,T,pFx,pFy,mF,nF,mT,nT); /* print F array */ printf("F = \n "); for(i=0;i<(pFx*pFy);i++) { if ((i % pFy) == 0 && i != 0) printf("\n "); printf("%.2lf ", pF[i]); } printf("\n\n"); /* print T array */ printf("T = \n "); for(i=0;i<(mT*nT);i++) { if ((i % nT) == 0 && i != 0) printf("\n "); printf("%.2lf ", T[i]); } printf("\n"); system("pause"); return 0; }
Salvation Δημοσ. 20 Ιανουαρίου 2011 Μέλος Δημοσ. 20 Ιανουαρίου 2011 Ευχαρστώ πολύ για τον κώδικα! Τον δοκίμασα και δουλεύει. Το θέμα είναι οτι θα ήθελα να έχω πρόσβαση στα στοιχεία του πίνακα με το[i*NUM_COLS+j]. Τελικά μάλλον κατάφερα και βρήκα το λάθος... Μέσα στην init εκει που δίνω random τιμές στον pF εβαζα λάθος δείκτη. Έβαζα i*tempy2+j ενώ ήθελε i*pFY+j. Προς το παρών έτσι δουλεύει νορμαλ. Ευχαριστώ πάντως για το κόπο σου!
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.