Probleme mit Speicher und Variablenwerten

  1. Faice

    Faice Thread StarterMacUser Mitglied

    Mitglied seit:
    29.06.2004
    Beiträge:
    142
    Zustimmungen:
    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.
     
    Faice, 09.11.2005
  2. Faice

    Faice Thread StarterMacUser Mitglied

    Mitglied seit:
    29.06.2004
    Beiträge:
    142
    Zustimmungen:
    1
    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.
     
    Faice, 11.11.2005
  3. der_Kay

    der_KayMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    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 :-/
     
    der_Kay, 11.11.2005
  4. Faice

    Faice Thread StarterMacUser Mitglied

    Mitglied seit:
    29.06.2004
    Beiträge:
    142
    Zustimmungen:
    1
    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, 12.11.2005
  5. der_Kay

    der_KayMacUser Mitglied

    Mitglied seit:
    02.09.2004
    Beiträge:
    1.685
    Zustimmungen:
    8
    ...das kenn ich zur Genüge! ;)

    Viel Spass noch!

    Kay
     
    der_Kay, 13.11.2005
  6. Incoming1983

    Incoming1983MacUser Mitglied

    Mitglied seit:
    23.07.2005
    Beiträge:
    7.545
    Zustimmungen:
    1
    ich auch ;-)

    Fausregel: Wenn man müde ist, schlafen, und nicht sein Programm kaputtcoden. Macht nur mehr Arbeit, wie ich schon erfahren mußte..
     
    Incoming1983, 13.11.2005
Die Seite wird geladen...