Probleme mit Speicher und Variablenwerten

Diskutiere mit über: Probleme mit Speicher und Variablenwerten im Mac OS X Entwickler, Programmierer Forum

  1. Faice

    Faice Thread Starter MacUser Mitglied

    Beiträge:
    142
    Zustimmungen:
    1
    Registriert seit:
    29.06.2004
    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.
     
  2. Faice

    Faice Thread Starter MacUser Mitglied

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

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    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: 11.11.2005
  4. Faice

    Faice Thread Starter MacUser Mitglied

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

    der_Kay MacUser Mitglied

    Beiträge:
    1.693
    Zustimmungen:
    7
    Registriert seit:
    02.09.2004
    ...das kenn ich zur Genüge! ;)

    Viel Spass noch!

    Kay
     
  6. Incoming1983

    Incoming1983 MacUser Mitglied

    Beiträge:
    7.597
    Zustimmungen:
    1
    Registriert seit:
    23.07.2005
    ich auch ;-)

    Fausregel: Wenn man müde ist, schlafen, und nicht sein Programm kaputtcoden. Macht nur mehr Arbeit, wie ich schon erfahren mußte..
     
Die Seite wird geladen...
Ähnliche Themen - Probleme Speicher Variablenwerten Forum Datum
Probleme beim bauen von "fontconfig" Mac OS X Entwickler, Programmierer 23.11.2016
An die App-Programmier - eure Erfahrungen, Probleme, gescheiterten Projekte... Mac OS X Entwickler, Programmierer 01.06.2016
Probleme mit XAMPP (5.6.8-0) Mac OS X Entwickler, Programmierer 12.05.2015
Stagecast Programmieren für Kids Probleme mit Java Mac OS X Entwickler, Programmierer 10.05.2015
Eclipse mach Probleme beim debuggen unter Mavericks Mac OS X Entwickler, Programmierer 27.03.2014

Diese Seite empfehlen

Benutzerdefinierte Suche