nameless Mesaj tarihi: Nisan 26, 2011 Mesaj tarihi: Nisan 26, 2011 C'de dinamik olarak yaratılmış 2d A[N][N] ve 1d B[N] dizilerinin verilerini hiç döngü kullanmadan aktarmak istiyorum. Yani, A'nın ilk satırını tamamen B'ye kopyalamak gibi. B=A[j] şeklinde bir kullanım başarılı olmuyor. memcpy dışında bir yöntem var mıdır?
Deacon Mesaj tarihi: Nisan 26, 2011 Mesaj tarihi: Nisan 26, 2011 kopyalamak zorunda misin? B=*A[1] dersen, B[N] array'i ile A[1] ile ayni array oluyr. Daha dogrusu ikisi de ayni yere isaret etmis oluyor. Illa kopyalicam degerleri diyorsan dongu. yalniz seyi unuttum. B'yi array olarak deil pointer olarak tanimlaman lazim. Array'larin refere ettigi adresi degistiremiorsun.
nameless Mesaj tarihi: Nisan 26, 2011 Konuyu açan Mesaj tarihi: Nisan 26, 2011 @Deacon: mpi kullanarak başka işlemciye aktarıyordum ama sadece adrese işaret ederek yapabileceğimi düşünmemiştim. adresi de bir türlü kopyalayamadım. maksat daha optimize olsun diye yoksa döngüyle de hallederim ama boşuna da bellekte yer işgali oluyor. sadece adres ataması için yazdığım deneme kodu şöyle: #include <stdio.h> #include <stdlib.h> #define N 1000 #define FRAC 10 int main(int argc, char *argv[]){ int i, j; double **A, *B; A=(double**)malloc(sizeof(double)*N); for (i=0; i<N; i++){ A[i]=(double*)malloc(sizeof(double)*N); } B=(double*)malloc(sizeof(double)*N); for (i=0; i<N; i++){ for(j=0; j<N; j++) A[i][j]=i*j/FRAC; *B=*A[0]; for(i=0; i<N; i++) printf("%fn",B[i]); system("PAUSE"); return 0; }
Deacon Mesaj tarihi: Nisan 26, 2011 Mesaj tarihi: Nisan 26, 2011 [ i ] seklinde yazarsan daha iyi olur :p italic yapiyor code tag'ini bile eheh. Iki tane hata goruyorum: B=(double*)malloc(sizeof(double)*N); Bu satira gerek yok. B zaten heap'te ayrilmis olan bir bolgeye isaret edicek. Bos yere N elemanlik space harciyorsun. *B=*A[0]; bu satirin da dogrusu B = *a[0] olcak. Gozunden kacmis sanirim.
nameless Mesaj tarihi: Nisan 27, 2011 Konuyu açan Mesaj tarihi: Nisan 27, 2011 yok yemiyor yine de. devcpp ile deniyorum ilk önce windows ortamında sonra linux'te ayrı derliyorum ama compiler hata verdiğine göre bu atamada bir sorun var.
nameless Mesaj tarihi: Nisan 27, 2011 Konuyu açan Mesaj tarihi: Nisan 27, 2011 devcpp ile "incompatible types in assignment" hatasını alıyorum. B=*A olduğu zaman da zaten tüm değerler sıfır oluyor mantık olarak. icc ile derledim: error: a value of type "double" cannot be assigned to an entity of type "double *" B=*A[0]; ^ compilation aborted for d.c (code 2)
Deacon Mesaj tarihi: Nisan 27, 2011 Mesaj tarihi: Nisan 27, 2011 of benim hatam =p *a[0] yaparsan a[0][0] isaret etmis oluyorsun. b=a[0] yapinca b pointerin cok guzel bir sekilde a[0] ile ayni icerige sahip olcak. daha dogrusu ayni yere isaret edicek. yalniz dedigim gibi b icin heapten allocation yapiyorsun ve ona gerek yok. daha da kotusu gerek olsa bile allocationdan sonra b'nin refere ettigi yeri degistirmeden once o alani free etmiosun ki bu da memory leak olusturur.
nameless Mesaj tarihi: Nisan 27, 2011 Konuyu açan Mesaj tarihi: Nisan 27, 2011 b için allocation olayını kaldırdım senin mesajından sonra. tüm değerler sıfırı gösteriyor değer atandığı halde. bakalım çözecez bu işi hayırlısıyla aehuaeh
uk Mesaj tarihi: Nisan 27, 2011 Mesaj tarihi: Nisan 27, 2011 hacı #define A(i,j) A[i*rowsize+j] gibi bişi desen, tek boyutlu bir *A yaratsan (hani döngüye sokmamak için), sonra da buradan B yi MPI_Type_vector ile atsan nassıl olur ?
nameless Mesaj tarihi: Nisan 27, 2011 Konuyu açan Mesaj tarihi: Nisan 27, 2011 derived data type'lar contiguous chunklardan oluşturulabiliyor :/
Deacon Mesaj tarihi: Nisan 27, 2011 Mesaj tarihi: Nisan 27, 2011 nameless said: b için allocation olayını kaldırdım senin mesajından sonra. tüm değerler sıfırı gösteriyor değer atandığı halde. bakalım çözecez bu işi hayırlısıyla aehuaeh hepsini sifir gostermesi normal for (i=0; i for(j=0; j A[i][j]=i*j/FRAC bu kod blogunda a[0] icin i sifir oldugundan i*j/frac daima sifir olur. A[0]'in her elemani da sifir oluyor.
nameless Mesaj tarihi: Nisan 27, 2011 Konuyu açan Mesaj tarihi: Nisan 27, 2011 Deacon said: of benim hatam =p *a[0] yaparsan a[0][0] isaret etmis oluyorsun. b=a[0] yapinca b pointerin cok guzel bir sekilde a[0] ile ayni icerige sahip olcak. daha dogrusu ayni yere isaret edicek. yalniz dedigim gibi b icin heapten allocation yapiyorsun ve ona gerek yok. daha da kotusu gerek olsa bile allocationdan sonra b'nin refere ettigi yeri degistirmeden once o alani free etmiosun ki bu da memory leak olusturur. söylediğin doğru olan. mal gibi fark etmiyormuşum i*j ile atıyorum değerleri ama sıfırıncı satırı yolladığım için zaten tüm değerler sıfır olacak
Anason Mesaj tarihi: Nisan 28, 2011 Mesaj tarihi: Nisan 28, 2011 detayli incelemedim ama su hatali gozukuyor; A=(double**)malloc(sizeof(double)*N); for (i=0; i A=(double*)malloc(sizeof(double)*N); } A=(double *) malloc(sizeof(double) * N) yerine A[i] = malloc(sizeof(double) * N) olmali sanki.
nameless Mesaj tarihi: Nisan 28, 2011 Konuyu açan Mesaj tarihi: Nisan 28, 2011 A=malloc(sizeof(double*)*N); for (i=0; i<N; i++){ A=malloc(sizeof(double)*N); } olmalı hatta. typecast alışkanlık olmuş hep yapıyorum
Anason Mesaj tarihi: Nisan 29, 2011 Mesaj tarihi: Nisan 29, 2011 bu arada forumda bi hata var. 'A[i]' leri kod formatinda gosterince '[i]' kismini gostermiyor. sendede goremedim ama alintiya tiklayinca cikti. Anason said: detayli incelemedim ama su hatali gozukuyor; A=(double**)malloc(sizeof(double)*N); for (i=0; i A=(double*)malloc(sizeof(double)*N); } A=(double *) malloc(sizeof(double) * N) yerine A[i] = malloc(sizeof(double) * N) olmali sanki.
nameless Mesaj tarihi: Nisan 29, 2011 Konuyu açan Mesaj tarihi: Nisan 29, 2011 [i ] italik yazma kodu olduğu için öyle görünüyor ehaeh
Öne çıkan mesajlar