C++ unter Win vs C++ unter Linux

vincentve

Grünschnabel
Moin!

ich habe unter windows mit vs ein progrämmchen gebastelt, was u.a. matrizen aus textdateien einliest. im prog gibt es eine fuunktion die dynamisch speicher allokiert und die einzelnen matrixelemente mit werten belegt.
zurückgegeben wird ein ***double (die matrizen sind dreidimensional).
das funktioniert unter win wunderbar.
jetzt soll das ding aufem linux server laufen, ich habs portiert, es gab einige probleme, die sind aber soweit behoben, dass es compiliert wird.
dummerweise klappt die rückgabe des pointers nicht. in der funktion sind alle matrixelemente gefüllt, in der aufrufenden funktion ist an der stelle auf die der pointer deutet, aber nur mist.

ich kann mir schon denken dass es nicht gerade der reinen lehre entspricht, progs unter win zu schreiben und unter linux zu verwenden. aber vielleicht weiß einer woran es konkret liegt bzw wie man das peroblem behebt?

besten dank im voraus
gruß
dirk
 
kann es sein, daß das Linux, daß du verwendest, eine andere BYTE-Order hat ?

könnte sein, daß du beim Einlesen aus einer Datei, wenn du WORD oder DWORD liest,
jeweils die BYTES vertauschen mußt.

such mal in der Hilfe nach SWAPWORD bzw. SWAPDWORD.

Und so krank ist das nicht, unter Windows für Linux zu entwickeln. Extra dafür
hat Borland den Crosscompiler C++Builder X entwickelt...

BadMourning
 
wenn ich dich richtig verstehe wäre das auslesen das problem?
das ist es nicht.
ich mache eine testausgabe in der funktion (nachdem die werte eingelesen sind) und eine nach der rückgabe des pointers. leider mit verschiedenen ergebnissen.
am speicherplatz selber kann es fürr mein verständnis auch nicht liegen. ich benutze malloc(#speicherplätz*sizeof(double)).
also:
- einlesen klappt.
- speicher is da (sonst würde die ausgabe in der fkt nicht funktioniern)
- pointerarithmetik funktioniert auch

und dann weiß ich ent weida.

bin daher für jeden weiteren hinweis dankbar.

danke schonmal
dirk
 
also, wie egssagt: die ausgabe in "readProbFromFile" in die datei klappt noch und bringt das gewünschte ergebnis.
die ausgabe zum screen in main() bringt mist.
Code:
//prototypes
double ***readProbFromFile(char *, int *, int *);
long col(int, int, int, int);
long row1(int, int);
long row2(int, int, int);

//main
int main(int argc, char *argv[])
{
int teams=0;
int error=0, ilogEC=0;
double ***costMatrix;
long i=0, j=0, k=0;
/*CPXENVptr env = NULL;
CPXLPptr lp = NULL;*/
	// there must be a filename given
	if (argc!=2)
		error = NO_INPUT_FILENAME;
	// get costs
	if (!error)
		costMatrix=readProbFromFile(argv[1], &error, &teams);
	cout << "The beginning2" << endl << endl;
	if (!error)
	{
		for (i=0; i<teams; i++)
		{
			for (j=0; j<teams; j++)
			{
				for (k=0; k<teams-1; k++)
				{
					cout << costMatrix[i][j][k] << " ";
				}
				cout << endl;
			}
			cout << endl;
		}
	}
}

double ***readProbFromFile(char *fileName, int *error, int *teams)
{
long i=0, j=0, k=0;
double ***costMatrix=NULL;
ifstream inFile(fileName);
// ofstream outFile(strcat(fileName, ".out.txt"), ios::out);
  if (!inFile)
    *error = FILE_NOT_FOUND;
  if (!*error)
  {
  char buffer[1000];
    inFile.getline(buffer, 10, '\n');	
    *teams=atoi(buffer);
    if (*teams==0)
      *error=FAILURE_IN_NUMBER_OF_TEAMS;
  }	
  if (!*error)
  {
    costMatrix=(double ***)malloc((*teams)*sizeof(double **));
    costMatrix[0]=(double **)malloc((*teams)*(*teams)*sizeof(double *));
    for (i=1; i<*teams; i++)
    {
      costMatrix[i]=costMatrix[i-1]+sizeof(double *);
    }
    costMatrix[0][0]=(double *)malloc((*teams)*(*teams)*(*teams-1)*sizeof(double));
    for (i=1; i<*teams; i++)
      costMatrix[0][i]=costMatrix[0][i-1]+(*teams-1)*sizeof(double);
    for (i=1; i<*teams; i++)
    {
      costMatrix[i][0]=costMatrix[i-1][0]+(*teams)*(*teams-1)*sizeof(double);
      for (j=1; j<*teams; j++)
        costMatrix[i][j]=costMatrix[i][j-1]+(*teams-1)*sizeof(double);
    }
  }
  for (i=0; i<*teams; i++)
  {
    for (j=0; j<*teams; j++)
    {
      for (k=0; k<*teams-1; k++)
      {
        costMatrix[i][j][k]=0;
      }
    }
  }
  // loop for periods
  for (i=0; ((!*error)&&(i<*teams-1)); i++)
  {
    char buffer[LENGTH_OF_ROW+1];
    char *token;
    char delimiter[]=" \t";
    inFile.getline(buffer, LENGTH_OF_ROW, '\n');
    // loop for teams
    for (j=0; ((!*error)&&(j<*teams)); j++)
    {
      inFile.getline(buffer, LENGTH_OF_ROW, '\n');
      token=strtok(buffer, delimiter);
      for (k=0; ((!*error)&&(token!=NULL)&&(k<*teams)); k++)
      {
        costMatrix[j][k][i]=atof(token);
        token=strtok(NULL, delimiter);
      }
      if ((k>=*teams)&&(token))
        *error=TOO_MANY_ELEMENTS_IN_ROW;
      else
      {
        if (k<*teams)
          *error=LACK_OF_ELEMENTS_IN_ROW;
      }
    }
  }
  outFile << "The beginning" << endl << endl;
  if (!*error)
  {
    for (i=0; i<*teams-1; i++)
    {
      for (j=0; j<*teams; j++)
      {
        for (k=0; k<*teams; k++)
        {
          outFile << costMatrix[j][k][i] << " ";
        }
        outFile << endl;
      }
      outFile << endl;
    }
  }
  else
    outFile << "ErrorCode: " << *error << endl << endl;
  outFile <<  "The end";
  inFile.close();
  return costMatrix;
}
 
Zurück