Jump to content
Forumu Destekleyenlere Katılın ×
Paticik Forumları
2000 lerden beri faal olan, çok şukela bir paylaşım platformuyuz. Hoşgeldiniz.

2d dizi verisini 1d diziye aktarmak


Öne çıkan mesajlar

Mesaj tarihi:
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?
Mesaj tarihi:
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.
Mesaj tarihi:
@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;
}
Mesaj tarihi:
[ 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.
Mesaj tarihi:
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)
Mesaj tarihi:
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.
Mesaj tarihi:
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
Mesaj tarihi:
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 ?
Mesaj tarihi:
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.
Mesaj tarihi:
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
Mesaj tarihi:
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.
Mesaj tarihi:
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.
×
×
  • Yeni Oluştur...