Sida 1 av 1

C: Matris, funktion, memset, får inte till det…

Postat: 18 mar 2012, 18:25
av Johnny Rosenberg
Håller ju på att öva upp mina obefintliga kunskaper i C och har nu fastnat på något som jag förmodar är ytterst trivialt.

Följande kod, som inte gör något direkt meningsfullt, fungerar som jag förväntar mig:

Kod: Markera allt

#include <stdio.h>
#include <string.h>

void Reset(int*);

int main(int argc, char** argv) { 
	int buffer[25];
	int i;
	
	memset(buffer,0,sizeof(buffer)); // Nollställer matrisen.
	for (i=0; i<25; i++){
		printf("buffer(%d): %d\n",i,buffer[i]);
	}
	return 0; 
}
Blir precis som jag tänkt mig, men så fick jag för mig att jag, i övningssyfte, skulle göra en förenklad nollställningsfunktion, ibland får man ju bara för sig saker…
Sagt och gjort:

Kod: Markera allt

#include <stdio.h>
#include <string.h>

void Reset(int*);

int main(int argc, char** argv) { 
	int buffer[25];
	int i;
	
	Reset(buffer);
	for (i=0; i<25; i++){
		printf("buffer(%d): %d\n",i,buffer[i]);
	}
	return 0; 
}


void Reset(int x[]){
	int i;

	memset(x,0,sizeof(x));
	for (i=0; i<25; i++){
		printf("x(%d): %d\n",i,x[i]);
	}
}
Jaha ja, det ser ju bra ut. Bara ett enda litet problem: Det fungerar inte…
I funktionen Reset verkar problemet ligga i ”sizeof(x)”, för om jag ersätter det med ”100” (fyra bytes per element, 25 element) så fungerar det.
Jag är lite konfunderad och kan inte riktigt förstå detta, så jag är tacksam för om jag kan få en liten förklaring om detta…

Re: C: Matris, funktion, memset, får inte till det…

Postat: 18 mar 2012, 18:33
av gusnan
Jag hittade en bra förklaring här:
http://en.wikipedia.org/wiki/Sizeof#siz ... lete_types

[edit]
I ditt fall så castar du buffer-variabeln (som är en int[25] till en int[]) i anropet till Reset, och därför kan inte kompilatorn känna till storleken på arrayen.
[/edit]

Re: C: Matris, funktion, memset, får inte till det…

Postat: 18 mar 2012, 19:42
av Johnny Rosenberg
cowboy skrev:Jag hittade en bra förklaring här:
http://en.wikipedia.org/wiki/Sizeof#siz ... lete_types

[edit]
I ditt fall så castar du buffer-variabeln (som är en int[25] till en int[]) i anropet till Reset, och därför kan inte kompilatorn känna till storleken på arrayen.
[/edit]
Okej, då är jag med på det, men hur skulle jag ha gjort istället?

Re: C: Matris, funktion, memset, får inte till det…

Postat: 18 mar 2012, 20:01
av Johnny Rosenberg
Okej, efter ytterligare lite letande hittade jag en som hade samma problem.

Det memset jag använder inuti funktionen ser tydligen bara första elementet, så jag måste multiplicera med antalet element på ett eller annat sätt och då blir ju själva funktionen i sig ganska onödig…

Re: C: Matris, funktion, memset, får inte till det…

Postat: 18 mar 2012, 21:29
av Johnny Rosenberg
He he he… att jag inte tänkte på det… Funktionen ”Reset” är ju så simpel att man ju lika gärna kan använda ett makro istället. Detta funkar ju:

Kod: Markera allt

#include <stdio.h>
#include <string.h>

#define SIZE		10
#define RESET(x)	memset(x,0,sizeof(x))

int main(int argc, char** argv) { 
	int buffer[SIZE];
	int i;
	
//	Skriv ut de värden som ”råkar” vara i matrisen.
	for (i=0; i<SIZE; i++){
		printf("buffer(%d): %d\n",i,buffer[i]);
	}

//	Nollställ matrisen.
	RESET(buffer);

//	Skriv ut matrisen igen.
	for (i=0; i<SIZE; i++){
		printf("buffer(%d): %d\n",i,buffer[i]);
	}

	return 0; 
}

Kod: Markera allt

$ gcc Test.c -o Test; ./Test 
buffer(0): 134520820
buffer(1): -1075963768
buffer(2): 134513849
buffer(3): 2896676
buffer(4): 2895860
buffer(5): 134513824
buffer(6): -1075963768
buffer(7): 1677701
buffer(8): 6278016
buffer(9): 134513835
buffer(0): 0
buffer(1): 0
buffer(2): 0
buffer(3): 0
buffer(4): 0
buffer(5): 0
buffer(6): 0
buffer(7): 0
buffer(8): 0
buffer(9): 0
$
Syftet var ju bara att det skulle se lite enklare ut, fast jag kanske kunde valt något bättre namn än RESET.