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

Här diskuteras programmering och utveckling
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
gusnan
Inlägg: 348
Blev medlem: 17 jan 2007, 08:20
OS: Debian
Utgåva: Vet inte/ingen utgåva passar

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

Inlägg 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]
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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?
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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…
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Användarvisningsbild
Johnny Rosenberg
Inlägg: 1256
Blev medlem: 23 jun 2007, 16:18
OS: Ubuntu
Utgåva: 22.10 Kinetic Kudu
Kontakt:

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

Inlägg 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.
Vänliga hälsningar

Johnny Rosenberg
ジョニー・ローゼンバーグ

IEEE 1541 - binära prefix
ISO 8601 - datum och tid
Skriv svar

Återgå till "Programmering och webbdesign"