Allokiertes Array, 1. Wert falscher Wert

Nadriel

Mitglied
Moin zusammen,

ich habe folgendes Problem.
Ich hab hier den Code:

Eine Funktion zum Allokieren:
Code:
int*alloc1DIntArray(const unsigned int count)
{
	int*ptr;

	ptr=(int*)malloc(count*sizeof(int));
	if(ptr!=NULL)
		return ptr;
	return NULL;
}

Danach noch eine Funktion:
Code:
void prog(int*y,int*u,int*v,int size)
{
	void prog(int*y,int*u,int*v,int size)
{
	int*r=NULL,*g=NULL,*b=NULL,*rNew=NULL,*gNew=NULL,*bNew=NULL,*bit=NULL,
		*dom=NULL,*pos=NULL,*varCheckPos=NULL;
	float*verh,sum=0;
	FILE*fp;
	
	r=alloc1DIntArray(size);
	g=alloc1DIntArray(size);
	b=alloc1DIntArray(size);
	rNew=alloc1DIntArray(3);
	gNew=alloc1DIntArray(3);
	bNew=alloc1DIntArray(3);
	bit=alloc1DIntArray(64);
	dom=alloc1DIntArray(3);
	pos=alloc1DIntArray(3);
	varCheckPos=alloc1DIntArray(3);
	verh=alloc1DFloatArray(3);
	
	int y2=0,u2=0,v2=0,z=0,y3=0,u3=0,v3=0,cDurchlauf=0;
	double y4=0.000000,u4=0.000000,v4=0.000000;

	for(int i=0;i<64;i++)
	{
		bit[i]=0;
	}

	for(int i=0;i<3;i++)
	{
		dom[i]=0;
		pos[i]=0;
		varCheckPos[i]=0;
		verh[i]=0;
	}
	
	
	for(int i=0;i<size;i++)
	{
		v4 = v[i] * 1.000000;
		y4 = y[i] * 1.000000;
		u4 = u[i] * 1.000000;

		y2=y4+(1.4075*(v4-128.000000));
		y3=(int)y2;
		r[i]=y3;

		u2=y4-((0.3455*(u4-128.000000))-(0.7169*(v4-128.000000)));
		u3=(int)u2;
		g[i]=u3;
		
		v2=y4+(1.7790*(u4-128.000000));
		v3=(int)v2;
		b[i]=v3;
		
		z=((r[i]>>6)<<(4))|((g[i]>>6)<<(2))|(b[i]>>6);
		//printf("Y:%d U:%d V:%d\nZ:%d\nR:%d G:%d B:%d\nyy:%d uu:%d vv:%d\nyyy:%lf uuu:%lf vvv:%lf\n--------------------\n",y[i],u[i],v[i],z,y2,u2,v2,y[i] * 1.0,u[i] * 1.0,v[i] * 1.0); 
		bit[z]++;
		
	}

	dom[0]=bit[0];
	varCheckPos[0]++;
	
	for(int i=0;i<64;i++)
	{
		
		if(bit[i]>dom[0])
		{
			dom[2]=dom[1];
			dom[1]=dom[0];
			dom[0]=bit[i];
			varCheckPos[0]++;
			varCheckPos[1]++;
			varCheckPos[2]++;
		}
		else if(bit[i]>dom[1])
		{
			dom[1]=bit[i];
			varCheckPos[1]++;
		}
		else if(bit[i]>dom[2])
		{
			dom[2]=bit[i];
			varCheckPos[2]++;
		}
		for(int j=0;j<3;j++)
		{
			if(varCheckPos[j]>0)
			{
				pos[j]=i;
				varCheckPos[j]=0;
			}
		}
	}
	
	fp=fopen("c:\\test.txt","w+");
	
	for(int i=0;i<3;i++)
	{
		sum+=dom[i];
		rNew[i]=((pos[i]>>(4))&0x03)<<6;
		gNew[i]=((pos[i]>>(2))&0x03)<<6;
		bNew[i]=(pos[i]&0x03)<<6;
	}
	
	for(int i=0;i<3;i++)
	{
		verh[i]=dom[i]/sum;
		printf("%d\n",pos[i]);
		fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
	}
	fclose(fp);
	free(r);
	free(g);
	free(b);
	free(rNew);
	free(gNew);
	free(bNew);
	free(bit);
	free(dom);
	free(pos);
	free(varCheckPos);
	free(verh);
}
Mein Problem ist, dass in rNew[0] und in gNew[0] ein default value drin steht oder was auch immer das ist, habe keine Ahnung woher das kommt: 1078525952. Normalerweise müsste 0 drin stehen, funktioniert bei bNew[0] und auch bei allen anderen Werten einwandfrei...

Jemand eine Ahnung?

MfG Nadriel

EDIT: Hier noch der Code zum Main:
Code:
int main()
{
	int*y=NULL;
	y=alloc1DIntArray(640*480);
	int*u=NULL;
	u=alloc1DIntArray(640*480);
	int*v=NULL;
	v=alloc1DIntArray(640*480);

	for(int i=0;i<(640*480);i++)
	{
		y[i] = 82;
		u[i] = 90;
		v[i] = 240;
	}
	
	prog(y,u,v,(640*480));
	getchar();
	
	free(y);
	free(u);
	free(v);
}
 
Zuletzt bearbeitet:
So hier nochmal der gesamte Code, dann is es glaub ich übersichtlicher:

Code:
#include<stdio.h> 
#include<stdlib.h>
int*alloc1DIntArray(const unsigned int count)
{
	int*ptr;

	ptr=(int*)malloc(count*sizeof(int));
	if(ptr!=NULL)
		return ptr;
	return NULL;
}
float*alloc1DFloatArray(const unsigned int count)
{
	float*ptr;

	ptr=(float*)malloc(count*sizeof(float));

	if(ptr!=NULL)
		return ptr;
	return NULL;
}
void prog(int*y,int*u,int*v,int size)
{
	int*r=NULL,*g=NULL,*b=NULL,*rNew=NULL,*gNew=NULL,*bNew=NULL,*bit=NULL,
		*dom=NULL,*pos=NULL,*varCheckPos=NULL;
	float*verh,sum=0;
	FILE*fp;
	
	r=alloc1DIntArray(size);
	g=alloc1DIntArray(size);
	b=alloc1DIntArray(size);
	rNew=alloc1DIntArray(3);
	gNew=alloc1DIntArray(3);
	bNew=alloc1DIntArray(3);
	bit=alloc1DIntArray(64);
	dom=alloc1DIntArray(3);
	pos=alloc1DIntArray(3);
	varCheckPos=alloc1DIntArray(3);
	verh=alloc1DFloatArray(3);
	
	int y2=0,u2=0,v2=0,z=0,y3=0,u3=0,v3=0,cDurchlauf=0;
	double y4=0.000000,u4=0.000000,v4=0.000000;

	for(int i=0;i<64;i++)
	{
		bit[i]=0;
	}

	for(int i=0;i<3;i++)
	{
		rNew[i]=0;
		gNew[i]=0;
		bNew[i]=0;
		dom[i]=0;
		pos[i]=0;
		varCheckPos[i]=0;
		verh[i]=0;
	}
	
	
	for(int i=0;i<size;i++)
	{
		v4 = v[i] * 1.000000;
		y4 = y[i] * 1.000000;
		u4 = u[i] * 1.000000;

		y2=y4+(1.4075*(v4-128.000000));
		y3=(int)y2;
		r[i]=y3;

		u2=y4-((0.3455*(u4-128.000000))-(0.7169*(v4-128.000000)));
		u3=(int)u2;
		g[i]=u3;
		
		v2=y4+(1.7790*(u4-128.000000));
		v3=(int)v2;
		b[i]=v3;
		
		z=((r[i]>>6)<<(4))|((g[i]>>6)<<(2))|(b[i]>>6);
		//printf("Y:%d U:%d V:%d\nZ:%d\nR:%d G:%d B:%d\nyy:%d uu:%d vv:%d\nyyy:%lf uuu:%lf vvv:%lf\n--------------------\n",y[i],u[i],v[i],z,y2,u2,v2,y[i] * 1.0,u[i] * 1.0,v[i] * 1.0); 
		bit[z]++;
		
	}

	dom[0]=bit[0];
	varCheckPos[0]++;
	
	for(int i=0;i<64;i++)
	{
		
		if(bit[i]>dom[0])
		{
			dom[2]=dom[1];
			dom[1]=dom[0];
			dom[0]=bit[i];
			varCheckPos[0]++;
			varCheckPos[1]++;
			varCheckPos[2]++;
		}
		else if(bit[i]>dom[1])
		{
			dom[1]=bit[i];
			varCheckPos[1]++;
		}
		else if(bit[i]>dom[2])
		{
			dom[2]=bit[i];
			varCheckPos[2]++;
		}
		for(int j=0;j<3;j++)
		{
			if(varCheckPos[j]>0)
			{
				pos[j]=i;
				varCheckPos[j]=0;
			}
		}
	}
	
	fp=fopen("c:\\test.txt","w+");
	
	for(int i=0;i<3;i++)
	{
		sum+=dom[i];
		rNew[i]=((pos[i]>>(4))&0x03)<<6;
		gNew[i]=((pos[i]>>(2))&0x03)<<6;
		bNew[i]=(pos[i]&0x03)<<6;
	}
	
	for(int i=0;i<3;i++)
	{
		verh[i]=dom[i]/sum;
		printf("%d\n",pos[i]);
		fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
	}
	fclose(fp);
	free(r);
	free(g);
	free(b);
	free(rNew);
	free(gNew);
	free(bNew);
	free(bit);
	free(dom);
	free(pos);
	free(varCheckPos);
	free(verh);
}

int main()
{
	int*y=NULL;
	y=alloc1DIntArray(640*480);
	int*u=NULL;
	u=alloc1DIntArray(640*480);
	int*v=NULL;
	v=alloc1DIntArray(640*480);

	for(int i=0;i<(640*480);i++)
	{
		y[i] = 82;
		u[i] = 90;
		v[i] = 240;
	}
	
	prog(y,u,v,(640*480));
	getchar();
	
	free(y);
	free(u);
	free(v);
}
 
Zuletzt bearbeitet:
So nochmal ich: wenn ich im main
Code:
y[i]=16;
u[i]=128;
v[i]=128;
ändere, dann müsste 0 drinstehen, hab mich nur mit den Werten vertan ;-)

