Permalänk
Medlem

C# Onåbar kod. Varför?

I en helt vanlig for loop ( for (int i = 0; i < 10; i++) ) säger Error listen till mig att det sista i:et är onåbart... Vad kommer det sig?

Permalänk
Medlem

ta bort () runt loopen så ska det nog gå bra

Visa signatur

Rig: Ryzen 7 5800X - Crucial Ballistix Black 3200 Mhz 32 GB - MSI RTX 4060 TI OC 8 GB - Fractal Design Define C
Laptop: Macbook Pro M1 Max - 32GB - 14"
Media/Server: Raspberry PI 4 - 2 GB - Plex Media Server - KODI - PiHole - qBittorrent - HomeAssistant
Media/Server: NUC - i7-7567U - 32GB - Plex Media Server - Uptime Kuma - mineCraft - qBittorrent - 10 TB Storage
NAS: Zyxel 325v2 - 5 TB

Permalänk
Medlem
Skrivet av Ethnic:

ta bort () runt loopen så ska det nog gå bra

Parenteserna finns inte där i koden, det var ett misslyckat försök att förtydliga mitt inlägg

Permalänk
Medlem
Skrivet av robbannn:

Parenteserna finns inte där i koden, det var ett misslyckat försök att förtydliga mitt inlägg

Okej, jag testade for (int i = 0; i < 10; i++) ; och det fungerar fint för mig iaf.. länka gärna lite mer kod så man kan få se lite mer. Jobbigt när saker och ting spökar

Visa signatur

Rig: Ryzen 7 5800X - Crucial Ballistix Black 3200 Mhz 32 GB - MSI RTX 4060 TI OC 8 GB - Fractal Design Define C
Laptop: Macbook Pro M1 Max - 32GB - 14"
Media/Server: Raspberry PI 4 - 2 GB - Plex Media Server - KODI - PiHole - qBittorrent - HomeAssistant
Media/Server: NUC - i7-7567U - 32GB - Plex Media Server - Uptime Kuma - mineCraft - qBittorrent - 10 TB Storage
NAS: Zyxel 325v2 - 5 TB

Permalänk
Medlem
Skrivet av Ethnic:

Okej, jag testade for (int i = 0; i < 10; i++) ; och det fungerar fint för mig iaf.. länka gärna lite mer kod så man kan få se lite mer. Jobbigt när saker och ting spökar

Här kommer metoden som jag använder loopen i. När du läser koden ska du veta att jag är en total nybörjare. Så kom gärna med tips på övrig kod!

public bool PersonalNumberControl() { Type x = typeof(System.Int32); if (personalNumber.Length != 10) { return false; } else if (personalNumber.GetType() != x) { return false; } else { char[] personalStringVektor = personalNumber.ToCharArray(); for (int i = 0; i < 10; i++) { if (i == 0 || i == 2 || i == 4 || i == 6 || i == 8) { int tal = (int)Char.GetNumericValue(personalStringVektor[i]); tal *= 2; string talString = tal.ToString(); if (talString.Length > 1) { char[] talStringVektor = talString.ToCharArray(); int talEtt = (int)char.GetNumericValue(talStringVektor[0]); int talTvå = (int)char.GetNumericValue(talStringVektor[1]); controlNumber += talEtt + talTvå; } else { controlNumber += tal; } } else { int tal = (int)Char.GetNumericValue(personalStringVektor[i]); controlNumber += tal; } controlNumber /= 10; if (controlNumber != personalStringVektor[9]) { return false; } return true; } return true; }

Permalänk
Medlem

Använd CODE-tags för att formatera kod.

edit: testa att lägga till en } i slutet.

Permalänk
Medlem
Skrivet av magnusvmt:

Använd CODE-tags för att formatera kod.

edit: testa att lägga till en } i slutet.

Ska tänka på CODE-tags i framtiden! Tack.

Det hjälpte inte att lägga till en } i slutet...

Permalänk
Medlem

Vettefan vad det är du försöker göra, men du returnar på första iterationen av for-loopen.
Det är alltså just nu garanterat att loopen aldrig kör mer än en iteration.

Visa signatur

Chassi: DAN A4 | MB: ASUS VI Impact | GPU: Titan X | CPU: 4770K | RAM: 2x8GB Corsair Vengeance | SSD: Samsung 830 512GB | Skärm: ASUS Swift IPS

Permalänk
Medlem

Kan förklara lite bättre vad du gör fel. Grejen är att funktionen är till för att returna en bool, och när du väl gör det så får man ju svaret (true/false) och därför körs inget mer av funktionen.

Ta det här exemplet:

