Avatar billede kasparov Nybegynder
10. maj 2002 - 02:20 Der er 7 kommentarer og
1 løsning

Parse error -kvaler... noget med pointers?

Håber der er nogen som kan hjælpe mig med mit lille problem; jeg er bange for det er et spørgsmål om nogle pointers.

Koden ser ud som følger, og problemet er at jeg hele tiden får segmentation fault når jeg kører det (den compilerer det fint)(skal måske lige nævne at det er under cygwin i XP)

char *telegramInputBuffer[10];
int *currentTele = 0;

    int reached_end = 0;
    int succes = 0;
    int i = 0;

int main(void){

    char streng[] = "DetteSkalGemmes";
    int test = 0;
    test = find_ledig_plads(streng);
    return(test);
    }

int find_ledig_plads(char streng[]){

    printf("initiatingaflevering");
    reached_end = 0;
    succes = 0;
    i = *currentTele;

    printf("- done! /n)");
    while(telegramInputBuffer[i]!="/0"){
    i++;
    printf("searching for free slot: ");
    printf("%i",i);
    }
    printf("/n");
    if (telegramInputBuffer[i] == "/0"){
        printf("Found a slot! /n");
        succes = 1;

    }
    if (!&succes && !&reached_end){
        i = 0;
        reached_end = 1;
        while(telegramInputBuffer[i]!="/0" && (i < *currentTele)){
            i++;
        }
    }
    if(&succes || telegramInputBuffer[i]=="/0"){
        telegramInputBuffer[i] = streng;
        succes = 1;
    }
    return succes;
}

Nogen kan hjælpe!

PS: jeg sætter sværhedsgraden til svær fordi jeg har brugt snart 1½ time på at finde fejlen(e), og er nærmest desperat :)
Avatar billede kasparov Nybegynder
10. maj 2002 - 02:25 #1
Der skulle så stå "HÅBER nogen kan hjælpe!" men "Nogen kan hjælpe!" afspejler måske bedre min frustration... :)
Avatar billede laffe Nybegynder
10. maj 2002 - 08:06 #2
Jeg er ikke helt med ¨på, hvad du vil med den kode, men er det meningen, at du vil gemme strenge i telegramInputBuffer arrayet:

telegramInputBuffer[0] = "Dette er test line 1";
telegramInputBuffer[1] = "Dette er test line 2";
telegramInputBuffer[2] = "Dette er test line 3";

Hvad er det find_ledig_plads skal gøre ?
Avatar billede mickni33 Nybegynder
10. maj 2002 - 09:12 #3
De gange jeg har haft segmentation fault er når en af mine løkker har kørt for langt (under linux)
Så prøv i første omgang at kører løkkerne hvor du sætter din løkke tæller til et fast antal for at se om det overhovedet virker.
Måske kan det godt have noget at gøre med den "\0" .

Prøv med '\0' altså enkelt '
Avatar billede kasparov Nybegynder
10. maj 2002 - 12:42 #4
Det skulle gerne blive til noget som ligner en ring-buffer for tekststrenge, men den er måske ikke helt så gennem tænk nu du siger det (laffe). find_ledig_plads skulle så søge bufferen igennem efter den første ledige plads. Men selvom konceptet måske lige skal kigges igennem igen, burde koden vel køre fint (den kan da kompilere). mickni33>> kigge lige på mine løkker og '\0' og ser om det hjælper - og tak for hjælpen begge to!
Avatar billede chries Nybegynder
10. maj 2002 - 19:50 #5
Det får du heller ikke foreløbig til at virke. Du mangler at lære en del om pointere endnu.

char *telegramInputBuffer[10];

dette allokere 10 pointere til en char streng. desuden initieres der ikke nogen værdier ! (f.eks telegramInputBuffer[1] er ikke lig 0, men noget tilfældigt):


int *currentTele = 0;

    int reached_end = 0;
    int succes = 0;
    int i = 0;

int main(void)
{
    char streng[] = "DetteSkalGemmes";
    int test = 0;
    test = find_ledig_plads(streng);
    return(test);
}

int find_ledig_plads(char streng[]){

    printf("initiatingaflevering");
    reached_end = 0;
    succes = 0;

Her sætter du i lig det currentTele pejer på, hvilket svarer til noget tilfældigt, da du har sat den til at pege på addresse 0.

    i = *currentTele;

    printf("- done! /n)");

følgende virker ikke: (pga min første kommentar)

    while(telegramInputBuffer[i]!="/0"){
    i++;
    printf("searching for free slot: ");
    printf("%i",i);
    }
    printf("/n");
    if (telegramInputBuffer[i] == "/0"){
        printf("Found a slot! /n");
        succes = 1;

    }
    if (!&succes && !&reached_end){
        i = 0;
        reached_end = 1;

currentTele pejer stadig på intet ! og du prøver at sammenlige addressen på en streng (telegramInputBuffer[i]) med en anden addresse ("/0"), de bliver aldrig ens!

        while(telegramInputBuffer[i]!="/0" && (i < *currentTele)){
            i++;
        }
    }
    if(&succes || telegramInputBuffer[i]=="/0"){

her vil du prøve at sætte telegramInputBuffer[i] til at peje på din input streng.. kommer den også til, den pejer på den i main og er IKKE en kopi. Går stregen i main ud af scope, pejer du på "intet" igen.

        telegramInputBuffer[i] = streng;
        succes = 1;
    }
    return succes;
}
Avatar billede chries Nybegynder
10. maj 2002 - 19:51 #6
peje = pege :-)
Avatar billede chries Nybegynder
10. maj 2002 - 19:56 #7
følgende er også addresse sammenligner:
..
  while(telegramInputBuffer[i]!="/0"){

..
    if (telegramInputBuffer[i] == "/0"){
        printf("Found a slot! /n");
..

  if(&succes || telegramInputBuffer[i]=="/0"){

..
Avatar billede kasparov Nybegynder
10. maj 2002 - 21:22 #8
Takker for den konstruktive kritik... chries>> du har helt ret i, at jeg ikke har styr på de pointere; ideen med den currentTele-pointer kom sig af at jeg et andet sted har brug for at lave call-by-reference, så den ændrer sig i hovedprogrammet også, når jeg kalde ren bestemt metode. Har modificeret det hele en del, og mange ting er blevet anderledes. Jeg ved bare aldrig hvornår det er smart/nødvendigt med de pointers :(
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester