Gå til innhold

C#: Uforståelig oppførsel av to Char[] variabler.


Anbefalte innlegg

Har debugget og steppet i time etter time nå. Er normalt fan av å finne ut av feil i koden selv. Da jeg lærer en stor del mer av dette. Men nå føler jeg tiden er kommet til å krype til korset.

 

Har en funksjon som inneholder en do-while løkke. (Hele løkken ligger i do-while.txt som jeg la ved). I nevnt funksjon har jeg 2 char arrays; FName[] og Name2[].

 

Problemet ligger i første forløkken nedenfor her. Når Name2[f] blir satt til en bokstav, la oss si 'C'. Som blir hentet fra NameContainer[m,f] så endres samtidig FName seg til det samme.

Om index 2 i Name2 blir 'E', så blir index2 i FName også 'E'. Osv. Dette skjer for hver iterasjon i forløkken. Altså _Før_ if segmentet nedenfor.

 

Har helt ærlig ingen clue om hva som er feil, eneste jeg kan tenke meg det kan være er noe minnereferanse kluss.. Men ser ikke helt hvor det skulle oppstått.

 

do

{
     ...
               for (int f = 0; f < 12; f++)        
                   FName[f] = NameContainer[m, f];

               for (int i = 0; i < 5999; i++) 
               {
                   for (int j = 0; j < 12; j++)
                       Name2[j] = NameContainer[i, j];

                   if (First(FName, Name2) == false)
                       FName = Name2;
               }
     ...
}

 

Limte inn "problemkoden" her, resten av do-while løkken ligger nedenfor:

 

 

 

do{ //Sorterer navna og bygger return string.

 

int i = 0;

int j = 0;

for (int f = 0; f < 12; f++) //Finner første navn

FName[f] = NameContainer[m, f];

 

for (i = 0; i < 5999; i++)

{

for (j = 0; j < 12; j++)

Name2[j] = NameContainer[i, j]; //Finner andre navn

 

if (First(FName, Name2) == false)

FName = Name2;

}

 

for (int g = 0; g < FName.Length; g++)

firstName += Convert.ToString(FName[g]);

 

for(int o = 0; o < 13; o++)

NameContainer[i, o] = ',';

 

for (int q = 0; q < Name2.Length; q++)

Name2[q] = ',';

 

if (m != 0 && firstName.Length > 2)

finishSorting += ",\"";

 

if(firstName.Length > 2)

for (int e = 0; e < firstName.Length; e++)

if (firstName[e] != ',' && firstName != "")

finishSorting += Convert.ToString(firstName[e]);

 

if (firstName != "")

finishSorting += "\"";

 

firstName = "";

m++;

 

prgb.Value = m/55;

 

}while(m != 5500);

 

 

 

Limer like gjerne inn hele funksjonen også, om det er til noe hjelp.

 

public string SortNames(ProgressBar prgb)

{

string sortedNames = "";

string finishSorting = "\"";

string firstName = "";

bool EndOfName = true;

int counter = 0;

char[] Name = { ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',' };

char[] Name2 = { ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',' };

char[] FName = { ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',' };

char[] TempName = { ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',', ',' };

char [,] NameContainer = new char [6000, 13];

 

StreamReader str = new StreamReader("Names.txt");

sortedNames = str.ReadLine();

 

int b = 0;

 

do //Stapper navn i navnecontaineren.

{

 

 

if (sortedNames[counter] == '"' && EndOfName == true)

{

EndOfName = false;

int i = 0;

do

{

counter++;

Name = sortedNames[counter];

i++;

} while (sortedNames[counter] != '"');

 

while (i < 12)

{

Name = '.';

i++;

}

}

 

EndOfName = true;

counter++;

 

if (sortedNames[counter] == ',')

{

for (int i = 0; i < Name.Length; i++)

NameContainer[b, i] = Name;

b++;

}

 

} while (sortedNames[counter] != '@');

 

 

int m = 0;

 

do{ //Sorterer navna og bygger return string.

 

int i = 0;

int j = 0;

for (int f = 0; f < 12; f++) //Finner første navn

FName[f] = NameContainer[m, f];

 

for (i = 0; i < 5999; i++)

{

for (j = 0; j < 12; j++)

Name2[j] = NameContainer[i, j]; //Finner andre navn

 

if (First(FName, Name2) == false)

FName = Name2;

}

 

for (int g = 0; g < FName.Length; g++)

firstName += Convert.ToString(FName[g]);

 

for(int o = 0; o < 13; o++)

NameContainer[i, o] = ',';

 

for (int q = 0; q < Name2.Length; q++)

Name2[q] = ',';

 

if (m != 0 && firstName.Length > 2)

finishSorting += ",\"";

 

if(firstName.Length > 2)

for (int e = 0; e < firstName.Length; e++)

if (firstName[e] != ',' && firstName != "")

finishSorting += Convert.ToString(firstName[e]);

 

if (firstName != "")

finishSorting += "\"";

 

firstName = "";

m++;

 

prgb.Value = m/55;

 

}while(m != 5500);

 

finishSorting += "@";

 

return finishSorting;

}

 

 

Kanskje et poeng å nevne at 70% av koden ble skrevet i lettere alkoholrus. Men etter time på time med edru debugging klarer jeg ikke forstå hva feilen er. Tror feilen er lokalisert i øverstekodebit jeg limte inn.

Målet med funksjonen er forøvrig å returnere en string med navn som er ferdig sortert i alfabetisk rekkefølge. Navnene blir først funnet lest inn fra txt fil til NameContainer.

 

Håper på svar^^

do_while.txt

Endret av Froya
Lenke til kommentar
Videoannonse
Annonse

Jeg har litt problemer med å forstå hva du egentlig prøver på. Men for å få en liste over personer sortert ville jeg gjordt det på denne måten (mer eller mindre -- ikke testet):

 

List<Person> AlleFolka = new List<Person>();
// Les inn fra fil og populer: AlleFolka.Add(new Person("Åge", "Aleksandersen"));
AlleFolka.Sort(delegate(Person p1, Person p2)
{
return string.Compare(p1.LastName + p1.FirstName, p2.LastName + p2.FirstName);
}
);

 

// Klasse for hver person:
internal class Person
{
private string _FirstName;
public string FirstName
{
	get
	{
		return _FirstName;
	}
	set
	{
		_FirstName = value;
	}
}

private string _LastName;
public string LastName
{
	get
	{
		return _LastName;
	}
	set
	{
		_LastName = value;
	}
}

public Person(string first, string last)
{
	FirstName = first;
	LastName = last;
}
}

Endret av jorn79
Lenke til kommentar

Du kan få en rekke problemer med dette, én ting er at en unicode bokstav ikke nødvendigvis tar en char (UTF-16) en annen ting er at du får fixed størrelse på hvert navn, en tredje er at dette blir fryktelig innviklet i forhold til det som er nødvendig.

 

Koden ser ut til å være skrevet i full narkose :)

 

jorn har vel løst hele problemet ville jeg tro.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...