bool hehu() { for(int i = 0; i < 10; i++) { return true; MessageBox.Show("Test"); } }

första iterationen kommer börja, men returna direkt.
Då har funkionen fyllt sitt syfte, och ingen mer kod körs.
MessageBox.Show kommer aldrig köras.

Visa signatur

Chassi: DAN A4 | MB: ASUS VI Impact | GPU: Titan X | CPU: 4770K | RAM: 2x8GB Corsair Vengeance | SSD: Samsung 830 512GB | Skärm: ASUS Swift IPS

Permalänk
Medlem
Skrivet av xinux:

Vettefan vad det är du försöker göra, men du returnar på första iterationen av for-loopen.
Det är alltså just nu garanterat att loopen aldrig kör mer än en iteration.

Hehe ne jag förstår knappt själv! Jag är ju som sagt nybörjare och försöker trolla med de få "verktyg" jag lärt mig använda. Det jag vill göra i metoden är att kontrollera ett personnummer, först så att det består av siffror. Sen ska jag även kontrollera att personnummret är giltigt med hjälp av en algoritm som ser ut så här:

21-Algorithm
Correct check sum.
The control sum is calculated by multiplying every digit in the personal with alternately 2 and 1 starting with 2.
After that you have calculated the sum of all digits (18 = 9 for example), you get the check sum.
Divide the check sum with 10. If there is a rest, then the personal number is wrong.
Example:
Personal number: 720310-1212
Check sum:
7 * 2 = 14 -> 1 + 4
2 * 1 = 2 -> 2
0 * 2 = 0 -> 0
3 * 1 = 3 -> 3
1 * 2 = 2 -> 2
0 * 1 = 0 -> 0
1 * 2 = 2 -> 2
2 * 1 = 2 -> 2
1 * 2 = 2 -> 2
2 * 1 = 2 -> 2
1 + 4 + 2 + 0 + 3 + 2 + 0 + 2 + 2 + 2 + 2 = 20
20 / 10 = 2 OK!

Permalänk
Medlem
Skrivet av xinux:

Kan förklara lite bättre vad du gör fel. Grejen är att funktionen är till för att returna en bool, och när du väl gör det så får man ju svaret (true/false) och därför körs inget mer av funktionen.

Ta det här exemplet:

bool hehu() { for(int i = 0; i < 10; i++) { return true; MessageBox.Show("Test"); } }

första iterationen kommer börja, men returna direkt.
Då har funkionen fyllt sitt syfte, och ingen mer kod körs.
MessageBox.Show kommer aldrig köras.

Jag är helt med på vad du menar! Jag ska kolla igenom min kod och se hur jag kan lösa det. Och om jag kan göra koden mer överskådlig på något sätt. Jag blir ju yr bara av att titta på koden!

Permalänk
Medlem
Skrivet av robbannn:

Jag är helt med på vad du menar! Jag ska kolla igenom min kod och se hur jag kan lösa det. Och om jag kan göra koden mer överskådlig på något sätt. Jag blir ju yr bara av att titta på koden!

Vad anväder du för editor att skriva koden i? Det blir mycket tydligare för dig själv om du är noga med att kontrollera att varje if, else och for-loop börjar med "{" samt slutar med "}". Glömmer man detta i koden kan man få konstiga errors.
Använd tab för koden som finns innanför dessa.

Visa signatur

| ITX | 5800X3D | RTX 3800

Permalänk
Medlem
Skrivet av matsut:

Vad anväder du för editor att skriva koden i? Det blir mycket tydligare för dig själv om du är noga med att kontrollera att varje if, else och for-loop börjar med "{" samt slutar med "}". Glömmer man detta i koden kan man få konstiga errors.
Använd tab för koden som finns innanför dessa.

Jag använder Visual C# Express. Måsvingarna är jag med på, det ska jag inte ha missat någon. Det är väl det jag placerar innanför dem som jag måste öve på
Jag funderar på om det kan vara bra att bryta upp metoden i fler metoder. Eftersom jag gör ett antal olika kontroller av personnumret i det här fallet kanske det kan vara en god idé? Sen känns det som att det borde finnas något smidigare sätt att lösa kontrollerna på, det blir lite väl mycket ändring av typer hit o dit...
Alla små tips som kan effektivisera koden uppskattas mycket!

Permalänk
Medlem
Skrivet av robbannn:

