Probleme mit Speicher und Variablenwerten

Faice

Faice

Aktives Mitglied
Thread Starter
Dabei seit
29.06.2004
Beiträge
142
Reaktionspunkte
1
Hallo,

Ich habe da mal ein echt komisches Problem, wo ich mir nicht erklaeren kann, was der Fehler ist. Also ich versuche mich gerade ein wenig an Altivec und Matrixmultiplikation. Und dabei habe ich irgendwie ein Problem.

Beim Erzeugen von Matrizen mit Werten spinnt mein Programm etwas rum. Bei 12x12 und 16x16 Matrizen beispielsweise fuellt es die erste Matrix teilweise mit komischen Werten. Aber immer nur die erste. Bei 8x8 oder 32x32 MAtrizen tritt das Problem nicht auf.

Hier mal der Code:
Code:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <altivec.h>

#define ZEILEN		12
#define SPALTEN	12
#define RANGE		99

typedef float *matrix;				
typedef vector float *vmatrix;

void rand_matrix(matrix mtx, int mitwert);

void ausgabe(matrix mtx);

typedef union
{
	matrix mat;		// Matrix als normales Array von Werten
	vmatrix vmat;	// Matrix mit Vectoren
}matTovMat;

int main (int argc, const char * argv[])
{
	matTovMat mtx1, mtx2;
	
	//printf("Martix1-Adr.: %#x\n", mtx1);
	//printf("Martix2-Adr.: %#x\n", mtx2);
	
	if((mtx1.mat = (matrix)malloc(ZEILEN * (SPALTEN / 4) * sizeof(matrix))) == NULL)
	{	
		puts("Fehler bei der Speicherallokation");
		exit(-1);	
	}
	
	if((mtx2.mat = (matrix)malloc(ZEILEN * SPALTEN * sizeof(matrix))) == NULL)
	{
		puts("Fehler bei der Speicherallokation");
		free(mtx1.mat);
		exit(-1);
	}
	
	// Fuellen der Matrizen mit Zufallswerten
	rand_matrix(mtx1.mat, 1);
	rand_matrix(mtx2.mat, 1);
	
	// Ausgabe der Matrizen
	ausgabe(mtx1.mat);
	ausgabe(mtx2.mat);
	
	free(mtx1.mat);
	free(mtx2.mat);	
	
    return 0;
}

// Ausgabe einer Matrix auf den Bildschirm
void ausgabe(matrix mtx)
{
	int i, j;
	
	for(i = 0; i < ZEILEN; i++)
	{
		printf("|");
		
		for(j = 0; j < SPALTEN; j++)
		{
			printf("%9.2f", mtx[i * SPALTEN + j]);
		}
		
		printf("  |\n");
	}
	puts("       * * * * ENDE * * * *");
	puts("\n");
	
}

void rand_matrix(matrix mtx, int mitwert)
{
	int i, j;
	float x;
	
	srand((unsigned)time(0));
	
	if(mitwert == 0)
	{
		for(i = 0; i < ZEILEN; i++)
		{
			for(j = 0; j < SPALTEN; j++)
			{
				mtx[i * SPALTEN + j] = 0;
			}
		}
	}
	else
	{
		for(i = 0; i < ZEILEN; i++)
		{
			for(j = 0; j < SPALTEN; j++)
			{
				//mtx[i][j] = myrandom();
				x = (rand() % (RANGE + 1));
				mtx[i * SPALTEN + j] = x;
			}
		}
	}
}

Die Ausgabe sieht dann so aus:
Code:
[Session started at 2005-11-09 23:27:18 +0100.]
|    34.00    21.00    90.00     0.00    29.00    65.00    38.00    23.00    50.00    50.00    82.00    82.00  |
|    73.00    28.00    92.00    80.00    98.00    30.00    88.00    16.00    84.00    57.00    94.00     7.00  |
|    80.00    22.00    91.00    29.00    71.00    19.00    16.00    72.00    80.00    50.00    29.00    20.00  |
|     0.00     0.00    -0.00    -0.00    -0.00    -0.00    -0.00    -0.00    -0.00    -0.00    -0.00    -0.00  |
|339615136492207134461438014706212143104.00339615136492207134461438014706212143104.00339615136492207134461438014706212143104.00338953138925153547590470800371487866880.00    37.00    41.00    46.00    92.00    31.00    26.00    62.00    43.00  |
|    50.00    50.00    15.00    40.00    84.00    66.00    28.00    45.00    32.00    85.00    21.00     4.00  |
|    42.00    11.00    19.00    14.00    89.00     3.00    96.00    51.00    44.00    34.00    43.00     1.00  |
|     8.00    36.00    80.00    14.00    49.00    66.00    94.00    68.00    76.00    99.00    52.00    13.00  |
|    96.00    12.00    12.00    52.00    60.00    57.00    69.00     6.00    13.00    88.00    29.00    63.00  |
|    90.00    79.00    29.00    80.00    60.00    31.00    35.00    46.00    12.00     0.00    37.00    83.00  |
|    63.00    10.00    94.00    98.00    95.00     6.00    21.00    18.00    71.00    84.00    53.00    56.00  |
|     6.00    35.00    91.00    68.00    91.00    85.00    24.00    72.00    90.00    88.00    91.00    33.00  |
       * * * * ENDE * * * *


