[an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive] (none) [an error occurred while processing this directive] [an error occurred while processing this directive] [an error occurred while processing this directive][an error occurred while processing this directive]
 
[an error occurred while processing this directive] [an error occurred while processing this directive]
Skåne Sjælland Linux User Group - http://www.sslug.dk Home   Subscribe   Mail Archive   Forum   Calendar   Search
MhonArc Date: [Date Prev] [Date Index] [Date Next]   Thread: [Date Prev] [Thread Index] [Date Next]   MhonArc
 

Re: [CPROG] Returnerin af at "string" array



"|GeO|" <sslug@sslug> skrev:

> ok her kommer det jeg har lavet indtil videre

Der er en del fejl og uhensigtsmæssigheder; tab nu ikke modet, fordi
jeg sådan hænger mig i petitesser:

- globale variable, som oven i købet kun bruges lokalt.

- retCode starter med værdien NULL (fordi den er global; lokale
variable får en tilfældig startværdi, men globale variable bliver sat
til nul), så while løkken kommer aldrig i gang.

- bruger 200 i stedet for sizeof(Line). Det giver mulighed for
fejl, hvis det besluttes at ændre tallet et af stederne.

- mangler check for om filen blev åbnet.

- inkonsistens i navngivning af variable (store/små tegn).

- bruger ikke strcpy() til at kopiere en tekststreng.

- unødvendig brug af continue.

- q for-løkken tæller til 10, uanset hvor mange linier, der blev
fundet. Især et problem når der blev fundet under 10 linier.

- fylder data i ENDLines uden at have reserveret plads til
indholdet.


Det sidste er det største problem, og det kan umiddelbart løses ved at
lave definitionen af ENDLines om til fx

        char ENDLines[MAX_LINES][200];

hvor MAX_LINES er det maximale antal linier, du vil kunne gemme. Du
skal så sørge for, at "i" i løkken aldrig bliver større end dette tal.
ENDLines er så et område hvor der rent faktisk er plads til data. Før
var det bare en peger til et område, hvor man håber, at der er plads.

Det giver dog en del følgeproblemer, blandt andet fordi man ikke kan
returnere et array, men bliver nødt til at returnere en peger til det.

Endvidere er det uhensigtsmæssigt med disse faste max-størrelser, dels
fordi de spilder plads når de ikke bliver fyldt ud, og dels fordi de
giver problemer når man møder data, der fylder mere, end man har afsat
plads til.


Jeg har modificeret dit program, så det virker - men hovedparten af de
ovenfor nævnte problemer er der endnu, så der er stadig noget at lave
for dig ;-).


/*Included Libs*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
//#include <gtk/gtk.h>

/*Global Variables*/
//Global FilePointers
FILE *logfile;

//Global Strings
char *sEND = "END";
char ENDLines[10][200];
char (*test)[10][200];
char *retCode = "";
char Line[200];

/*
 * The parseLog Function:
 * Returns an array of END-tag lines. ie. list of who printed what =)
 */
char (*parseLog(char *filename))[10][200] {
	int i = 0;
	int j;
	
	logfile = fopen(filename, "r");
	
	while((i<10) && (retCode != NULL)){
		retCode = fgets(Line, 200, logfile);
		if(strstr(Line, sEND)){
			for(j=0;j<200;j++){
				ENDLines[i][j] = Line[j];
			}
			i++;
		}else{
			continue;
		}
	}

	fclose(logfile);
	return(&ENDLines);
}

int main(int argc, char *argv[]){
	int q;
	
	test = parseLog("lp-acct");		
	
	for(q=0;q<10;q++){
		printf("%s\n", (*test)[q]);
	}
	
	return(0);	
}



Det vil være hensigtsmæssigt at lave ENDLines om til typen char** og
så fylde den op med pegere til char-pegere (samme princip som argv i
main). Så kan du undgå de faste størrelser. Til det formål får du brug
for at læse om malloc(), free(), realloc() og strdup().

Strenghåndtering i C er noget indviklet skidt. Men bare spørg igen!

-- 
Regards, Anders


 
Home   Subscribe   Mail Archive   Index   Calendar   Search

 
 
Questions about the web-pages to <www_admin>. Last modified 2005-08-10, 20:08 CEST [an error occurred while processing this directive]
This page is maintained by [an error occurred while processing this directive]MHonArc [an error occurred while processing this directive] # [an error occurred while processing this directive] *