[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| wrote:
> 
> > Du kan ikke arbejde med et array af arrays af ubestemt størrelse.
> > Muligvis prøver du at returnere et array af char pointere?
> Tror du har ret
> > Vis noget kildetekst - gerne et minimalt eksempel, som viser problemet -
> > så skal du få hjælp.

Du allokere aldrig noget hukommelse til ENDLines hverken til arrayet,
der indeholder pointers til strenge, eller til de strenge dette array
skal indeholde. Denne vil derfor formodeligt være NULL, og du forsøger
derfor at skrive et sted i hukommelsen hvor du ikke har lov til det,
og dit program vil dør med en segmentation fault.

I main har jeg listet et eksempel på noget kode der allokere et
array af pointere til strengs.


> ok her kommer det jeg har lavet indtil videre
> /*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[] = {};

Jeg ville nok bruge  char **ENDlines;

> char *test[]={};

denne her har du ikke brug for

> char *retCode;
> char Line[200];

Her allokere du 200 karaktere, du har altså plads til 199 karaktere
fordi den sidste karakter altid er 0, 0 betyder nemmeligt her slutter
strengen. Dette er en grim og skjult fejl i C som man skal være
opmærksom
på.
 
> /*
>  * The parseLog Function:
>  * Returns an array of END-tag lines. ie. list of who printed what =)
>  */
> char** parseLog(char *filename){

Brug:

void ParseLog(char *filename)

ENDLines er globalt defineret. Og du behøver derfor ikke at returnere
den fra din funktion.

>         int i = 0;
>         int j;
> 
>         logfile = fopen(filename, "r");
> 
>         while(retCode != NULL){
>                 retCode = fgets(Line, 200, logfile);

200 bør være 199 fordi du skal have plads til det 0 der viser hvornår
strengen slutter.

>                 if(strstr(Line, sEND)){
>                         for(j=0;j<200;j++){
>                                 ENDLines[i][j] = Line[j];
>                         }


I main har jeg vist hvordan du allokeres 100 pointere til strenge, men
hvis
i er størrer end 99 så vil du skrive til en array position der ikke er
allokeret og dit program vil dø. Du kan så enten udskrive en fejl og
stoppe programmet hvis der er flere end 100 end strenge, eller du kan
bruge
følgende kode, der dynamisk resizer arrayet af pointere til strenge.


// check at dit array er stort nok:

  if (i>=N) 
    {
      N+=100;
      Endlines=(char**)realloc(Endlines, N*sizeof(char*) ); 

// Realloc reallokere ram svarende til den nye størrelse, og
// kopiere indholdet fra det gamle array til det nye og større
// array. Så der allokeres lige 100 strenge pointere flere
    }

// Nu ved du at EndLines[i] er en element inden for den bid ram
// du har allokeret til dit ENDLines array, du kan derfor gemme
// en værdi i den som følger
// Her allokeres der længden af Line +1 karaktere af ram
// +1 skyldes der skal være plads til den afsluttende 0 karakteren.

  EndLines[i]=(char*)malloc( (strlen(Line)+1) * sizeof(char) );

strlen(Line) = antallet af karaktere i linien (minus den sidste 0
karakter)

// Check altid for om malloc operationen virker, dvs. om der er ram
// nok, ellers vil programmet crashe på et eller andet tidspunkt.

  if (EndLines[i]==NULL)
     { printf("Out of memory!"); exit(42); }


// Du kan nu kopiere karaktere fra Line til EndLines[i] uden nogle
// problemer:

  strcpy(EndLines[i],Line);

>                         i++;
>                 }

else{
>                         continue;
>                 }

Jeg tror programmet vil gøre det helt samme uden else continue.

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

Endlines er globalt defineret (ikke en lokal funktion), og du behøver
derfor ikke at returnere den fra den lokale funktion. Derfor kan denne
defineres til at returnere void.

Du kan derimod med fordel returnere i, dvs. antallet af strenge du
har fundet i filen. 

dvs. 

int ParseLog(char *filename)
:
:
return i;


> }
> 
> int main(int argc, char *argv[]){
>         int q;

Du kan også lave denne om til char** argv uden problemer.

Du bør initialisere ENDlines med

int N=100;
Endlines=(char**)malloc( N*sizeof(char*) );
if (Endlines==NULL) {fejl}

Nu er der allokeret plads til 100 pointers til strenge, disse strenge
er endnu ikke allokeret fordi vi ikke ved hvor meget plads de kræver.

 
>         test = parseLog("lp-acct");
> 
>         for(q=0;q<10;q++){
>                 printf("%s\n",test[q]);

Jeg forslår at du ændrer parselog til at returnere antallet af strenge
istedet:

>         int nlines=parseLog("lp-acct");
> 
>         for(q=0;q<nlines;q++){
>                 printf("%s\n",ENDLines[q]);


>         }
> 

Her skal du så deallokere alt den ram du har allokeret:

     for (j=0;j<nlines;j++) free(ENDLines[j]);
     free(ENDLines);

Det er kun de pointere i ENDLines der er allokeret med malloc der
skal free's, free'er man en pointer der ikke er allokeret, vil 
programmet crashe. Derfor skal du ikke free alle pointere i
arrayet dvs. fra 0 til N-1.

Bemærk også at arrayet af pointere free's efter at de enkelte
pointere i det er free'et. 


>         return(0);
> }
> 
> Håber der er nogen der kan gennemskue mit problem =) Som sagt er jeg helt
> ny i C og det program jeg er ved at skrive er en port af et java program

Det er en ordentlig omgang du har rodet dig ud i. Hvis ovenstående
ikke er klart, så råb op.

-- 
    No matter how fast light travels it finds *
    the darkness has always got there first,  *  Carsten Svaneborg
	     and is waiting for it.           *   zqex at risoe.dk
	-- (Terry Pratchett, Reaper Man)      *


 
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] *