|    34.00    21.00    90.00     0.00    29.00    65.00    38.00    23.00    50.00    50.00    82.00    82.00  |
|    73.00    28.00    92.00    80.00    98.00    30.00    88.00    16.00    84.00    57.00    94.00     7.00  |
|    80.00    22.00    91.00    29.00    71.00    19.00    16.00    72.00    80.00    50.00    29.00    20.00  |
|    16.00    37.00    47.00    27.00    51.00     5.00    29.00    92.00    88.00    95.00    82.00    45.00  |
|    57.00    86.00    68.00    69.00    37.00    41.00    46.00    92.00    31.00    26.00    62.00    43.00  |
|    50.00    50.00    15.00    40.00    84.00    66.00    28.00    45.00    32.00    85.00    21.00     4.00  |
|    42.00    11.00    19.00    14.00    89.00     3.00    96.00    51.00    44.00    34.00    43.00     1.00  |
|     8.00    36.00    80.00    14.00    49.00    66.00    94.00    68.00    76.00    99.00    52.00    13.00  |
|    96.00    12.00    12.00    52.00    60.00    57.00    69.00     6.00    13.00    88.00    29.00    63.00  |
|    90.00    79.00    29.00    80.00    60.00    31.00    35.00    46.00    12.00     0.00    37.00    83.00  |
|    63.00    10.00    94.00    98.00    95.00     6.00    21.00    18.00    71.00    84.00    53.00    56.00  |
|     6.00    35.00    91.00    68.00    91.00    85.00    24.00    72.00    90.00    88.00    91.00    33.00  |
       * * * * ENDE * * * *

Und nun das beste, wenn man im Quelltext die beiden printfs vor der Speicherallokation nicht mit ins Programm rein nimmt, dann funktioniert alles. Bitte testet das mal auf euren Systemen, und sagt mir dann, dass es sich bei euch auch so komisch verhaelt. Oder sagt mir, woran der Fehler liegt und wie man ihn abstellt.

MfG

Faice

P.S. Beim Compilieren in der Kommadozeile den Schalter -maltivec nicht vergessen, oder in XCode bei Edit Active Target unter Build bei Code Generation Auto-vectorization anstellen.
 
Anscheinend hat von euch auch keiner eine Loesung fuer mein Problem. Ich habe mein Programm unterdessen mal etwas mit dem Debugger erforscht und dabei festgestellt, dass die Werte korrekt im Speicher stehen. Habe ich mittels "p/f mtx.mat@144" erfahren. Bei der uebergabe der Matrix an die Funktion Ausgabe sind die Werte zunaechst auch noch in Ordnung. Ersta nach dem ersten Aufruf von printf
Code:
printf("|");
sind einige Werte etwas komisch.

Wenn ich nun dieses printf auskommentiere, dann passiert das ganze beim Naechsten printf, wenn ich dieses auskommentiere, dann beim Naechsten usw.

Hat vielleicht die printf-Funktion irgendwelche fehler? Denn ich kann mir diese Sache nichtmehr erklaeren. Oder ist vielleicht mein RAM nicht mehr in Ordnung? Hab auch schon den Hardware Check von der OS X DVD durchlaufen lassen. Der hat nix gefunden.

Bitte, Bitte helft mir mal weiter, oder gebt mir ein Feedback, was das Programm bei euch macht.
 
Da braucht es keinen Debugger, "printf" funktioniert und das RAM ist auch in Ordnung. Schau Dir mal die beiden mallocs an:
Zuerst ZEILEN *(SPALTEN / 4), danach ZEILEN * SPALTEN

Ein bisschen wenig Speicher für die erste Matrix, oder? ;)

Und anstatt sizeof(matrix) (Zeiger fester Größe) sollte es wohl sizeof(float)heissen. Das merkst Du, wenn Du später mit doubles rechnest :-/
 
Zuletzt bearbeitet:
Ahh, danke! Das is ja voll peinlich! Warum ist mir das nicht aufgefallen. Ich sollte nicht zu sp spaeten Stunden coden, da is einfach die konzentration nicht mehr da. Aber meinem Kumpel, dem ich den Code in meiner Verzweiflung auch schon geschickt habe, ist auch nix aufgefallen...

Also danke nochmal!
 
Faice schrieb:
Ich sollte nicht zu sp spaeten Stunden coden, da is einfach die konzentration nicht mehr da.

...das kenn ich zur Genüge! ;)

Viel Spass noch!

Kay
 
der_Kay schrieb:
...das kenn ich zur Genüge! ;)

Viel Spass noch!

Kay

ich auch ;-)

Fausregel: Wenn man müde ist, schlafen, und nicht sein Programm kaputtcoden. Macht nur mehr Arbeit, wie ich schon erfahren mußte..
 
Zurück
Oben Unten