Avatar billede Henrik_B Novice
31. oktober 2002 - 14:50 Der er 9 kommentarer og
1 løsning

Strengproblemer fra newbie ...

Jeg benytter Builder 4.

Følgende kode ligger i en procedure for dobbeltklik på en node i et TreeView.

>  TTreeNode *pItem = FromTreeView->Selected;
>  char *nodetekst = pItem->Text.c_str();
>
A1> char *besked = new char;
A2> char *besked;
A2> besked = new char;
>
>  strcpy(besked, "Double click at ");
>  strcat(besked, nodetekst);
>  MessageBox(Handle, besked, "Tree view", MB_OK);
>  delete &besked;
>

Her er mine spørgsmål :

1. Er A1 og A2 det samme ?
2. Hvorfor får jeg en AccessViolation når jeg dobbeltklikker på en node anden gang (ikke nødvendigvis samme node) ?
3. Det samme sker, hvis jeg kalder en anden form (Form2->Show()), hvorfor ?

Det burde være simpelt for alle jer garvede derude ...

M.v.h.
Henrik.
Avatar billede mickni33 Nybegynder
31. oktober 2002 - 14:53 #1
prøv at udkommenter char *besked = new char;
og se om det virker
Avatar billede mickni33 Nybegynder
31. oktober 2002 - 14:55 #2
A1 og A2 er det samme
Avatar billede mickni33 Nybegynder
31. oktober 2002 - 14:58 #3
char *besked = new char;

sådan her gør du typisk hvis du skal oprette en new char i f.eks en funktion
MAn kan jo ikke gøre sådan i en klasse

class Minklasse{
  private:
        char *besked = new char; ////Duer Ikke
        char *besked;    ////OK
  public:
  void enfunktion();
};
Avatar billede mickni33 Nybegynder
31. oktober 2002 - 14:59 #4
A2> char *besked

behøver du kun en gang i programmet
Avatar billede chries Nybegynder
31. oktober 2002 - 15:03 #5
det her går ikke, hverken A1 eller A2 !
A1> char *besked = new char;
A2> char *besked;
A2> besked = new char;
>
>  strcpy(besked, "Double click at ");

du allokerer kun 1 byte, og det er kun nok til en nul terminerning.

du skal bruge:
A1> char *besked = new char[128];
eller
A2> char *besked;
A2> besked = new char[128];

og husk delete [] besked;

(128 er en størrelse stor nok)
Avatar billede mickni33 Nybegynder
31. oktober 2002 - 15:06 #6
chries har ret du mangler []
da char* er det samme som char[]
Avatar billede swaq Nybegynder
31. oktober 2002 - 20:56 #7
char* er IKKE helt det samme som char[]!?!
Ikke i følge min opfattelse... prøv eksempelvis at lav en sprintf(...) på en char-pointer, det kan ikke lade sig gøre. sprintf vil kun acceptere en char med en fikseret størrelse, hvilket man ikke kan sige en char-pointer er!
Avatar billede chries Nybegynder
01. november 2002 - 09:03 #8
sprintf kan sagten lade sig gøre på en char pointer, der er ingen funktionel forskel på dem (borset fra sizeof).

#include <string.h>
#include <iostream.h>
#include <stdio.h>


int main(int argc, char* argv[])
{
    char *p1 = new char[128];
    char p2[128];

    sprintf( p1, "hej med: %s", "p1" );
    sprintf( p2, "hej med: %s", "p2" );

    cout << p1 << endl;
    cout << p2 << endl;

    p1[2] = 'X'; // <- læg mærke til anvendes som array
    *(p2 + 2) = 'X'; // array anvendt <- som pointer

    cout << p1 << endl;
    cout << p2 << endl;

    return 0;
}
Avatar billede swaq Nybegynder
04. november 2002 - 12:44 #9
Ja, ok... char pointer og char pointer... Hvad jeg mente var, at du ikke kan lave et sprintf med pointeren alene (det resulterer i en zombie-proces) Men som du har lavet det er det jo heller ikke en pointer alene, det er jo et array (altså en fast størrelse) og det var det jeg mente med min kommentar tidligere!
Avatar billede soepro Nybegynder
07. november 2002 - 14:19 #10
Udover obvenstående kommentarer i fht. at give besked nok plads til at kopiere den tekst du har tastet ind, så mener jeg af din delete er forkert:

char *besked = new char[128];
:
delete [] besked;

Ideen med new og delete er imidlertid at man ikke på forhånd ved hvor meget plads man har brug for. (Hvis man ved det kan man jo bare skrive char besked[128]; i stedet for.)

Der er en nemmere måde, hvor du ikke selv behøver at tænke på det med længderne:

Application->MessageBox(("Double click at " +  FromTreeView->Selected->Text).c_str(),
                        "Tree view", MB_OK);
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