Thread View: be.comp.programming
18 messages
18 total messages
Started by Skender
Fri, 18 Jun 2004 22:48
Probleem met strings in C++
Author: Skender
Date: Fri, 18 Jun 2004 22:48
Date: Fri, 18 Jun 2004 22:48
206 lines
5854 bytes
5854 bytes
Ik heb een programmatje geschreven dat postcodes zoekt als oefening op
strings, maar het werkt niet zoals het zou moeten.
Ik heb een bestand "belgie" dat postcodes bevat. Een lijn per gemeente,
zoals bijvoorbeeld
9000Gent
9840De Pinte
Ik heb een class Gemeente, die 2 strings bevat: de code en de naam.
Dan heb ik een functie Gemeente::naamBevat(char*), waarmee je kunt zien of
de opgegeven string in de naam voorkomt. De code ziet er zo uit:
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),gezocht) != 0;
}
getNaamKlein() geeft de naam van de gemeente in kleine letters. Dit werkt
perfect, maar het zou beter zijn indien de string gezocht ook eerst werd
omgezet in kleine letters:
char *strlwr (char* tekst){
int aantal=strlen(tekst);
char* res = new char[aantal];
for(int i=0; i<aantal; i++)
res[i]=tolower(tekst[i]);
return res;
}
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
}
Maar hier loopt het mis. Compileren levert geen problemen, maar als ik een
gemeente zoek, vindt ik niet alle mogelijke resultaten. Sommige vind ik
wel, andere niet. Toeval of niet: vooral de gemeenten in het Brusselse
geven problemen ;-)
Ik gebruik de gcc versie 3.3.3 onder Linux
Ik heb net hetzelfde programma met net dezelfde lijst gemeenten laten draain
op OpenBSD met de gcc versie 2.95.3 en daar werkt het op het eerste zicht
wel goed!
Wat is er nu eigenlijk mis? Is er een probleem met dat bestand met
postnummers? Zit er een fout in m'n code? Of zou het aan de compiler
liggen?
Bedankt,
Skender
De postcodes staan op http://vrijzijn.be/belgie
M'n code:
#include<iostream>
#include<fstream>
#include<string>
using namespace std;
class Gemeente{
private:
char postnummer[5];
char* naam;
public:
void setNaam(char*);
void setCode(char*);
char* getNaam();
char* getCode();
bool naamBevat(char*);
bool codeBevat(char*);
char* getNaamKlein();
};
char *strlwr (char* tekst){
int aantal=strlen(tekst);
char* res = new char[aantal];
for(int i=0; i<aantal; i++)
res[i]=tolower(tekst[i]);
return res;
}
void Gemeente::setNaam(char* invoer){
naam = new char [strlen(invoer)];
strcpy(naam,invoer);
}
void Gemeente::setCode(char* invoer){
strcpy(postnummer,invoer);
}
char* Gemeente::getNaam(){
return naam;
}
char* Gemeente::getCode(){
return postnummer;
}
char* Gemeente::getNaamKlein(){
return strlwr(naam);
}
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
}
bool Gemeente::codeBevat(char* gezocht){
return !(strstr(getCode(),gezocht) == 0);
}
bool isCijfer(char* invoer){
bool resultaat=true;
int teller=0;
while(resultaat && invoer[teller]!=0){
if(invoer[teller]<'0' || invoer[teller]>'9')
resultaat=false;
teller++;
}
return resultaat;
}
int telLijnen(char* naam,int &maxLengte){
char hulpChar;
int aantal=0;
int teller=1;
maxLengte=0;
ifstream bestand;
bestand.open(naam);
if(!bestand)
aantal=0;
else{
hulpChar=bestand.get();
while(!bestand.eof()){
if(hulpChar=='\n'){
aantal++;
if(teller>maxLengte)
maxLengte=teller;
teller=0;
}
hulpChar=bestand.get();
teller++;
}
}
bestand.close();
return aantal;
}
void vulTabel(char* naam, Gemeente* lijst, int aantal, int maxLengte){
char hulpChar;
ifstream bestand;
bestand.open(naam);
int hulpInt;
int teller=0;
char hulpString[maxLengte];
char codeString[5];
codeString[4]=0;
for(int i=0; i<aantal; i++){
for(int y=0; y<4; y++){
codeString[y]=bestand.get();
}
lijst[i].setCode(codeString);
hulpChar=bestand.get();
teller=0;
while(hulpChar!='\n'){
hulpString[teller]=hulpChar;
hulpChar=bestand.get();
teller++;
}
hulpString[teller]=0;
lijst[i].setNaam(hulpString);
}
bestand.close();
}
int main(int argc, char** argv){
//Aantal gemeentes tellen
int maxLengte;
int aantal=telLijnen("belgie",maxLengte);
if(aantal==0){
cout<<"Geen postcodes beschikbaar"<<endl;
return 66;
}
//Gemeentes in tabel stoppen
Gemeente lijst[aantal];
vulTabel("belgie",lijst,aantal,maxLengte);
//Zoeken
if(argc==2){
cout<<"gezocht op "<<argv[1]<<" in "<<aantal<<" gemeentes"<<endl;
if(isCijfer(argv[1])){
for(int i=0; i<aantal;i++){
if(lijst[i].codeBevat(argv[1]))
cout<<lijst[i].getCode()<<'\t'<<lijst[i].getNaam()<<endl;
}
} else {
for(int i=0; i<aantal;i++){
if(lijst[i].naamBevat(argv[1]))
cout<<lijst[i].getCode()<<'\t'<<lijst[i].getNaam()<<endl;
}
}
} else {
cout<<"Geen zoekopdracht opgegeven"<<endl;
}
return 0;
}
Re: Probleem met strings in C++
Author: Kristoffel
Date: Sat, 19 Jun 2004 13:42
Date: Sat, 19 Jun 2004 13:42
44 lines
2398 bytes
2398 bytes
Skender wrote:
> Ik heb een programmatje geschreven dat postcodes zoekt als oefening op
> strings, maar het werkt niet zoals het zou moeten.
>
> Ik heb een bestand "belgie" dat postcodes bevat. Een lijn per gemeente,
> zoals bijvoorbeeld
> 9000Gent
> 9840De Pinte
>
> De postcodes staan op http://vrijzijn.be/belgie
> M'n code:
>
> char *strlwr (char* tekst){
> int aantal=strlen(tekst);
> char* res = new char[aantal];
> for(int i=0; i<aantal; i++)
> res[i]=tolower(tekst[i]);
> return res;
> }
>
Ik heb je probleem kunnen simuleren met versie 3.2.2.
Je doet hier een *new*, maar er gebeurt nooit een *delete* !
Het kan zijn dat vorige versie van gcc hier geen probleem mee hadden,
maar het is niet erg proper.
Pas je functie aan :
char *strlwr (char *tekst) {
int aantal=strlen (tekst);
//char* res = new char[aantal];
for (int i = 0; i < aantal; i++)
tekst[i] = tolower(tekst [i]);
// res[i] = tolower(tekst [i]);
return tekst;
// return res;
}
en je hebt geen problemen meer.
Als 'tekst' niet mag wijzigen, alloceer met new dan een variable in main
(of in naamBevat), en pas er nadien een delete op toe.
--
Kristoffel
Re: Probleem met strings in C++
Author: Kristoffel
Date: Sat, 19 Jun 2004 14:08
Date: Sat, 19 Jun 2004 14:08
60 lines
2811 bytes
2811 bytes
Kristoffel wrote:
> Skender wrote:
>
>> Ik heb een programmatje geschreven dat postcodes zoekt als oefening op
>> strings, maar het werkt niet zoals het zou moeten.
>>
>> Ik heb een bestand "belgie" dat postcodes bevat. Een lijn per gemeente,
>> zoals bijvoorbeeld
>> 9000Gent
>> 9840De Pinte
>>
>> De postcodes staan op http://vrijzijn.be/belgie
>> M'n code:
>>
>> char *strlwr (char* tekst){
>> int aantal=strlen(tekst);
>> char* res = new char[aantal];
>> for(int i=0; i<aantal; i++)
>> res[i]=tolower(tekst[i]);
>> return res;
>> }
>>
>
> Ik heb je probleem kunnen simuleren met versie 3.2.2.
> Je doet hier een *new*, maar er gebeurt nooit een *delete* !
> Het kan zijn dat vorige versie van gcc hier geen probleem mee hadden,
> maar het is niet erg proper.
>
> Pas je functie aan :
>
> char *strlwr (char *tekst) {
> int aantal=strlen (tekst);
> //char* res = new char[aantal];
> for (int i = 0; i < aantal; i++)
> tekst[i] = tolower(tekst [i]);
> // res[i] = tolower(tekst [i]);
> return tekst;
> // return res;
> }
>
> en je hebt geen problemen meer.
> Als 'tekst' niet mag wijzigen, alloceer met new dan een variable in main
> (of in naamBevat), en pas er nadien een delete op toe.
>
> --
> Kristoffel
Best ook Gemeente::naamBevat aanpassen, anders verander je het attribuut
gemeente.naam in kleine letters!
bool Gemeente::naamBevat (char *p_naam) {
char *res = new char [strlen (getNaam ())+1];
strcpy (res, getNaam ());
bool ret = strstr (strlwr(res), strlwr (p_naam)) != 0;
delete res;
return ret;
}
--
Kristoffel
Re: Probleem met strings in C++
Author: Nicolas Barbier
Date: Sat, 19 Jun 2004 23:47
Date: Sat, 19 Jun 2004 23:47
17 lines
1713 bytes
1713 bytes
Kristoffel wrote: (snip) > Ik heb je probleem kunnen simuleren met versie 3.2.2. > Je doet hier een *new*, maar er gebeurt nooit een *delete* ! > Het kan zijn dat vorige versie van gcc hier geen probleem mee hadden, > maar het is niet erg proper. AFAIK is het niet deleten van genewde blokken niet ongedefinieerd, en mag dus niet de door de OP vermelde problemen opleveren (ervan uitgaande dat de code voor de rest correct is, niet nagekeken en niet bepaald in de stemming ervoor *geeuw* (-; ). -- Nicolas Barbier Protecting innovation against patent inflation <url:http://swpat.ffii.org/>
Re: Probleem met strings in C++
Author: Haplo
Date: Sun, 20 Jun 2004 07:40
Date: Sun, 20 Jun 2004 07:40
25 lines
2143 bytes
2143 bytes
On 19/06/2004, Skender wrote:
<knip>
> void Gemeente::setNaam(char* invoer){
> naam = new char [strlen(invoer)];
> strcpy(naam,invoer);
> }
<knip>
Dit is het eerste wat ik opmerkte. Je maakt een buffer aan met lengte
van de string, maar je vergeet dat er nog een NULL achter moet komen.
De strcpy zet die NULL dus buiten de buffer. Het gevolg hiervan hangt
af van de compiler. Mijn ervaring hiermee is dat het programma niet
werkt zoals je verwacht en meestal op een totaal andere plaats crasht.
Voor de rest zijn er redelijk wat memory leaks in de code, maar die
be�nvloeden niet direct de flow van het programma.
Waarom werk je niet met std::string in plaats van char arrays?
Haplo
--
There are two major products that come out of Berkeley: LSD and BSD
UNIX. We don't believe this to be a coincidence.
Re: Probleem met strings in C++
Author: Skender
Date: Sun, 20 Jun 2004 19:40
Date: Sun, 20 Jun 2004 19:40
15 lines
1580 bytes
1580 bytes
Haplo wrote: > Dit is het eerste wat ik opmerkte. Je maakt een buffer aan met lengte > van de string, maar je vergeet dat er nog een NULL achter moet komen. [KNIP] Dat was inderdaad de fout.��Stom�van�mij. > Waarom werk je niet met std::string in plaats van char arrays? Omdat ik dat niet ken.��Ik�weet�alleen�wat�ik�op�school�heb�geleerd�(en�dat is niet veel) en wat ik via Google tegenkom (al is dat niet altijd juist). Ik ben wel van plan om mij tijdens de vakantie eens op "Thinking in C++" te storten. Skender
Re: Probleem met strings in C++
Author: Skender
Date: Sun, 20 Jun 2004 19:54
Date: Sun, 20 Jun 2004 19:54
25 lines
1924 bytes
1924 bytes
Kristoffel wrote:
>> Ik heb je probleem kunnen simuleren met versie 3.2.2.
>> Je doet hier een *new*, maar er gebeurt nooit een *delete* !
>> Het kan zijn dat vorige versie van gcc hier geen probleem mee hadden,
>> maar het is niet erg proper.
Proper is het inderdaad niet, maar in de functie strlwr() kan ik geen delete
gebruiken. Die functie blijft van de oorspronkelijke array af, en maakt
een nieuwe die het als resultaat terug geeft. Die nieuwe mag niet
verwijderd worden, want dan hen ik niets meer om als resultaat terug te
geven ;-)
Ik heb wel een destructor gemaakt voor de klasse Gemeente. Dit is de eerste
destructor die ik schrijf. Ik vermoed dat dat er ongeveer zo moet uit
zien:
Gemeente::~Gemeente(){
delete [] naam;
}
Ik heb m'n code nog eens gelezen, maar ik zie nergens een plaats waar een
delete nodig is.
Skender
Re: Probleem met strings in C++
Author: John Bokma
Date: Sun, 20 Jun 2004 20:46
Date: Sun, 20 Jun 2004 20:46
9 lines
1376 bytes
1376 bytes
Haplo wrote:
Weis & Hickmann?
--
John MexIT: http://johnbokma.com/mexit/
personal page: http://johnbokma.com/
Experienced Perl programmer available: http://castleamber.com/
Happy Customers: http://castleamber.com/testimonials.html
Re: Probleem met strings in C++
Author: Kristoffel
Date: Mon, 21 Jun 2004 05:31
Date: Mon, 21 Jun 2004 05:31
30 lines
1931 bytes
1931 bytes
Skender wrote:
> Kristoffel wrote:
>
>
>
> Ik heb wel een destructor gemaakt voor de klasse Gemeente. Dit is de eerste
> destructor die ik schrijf. Ik vermoed dat dat er ongeveer zo moet uit
> zien:
>
> Gemeente::~Gemeente(){
> delete [] naam;
> }
delete naam;
>
> Ik heb m'n code nog eens gelezen, maar ik zie nergens een plaats waar een
> delete nodig is.
>
Wat het attribuut 'naam' betreft: je hebt het niet nodig omdat uw
gemeente objecten verwijderd worden bij het verlaten van het programma.
Uw destructor is wel aan te bevelen.
Ik blijf erbij dat het in strlwr wel een probleem geeft.
Waarom bewaar je de gemeentenaam niet in uppercase ?
--
Kristoffel
Re: Probleem met strings in C++
Author: Aquila
Date: Mon, 21 Jun 2004 06:02
Date: Mon, 21 Jun 2004 06:02
11 lines
1645 bytes
1645 bytes
Skender wrote: >> Waarom werk je niet met std::string in plaats van char arrays? > > Omdat ik dat niet ken. Begin dan dringend te zoeken naar introducties over de STL (standard template library) want anders ga je alles zelf doen... Gewoon uit interesse: welke datastructuren gebruik je dan nu? -- "May the source be with you"
Re: Probleem met strings in C++
Author: Arnold Hendriks
Date: Mon, 21 Jun 2004 07:53
Date: Mon, 21 Jun 2004 07:53
16 lines
1757 bytes
1757 bytes
"Kristoffel" <kdg1955@yahoo.com> wrote in message
news:XouBc.161867$UL1.8209503@phobos.telenet-ops.be...
> Skender wrote:
> > Gemeente::~Gemeente(){
> > delete [] naam;
> > }
>
> delete naam;
naam was aangemaakt via new char[], en moet dus wel via delete[] verwijderd
worden. Hoewel gewoon delete in de praktijk wel zal lijken te werken, mag
het niet en gaat het zeker mis op het moment dat je een array van objecten
met destructors verwijderd.
Gewoon zo veel mogelijk std::string en verder smart pointers gebruiken, dat
scheelt een hoop moeite.
Re: Probleem met strings in C++
Author: Skender
Date: Mon, 21 Jun 2004 15:30
Date: Mon, 21 Jun 2004 15:30
16 lines
1634 bytes
1634 bytes
Aquila wrote: > Begin dan dringend te zoeken naar introducties over de STL (standard > template library) want anders ga je alles zelf doen... > Gewoon uit interesse: welke datastructuren gebruik je dan nu? Die die ik zelf schrijf ;-) En verder gebruik ik enkel de gewone variablen zoals bool, char, int of double. Intussen heb ik via Google dit gevonden: http://www.infosys.tuwien.ac.at/Research/Component/tutorial/prwmain.htm The Standard Template Library Tutorial Ik zal me daar eens mee bezig houden. Skender
Re: Probleem met strings in C++
Author: Skender
Date: Mon, 21 Jun 2004 15:38
Date: Mon, 21 Jun 2004 15:38
34 lines
2087 bytes
2087 bytes
Arnold Hendriks wrote:
>
> "Kristoffel" <kdg1955@yahoo.com> wrote in message
> news:XouBc.161867$UL1.8209503@phobos.telenet-ops.be...
>> Skender wrote:
>> > Gemeente::~Gemeente(){
>> > delete [] naam;
>> > }
>>
>> delete naam;
> naam was aangemaakt via new char[], en moet dus wel via delete[]
> verwijderd worden.
Wanneer moet ik eigenlijk een string deleten? In deze functie bijvoorbeeld
worden twee strings aangemaakt, maar ik kan ze niet deleten, want ik heb er
geen pointer naar.
bool Gemeente::naamBevat(char* gezocht){
return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
}
Moet ik dat dan vervangen door dit?
bool Gemeente::naamBevat(char* gezocht){
char* naamKlein = getNaamKlein();
char* gezochtKlein = strlwr(gezocht);
bool res = strstr(naamKlein,gezochtKlein) != 0;
delete [] naamKlein;
delete [] gezochtKlein;
return res;
}
Skender
Re: Probleem met strings in C++
Author: Arnold Hendriks
Date: Mon, 21 Jun 2004 17:59
Date: Mon, 21 Jun 2004 17:59
59 lines
3547 bytes
3547 bytes
"Skender" <Skender@GeenSpamAUB.VrijZijn.be> wrote in message
news:NhDBc.162226$LL2.8273027@phobos.telenet-ops.be...
> > naam was aangemaakt via new char[], en moet dus wel via delete[]
> > verwijderd worden.
>
> Wanneer moet ik eigenlijk een string deleten?
Je moet niets. Je mag hem deleten zodra je hem niet meer nodig hebt.
> In deze functie bijvoorbeeld
> worden twee strings aangemaakt, maar ik kan ze niet deleten, want ik heb
er
> geen pointer naar.
>
> bool Gemeente::naamBevat(char* gezocht){
> return strstr(getNaamKlein(),strlwr(gezocht)) != 0;
> }
>
> Moet ik dat dan vervangen door dit?
>
> bool Gemeente::naamBevat(char* gezocht){
> char* naamKlein = getNaamKlein();
> char* gezochtKlein = strlwr(gezocht);
> bool res = strstr(naamKlein,gezochtKlein) != 0;
> delete [] naamKlein;
Alleen als getNaamKlein() een new[] heeft uitgevoerd
> delete [] gezochtKlein;
strlwr() is geen standaard C++ functie. De eerste strlwr die ik op google
zie geeft dezelfde waarde terug als die je erin stopt, maw: hij verandert de
string die je doorgaf aan de functie. Als dat ook jouw strlwr() is, dan heb
je bij deze niet alleen 'gezochtKlein' verwijderd maar ook 'gezocht'. Ik
denk niet dat dat je bedoeling was, want een tweede aanroep van naamBevat
voor een ander object, maar met dezelfde string pointer, zou dan crashen.
In dat geval had de compiler trouwens de fout zelf ook opgespoord als je hem
had aangegeven dat het niet je bedoeling was 'gezocht' zelf te wijzigen
(zoals waarschijnlijk je intentie was:)
bool Gemeente::naamBevat(char const * gezocht)
Je zou het ook met std::string kunnen oplossen, op voorwaarde dat
getNaamKlein ook een std::string teruggeeft:
using namespace std;
bool Gemeente::naamBevat(string const &gezocht){
string naamKlein = getNaamKlein();
string gezochtKlein = gezocht;
transform(gezochtKlein.begin(), gezochtKlein.eind(), gezochtKlein.begin(),
tolower);
return naamKlein.find(gezochtKlein) != string::npos;
}
Dan ben je helemaal van de deletes af. string regelt dat allemaal zelf.
Nadeel is dat de code enigszins onnatuurlijk kan overkomen, als je nog niet
echt gewend bent aan de C++ uitbreidingen op de C libraries.
Re: Probleem met strings in C++
Author: Skender
Date: Mon, 21 Jun 2004 20:28
Date: Mon, 21 Jun 2004 20:28
31 lines
2588 bytes
2588 bytes
Arnold Hendriks wrote: > Alleen als getNaamKlein() een new[] heeft uitgevoerd Dat doet hij inderdaad. >> delete [] gezochtKlein; > strlwr() is geen standaard C++ functie. De eerste strlwr die ik op google > zie geeft dezelfde waarde terug als die je erin stopt, maw: hij verandert > de string die je doorgaf aan de functie. Als dat ook jouw strlwr() is, dan > heb je bij deze niet alleen 'gezochtKlein' verwijderd maar ook 'gezocht'. > Ik denk niet dat dat je bedoeling was, want een tweede aanroep van > naamBevat voor een ander object, maar met dezelfde string pointer, zou dan > crashen. Toen ik merkte dat strlwr() inderdaad niet bestond, heb ik hem zelf geschreven. Mijn versie maakt een nieuwe tabel met new [] Het was waarschijnlijk beter geweest als ik hem een andere naam gegeven had. [KNIP] > Je zou het ook met std::string kunnen oplossen, op voorwaarde dat > getNaamKlein ook een std::string teruggeeft: [KNIP] Ik heb vanmiddag m'n laatste examen gehad, en ga me deze week wat met C++ bezig houden. Ik ben intussen 2 hoofdstukken ver in "Thinking in C++" van Bruce Eckel, en heb m'n eerste kennismaking met std::string achter de rug. Als ik wat verder gevorderd ben ik dat boek, herschrijf ik m'n postcode programmatje wel eens. Bedankt voor de hulp, Skender
Re: Probleem met strings in C++
Author: Haplo
Date: Tue, 22 Jun 2004 04:46
Date: Tue, 22 Jun 2004 04:46
10 lines
1709 bytes
1709 bytes
On 20/06/2004, John Bokma wrote: > Weis & Hickmann? Inderdaad. -- "To be or nut^H^H^H -- sh^Gt, how do I delete..^D^D^D Oh No Oh NO^D^D^D -- How do I get out of this thing anyway (mumble mumble) Bus error (core dumped)
Re: Probleem met strings in C++
Author: John Bokma
Date: Tue, 22 Jun 2004 17:36
Date: Tue, 22 Jun 2004 17:36
15 lines
1626 bytes
1626 bytes
Haplo wrote:
> On 20/06/2004, John Bokma wrote:
>
>> Weis & Hickmann?
>
> Inderdaad.
Ooit gebruikt als nick, heel lang geleden :-D.
--
John MexIT: http://johnbokma.com/mexit/
personal page: http://johnbokma.com/
Experienced Perl programmer available: http://castleamber.com/
Happy Customers: http://castleamber.com/testimonials.html
Re: Probleem met strings in C++
Author: Kurt Bosmans
Date: Sun, 25 Jul 2004 13:39
Date: Sun, 25 Jul 2004 13:39
30 lines
1793 bytes
1793 bytes
> char *strlwr (char* tekst){
> int aantal=strlen(tekst);
> char* res = new char[aantal];
> for(int i=0; i<aantal; i++)
> res[i]=tolower(tekst[i]);
> return res;
> }
Buiten het feit dat je hier een memory leak hebt (new maar nergens
delete), vergeet je ook je resultaat string "res" te terminaten. Een
"c" string moet altijd eindigen met een '\0' karakter. Hierdoor zal je
programma "soms" werken en "soms" niet, afhankelijk van er toevallig in
je geheugen zat.
Dus je functie zou er als volgt moeten uitzien:
char *strlwr (char* tekst)
{
int aantal=strlen(tekst);
char* res = new char[aantal + 1]; // 1tje meer alloceren
for(int i=0; i<aantal; i++)
res[i]=tolower(tekst[i]);
res[i] = '\0'; // string terminaten!
return res;
}
En uiteraard moet "res" ergens met een "delete[]" terug vrijgegeven
worden door de code die deze functie oproept...
Kurt
Thread Navigation
This is a paginated view of messages in the thread with full content displayed inline.
Messages are displayed in chronological order, with the original post highlighted in green.
Use pagination controls to navigate through all messages in large threads.
Back to All Threads