Jag använder Visual C# Express. Måsvingarna är jag med på, det ska jag inte ha missat någon. Det är väl det jag placerar innanför dem som jag måste öve på
Jag funderar på om det kan vara bra att bryta upp metoden i fler metoder. Eftersom jag gör ett antal olika kontroller av personnumret i det här fallet kanske det kan vara en god idé? Sen känns det som att det borde finnas något smidigare sätt att lösa kontrollerna på, det blir lite väl mycket ändring av typer hit o dit...
Alla små tips som kan effektivisera koden uppskattas mycket!

Missade du att kopiera en till första koden du postade då? För den koden jag såg saknade en måsvinge som stängde funktionen.

Permalänk
Medlem
Skrivet av magnusvmt:

Missade du att kopiera en till första koden du postade då? För den koden jag såg saknade en måsvinge som stängde funktionen.

Ja det måste jag gjort. Jag har nu fått min metod att fungera som jag önskar.

Permalänk
Medlem

Lite kod till dig...

Tjena här får du lite kod för det du vill göra...jag har inte lagt ner en massa tid på det flyger i alla fall...
Jag packade allting i en klass, satte namespacet verifiers på den så kan du ju samla dina verifiers där

Here we go:

using System;
using System.Collections.Generic;

namespace verifiers
{
public class PersonalNumberVerifier
{
//Method to calculate is personalnumber is valid
public bool VerifyPersonalNumber(Int64 personalNumber)
{
int multiplier = 2;
int carrier = 0;

foreach (int i in GetIntArray(personalNumber))
{
if (multiplier == 2)
{
if (i * multiplier > 9)
{
carrier = carrier + GetSplitAndSum(i * multiplier, carrier);
multiplier = 1;
}
else
{
carrier = carrier + i * multiplier;
multiplier = 1;
}
}

else
{
if (i * multiplier > 9)
{
carrier = carrier + GetSplitAndSum(i * multiplier, carrier);
multiplier = 2;
}
else
{
carrier = carrier + i * multiplier;
multiplier = 2;
}
}
}

//Check if divisible by ten
if (carrier % 10 == 0)
{
return true;
}
else
{
return false;
}
}

//Split Int64 into an Array of Int64´s and add the members together
private int GetSplitAndSum(int numberToProcess, int carrierSum)
{
int carrierSummarized = carrierSum;
foreach (int y in GetIntArray(numberToProcess))
{
carrierSummarized = carrierSummarized + y;
}
return carrierSummarized;
}

//Split Int64 into an Array of Int64´s
private Int64[] GetIntArray(Int64 num)
{
List<Int64> listOfInts = new List<Int64>();
while (num > 0)
{
listOfInts.Add(num % 10);
num = num / 10;
}
listOfInts.Reverse();
return listOfInts.ToArray();
}
}
}

//Slut på klassen

Såhär instansierar du (antar att du redan vet hur, men slänger in det ändå):

bool verificationValue = new bool();
verificationValue= personalNumberVerifier.VerifyPersonalNumber(personnummer);

personnummer i parantesen ovan ersätter du förståss med det personnummer du skall kolla...

Hoppas det hjälper något...

tänkte lite vidare du får kasta in lite try catch block för att fånga eventuella fel och hantera dem, det måste du göra i hela din kodmassa så du bygger in undantagshantering direkt så att applikationen du bygger kan hantera sådana situation och act accordingly istället för att cracha...

have a nice one ....

Permalänk
Medlem
Skrivet av mrCrayon:

Tjena här får du lite kod för det du vill göra...jag har inte lagt ner en massa tid på det flyger i alla fall...
Jag packade allting i en klass, satte namespacet verifiers på den så kan du ju samla dina verifiers där

Hoppas det hjälper något...

tänkte lite vidare du får kasta in lite try catch block för att fånga eventuella fel och hantera dem, det måste du göra i hela din kodmassa så du bygger in undantagshantering direkt så att applikationen du bygger kan hantera sådana situation och act accordingly istället för att cracha...

have a nice one ....

Tack som bara den! Jag ska kika igenom koden noga och försöka lära mig så mycket jag kan. Jag är jätte tacksam!

Permalänk
Medlem

Problemet är

if (controlNumber != personalStringVektor[9]) { return false; } return true; <-- Denna

Koden ser ut såhär

for (int i=0; i<10; i++) { ...... return true; }

Det betyder att i++ kommer aldrig att kallas eftersom i första loopen av din for så kommer return kallas, och programmet kommer avsluta funktionen.

Jag skulle gissa att koden ska se ut något liknande detta

if (controlNumber != personalStringVektor[9]) { return false; } else { return true; }

Edit: Såg att någon redan svarat.

Permalänk
Medlem

No probs...behöver du hjälp med något så hör av dig...
Detta är ett bra ställe både för tutorials och inspiration:
http://msdn.microsoft.com/sv-se/ms348103