Gruß Nadriel
 
malloc alloziert lediglich Speicher, initialisiert wird nichts. Was da drin steht ist einfach Zufall. Du musst die Werte manuell initialisieren.
 
Na ja
C:
		rNew[i]=((pos[i]>>(4))&0x03)<<6;
		gNew[i]=((pos[i]>>(2))&0x03)<<6;
		bNew[i]=(pos[i]&0x03)<<6;

Offensichtlich ist das für pos[0] nicht alles 0. Rechne es einfach von Hand mal durch und vergleiche dann mit dem Debugger Schritt für Schritt wo du eine Abweichung findest. Diesen ganzen Code wird sich wohl kaum jemand so ganz durchsehen ;)
 
Hallo,
muss aber so sein, da ich ja weiter oben mit:
Code:
for(int i=0;i<3;i++)
	{
		pos[i]=0;
	}
initialisere...

gruß Nadriel
 
Hab den Fehler gefunden, es steht nur in der Datei falsch drin, aber wenn ich in der Konsole ausgib stimmt's, weiß jemand woran das liegen könnte? Hab ich beim fprintf() etwas falsch gemacht?

gruß Nadriel
 
Ganz einfacher Fehler:
Code:
fprintf(fp,"%d\t%d\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);
ersetzen durch:
Code:
fprintf(fp,"%d\t%f\t%d\t%d\t%d\n",dom[i],(verh[i]*100),rNew[i],gNew[i],bNew[i]);

:)
 
malloc alloziert lediglich Speicher, initialisiert wird nichts. Was da drin steht ist einfach Zufall. Du musst die Werte manuell initialisieren.
Ergänzend hierzu: mit calloc kann man automatisch den reservierten Speicherbereich mit Nullbits initialisieren lassen. Für Fließkommatypen ist das allerdings nicht portabel (ein 0.0 muss nicht unbedingt ausschließlich aus Nullbits bestehen).

Grüße,
Matthias
 
Zurück