Avatar billede hello2all Nybegynder
29. oktober 2002 - 18:21 Der er 22 kommentarer og
1 løsning

meget underligt!!

For at advare jer så er dette et lidt mærkeligt spg.

Jeg laver et program i c der henter en liste af varer ind i et structarray og bagefter skriver det ud i konsollen.
Det er så her at det mærkelige kommer.
En af varene i lister er Strømper og dette ord vil programmet ikke skrive ud.

Er der nogle der ved hvad der foregår...??

ps. hvis jeg ændrer varenavnet i varelisten til sokker virker det fint og jeg har andre varer med 'ø' i listen f.eks trøjer.
Avatar billede hello2all Nybegynder
29. oktober 2002 - 18:22 #1
...og ja jeg læser DØK....!!
Avatar billede soreno Praktikant
29. oktober 2002 - 18:27 #2
hvad med at poste lidt kode ?
Avatar billede hello2all Nybegynder
29. oktober 2002 - 18:44 #3
det ville jeg gerne men sk.. linux gider ikke copy/paste til eksperten...
Avatar billede razersedge Nybegynder
29. oktober 2002 - 18:47 #4
Du bliver nok nødt til at paste noget kode ja..
Avatar billede hello2all Nybegynder
29. oktober 2002 - 18:56 #5
Her er funktioen der sender varelegeret til en client fra serveren
void sendvarelager(int bruger_id)
{
    char varenr_char[10],stk_char[10];
    int j;

    hent();

    for(j=0;j<4;j++)
    {

        sprintf(varenr_char,"%i",vare[j].varenr);
        sprintf(stk_char,"%i",vare[j].stk);

        send(varenr_char, bruger_id*10);
        send(vare[j].navn, bruger_id*10);
        send(stk_char, bruger_id*10);
        send(vare[j].type, bruger_id*10);
    }

    send("$$$",bruger_id*10);

    printf("server har sendt varelager til bruger_id: %i\n", bruger_id);
}
Avatar billede hello2all Nybegynder
29. oktober 2002 - 18:59 #6
Her er funktioenen der modtager varelageret og printer det


int bruger_id;

void vis()
//Viser indholdet af lageret
{

    char tekst[10],brugeridchar[10], commandochar[10];
    char end[]="$$$";


    int taeller = 0;
    //int bruger_id=911;
    int serverkoe = 100;

    //printf("i vis.før modtag: \n");
    modtag(100);

    //printf("i vis.efter modtag: \n");
    sprintf(brugeridchar,"%i",bruger_id);
    sprintf(commandochar,"%i",10);
    //printf("bruger-id-char: %s\n",brugeridchar);
    send(commandochar,101);// commando angiver hvilken tjeneste brugeren ønsker
    send(brugeridchar, 101);//sender besked til serveren, om at brugeren ønsker en tjeneste


    printf("\n***********************************\n");
    printf("Varenr.\tNavn.\tAntal.\tType.\n");
    printf("***********************************\n");


    while(1==1)
    {
        //printf("før modtag\n");
        strncpy(tekst,modtag(bruger_id),10);
        printf("vis tekst i while: %s\n",tekst);

        //printf("efter modtag\n");
        if(strncmp(tekst,end,3)==0) break;

        if(taeller!=3)
        {
            printf("%s\t", tekst);
            taeller++;
        }
        else
        {
            printf("%s\n\n",tekst);
            taeller=0;
        }
    }


    printf("***********************************\n");
}
Avatar billede mbulow Nybegynder
29. oktober 2002 - 20:09 #7
Nu vil jeg tillade mig at gå ud fra at det er den her:
  printf("vis tekst i while: %s\n",tekst);
i vis-funktionen der ikke vil udskrive varenavnet "Strømper"


Du kan jo prøve i din 'void sendvarelager(int bruger_id)'-funktion at udskrive alle dine varenavne ligesom du prøver på klient-siden.
Altså i din for-løkke indsætte en:
  printf("Debug: Varenavn == %s\n", vare[j].navn);

- Hvis DEN heller ikke vil udskrive "Strømper" rigtigt, må fejlen vel næsten ligge et sted på serversiden. (Eller måske på begge sider)
- Hvis den udskriver det fint, må fejlen findes et sted fra serveren kalder 'send', til klienten har kaldt 'modtag'.



En anden ting: Nu siger du at det virker fint når du kalder "Strømper"ne for "sokker", men har du prøvet at give "Strømper" et andet navn der er lige så langt, uden æøå... "CocaCola" :)


En tredje ting: Nu er du sikker på at alle dine char-arrays er store nok til at indeholde det du skriver til dem ik'?
Jeg mener... Hvis du skriver et 10-cifret varenummer til varenr_char, får du jo et problem, når der ikke er plads nok til at gemme det sidste '\0' i array'et.




PS!!! Rimeligt meget gætværk her... Det er ikke ligefrem nemt at finde en fejl, når man kun ser et lille udsnit af koden... På den anden side kan jeg også godt forstå at du ikke har postet hele din løsning med alle de andre DØK'ere på kanalen ;)
Avatar billede hello2all Nybegynder
30. oktober 2002 - 12:22 #8
Selvfølgelig kan der vel være en fejl i koden men...
strømper kan udbyttes med et længere eller lige så langt navn og så virker det.
der er både længere varenavne og andre navne med æøå i listen. Det virker lidt som om at strømper er et reserveret ord eller sådan noget.....

meget underligt.....
Avatar billede mbulow Nybegynder
30. oktober 2002 - 14:08 #9
Hmm... Ja det virker meget underligt.
Når det ikke er noget problem at bruge navne der er længere end "Strømper" falder mine idéer jo lidt til jorden, men det er jo kun godt nok :)

