Problem pojawia się tylko i wyłącznie w komputerach z systemem 64 bitowym (sprawdzane tylko na linuxie - 2xUbuntu 9.04, Debian 5.0.1).
Na systemach 32bit wszystko działa dobrze (Ubuntu 8.04, Fedora 10 albo 9, Debian 4.0).
Problem występuje z 48 linijką:
col_ind[wskaznikWart++]=j+1;
Cały kod:
#include <stdlib.h>
#include <stdio.h>
#include <time.h>
#include <memory.h>
#include <string.h>
/* globalny typ macierzy i danych z nia zwiazanych */
#define ownedTyp float
int n=10, m=9, k=3;
bool zapisac=true; //zapisac wyniki do pliku?
/* zmienne */
ownedTyp** macierz;
ownedTyp* wektor;
ownedTyp* y;
ownedTyp* z;
int wskaznikWart=0;
int wskaznikKol=0;
ownedTyp* valu;
int* col_ind;
int* row_ptr;
/* uzywane funkcje */
ownedTyp losujNormalne();
void macierzA(int n, int m, int k);
void generujCRS();
void zapiszCRS(char* _nazwa);
void zapiszMacierz(char * _nazwa);
/* losowanie wartosci */
ownedTyp losujNormalne() {
return ( rand()%(int)((1./2.)*(10000.)) )/(10000.);
}
/* generowanie macierzy w postaci zapisu CRS */
void generujCRS() {
int i,j;
valu = new ownedTyp [m*n];
col_ind = new int [m*n];
row_ptr = new int [m+1];
for (i=0;i<n;i++) {
row_ptr[wskaznikKol++]=wskaznikWart+1;
for(j=0;j<m;j++) {
if ( macierz[i][j]!=0 ) {
valu[wskaznikWart]=macierz[i][j];
col_ind[wskaznikWart++]=j+1; //zarazona linijka
}
}
}
row_ptr[wskaznikKol++]=wskaznikWart;
}
/* zapis macierzy CRS do pliku */
void zapiszCRS(char* _nazwa) {
int i;
FILE* fw;
fw=fopen(_nazwa,"w");
fprintf(fw,"val: ");
for (i=0; i<wskaznikWart; i++) {
fprintf(fw,"%3.5lf\t", valu[i]);
}
fprintf(fw,"\ncol_ind: ");
for (i=0; i<wskaznikWart; i++) {
fprintf(fw,"%d\t", col_ind[i]);
}
fprintf(fw,"\nrow_ptr: ");
for (i=0; i<wskaznikKol; i++) {
fprintf(fw,"%d\t", row_ptr[i]);
}
fclose(fw);
}
/* zapis macierzy normalnej do pliku */
void zapiszMacierz(char * _nazwa) {
FILE* f;
f=fopen(_nazwa,"w");
for(int i=0;i<n;i++) {
for(int j=0; j<m; j++) {
fprintf(f,"%3.5f\t",macierz[i][j]);
}
fprintf(f,"\n");
}
fclose(f);
}
/* generowanie macierzy rzadkiej NxM elementowej */
void macierzA() {
int i,j;
int wybrano;
int miejsce;
macierz = new ownedTyp* [n];
for(i=0;i<n;i++) {
macierz[i] = new ownedTyp [m];
memset(macierz[i],0,m*sizeof(ownedTyp));
}
for(i=0;i<n;i++) {
wybrano=0;
while ( wybrano!=k ) {
do {
miejsce = rand()%(m-1);
} while(macierz[i][miejsce]!=0);
macierz[i][miejsce] = losujNormalne();
wybrano++;
}
}
generujCRS();
if (zapisac==true) {
char file[] = "macierz-CRS.txt";
zapiszCRS(file);
char file2[] = "macierz.txt";
zapiszMacierz(file2);
}
}
/* podzial wierszowy cykliczny - CRS */
int main() {
macierzA();
return 0;
}
Ktoś może wie co jest nie tak?
PS.
Problem występuje z inkrementacją tej zmiennej. Ale jak go obejść to dalej nie wiem... .