Jeg er ked af at jeg ikke rigtig kan hjælpe dig så, men du må love at fortælle hvad der var galt hvis/når du finder ud af det :)
Avatar billede hello2all Nybegynder
30. oktober 2002 - 15:05 #10
Det vil jeg gøre men jeg vil satse 200 point mere hvis jeg kunne få et svar...
Avatar billede mbulow Nybegynder
30. oktober 2002 - 17:18 #11
Jeg er ikke sikker på hvor meget jeg kan gøre, men du skal være velkommen til at sende hele din opgave til mig. Så kan jeg se på det i en større helhed... Det KAN jo være jeg er heldig at finde frem til problemet :)

mbulow@mail.tele.dk
Avatar billede ricelius Nybegynder
31. oktober 2002 - 00:27 #12
Prøv at debugge... Jeg har været ude for ting der er lige så underlige, og løsningen findes oftest ved at single-steppe gennem programmet. Held og lykke! Og skriv venligst, når du finder ud af, hvad der var galt - er ret nysgerrig ;)
Avatar billede hello2all Nybegynder
31. oktober 2002 - 09:58 #13
har prøvet at gennemgå programmet fra en ende til den anden.
Afleverer opgaven i morgen så jeg kan sende koden i løbet af weekenden
Avatar billede soepro Nybegynder
07. november 2002 - 13:47 #14
Mon ikke dit problem skyldes:

1) Enten
At dine send/receive metoder ikke understøtter nationale karakterer

2) Eller
Du sender i eet tegnsæt (f.eks. DOS 850) og modtager i et andet (Windows ISO9000), og derfor bliver dine nationale karakterer ikke "oversat" korrekt. (I det fleste tegnsæt ligger A-Z samme sted rent "index" mæssigt, altså f.eks. 65 = A. Det gælder dog ikke EBCDIC.)
Avatar billede hello2all Nybegynder
10. november 2002 - 20:29 #15
i så fald ville ordet "trøjer" heller ikke virke hvilket det gør.
Avatar billede soepro Nybegynder
11. november 2002 - 11:07 #16
hello2all >> Er strengen 'Str' reserveret ? (>STR<ømper bliver måske tolket som en kommando.)
Avatar billede hello2all Nybegynder
11. november 2002 - 13:31 #17
Dette kunne være en mulighed. Kan du uddybe... er ikke super haj!!

Jeg har ikke selv reseveret <str> til andet men intet ved Linux vil kunne overraske mig..hehe
Avatar billede hello2all Nybegynder
11. november 2002 - 13:31 #18
Hvordan kan jeg tjekke om dette er problemet??
Avatar billede initializing Nybegynder
11. november 2002 - 13:31 #19
Det kan godt være at det er emget underligt men overvej en bedre overskrift næste gang.
Avatar billede soepro Nybegynder
11. november 2002 - 13:34 #20
hello2all >> Prøv at ændre teksten til 'Stroemper' f.eks. - hvis det virker, er det nok ikke derfor. Hvad med 'strømper' (lille s) eller 'strmøper' (Bevidst stavefejl) - virker det ?

Prøv med forskellige kombinationer, for at se om det kun er den ene specielle kombination der ikke fungerer. Det kunne være at parseren (et eller andet sted) betragter 'ø' som separator tegn, og kun lade det smutte igennem, hvis den ikke kan få noget fornuftigt ud af resten.
Avatar billede soepro Nybegynder
11. november 2002 - 13:43 #21
Du kunne også bare remappen dine teksten til noget der f.eks. ligner HTML syntaksen:

char * mapToHTML(char *s)
{
  static htmlString[257];
  int idx, ofs, len;
  len = strlen(s);
  for (idx = 0, ofs = 0; idx < len && idx < sizeof(htmlString)-1; idx++)
  {
    switch (s[idx])
    {
      case 'ø' : ofs += sprintf(htmlString+ofs, "&oelig;"; break;
      case 'æ' : ofs += sprintf(htmlString+ofs, "&aelig;"; break;
      : // De andre nationale karakterer
      default  : ofs += sprintf(htmlString+ofs, "%c", s[idx]); break;
    }; // Nationale eller alm. karatekerer.
  }; // Alle tegn i strengen
}

Og så bruge den mappede tekst i dine kald i stedet for:

send(mapToHTML(varenr_char), bruger_id*10);

Så skal du selvfølgelig gøre det modsatte i den anden ende:

char * mapFromHTML(char *s)
{
  static normalString[257];
  int idx, ofs, len;
  len = strlen(s);
  for (idx = 0, ofs = 0; idx < len && idx < sizeof(normalString)-1; idx++)
  {
    if (strcmp(s[idx], "&oelig;") == 0)
      ofs += sprintf(normalString+ofs, "ø");
    else
    if (strcmp(s[idx], "&aelig;") == 0)
      ofs += sprintf(normalString+ofs, "æ");
    else
      : // De andre nationale karakterer
    else
      ofs += sprintf(normalString+ofs, "%c", s[idx]);
    }; // Nationale eller alm. karakterer.
  }; // Alle tegn i strengen
}
Avatar billede herman01753 Nybegynder
12. november 2002 - 01:02 #22
prøv at indsætte koderne efter lig med tegnet, i stedet for de danske karakterer i din kode. eksempel:
skrive På næste lørdag = P\x86 n\x91ste l\x9Brdag
æ = \x91        Æ = \x92
ø = \x9B        Ø = \x9D
å = \x86        Å = \x8F

Håber det ku være en løsning på dit problem
Avatar billede hello2all Nybegynder
12. november 2002 - 16:08 #23
værs'go soepro. Vi er ved at bevæge os ud i noget jeg slet ikke ved noget om. Håbede at der var en "nem" forklaring på dette underlige fænomen.

Tak for hj/x91lpen...
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