Toon posts:

[C#/CF.Net] kan geen items aan array toevoegen *

Pagina: 1
Acties:
  • 693 views

Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
hi

ik ben met een projectje bezig in C,
ik denk dat je wel direct zal zien wat het probleem is, maar aan de hand
van online tutorials raak ik er niet uit hoe het dan wel moet gebeuren

code:
for (int i = 0; i < werkfiches.Count(); i++)
{
Bestand bestand = new Bestand(werkfiches[i]);
if (cbxNamen.Items.Contains(bestand.getPloegleider()))
{ }
else
{
cbxNamen.Items.Add(bestand.getPloegleider());
}
tuinenGoemaere.addBestand((Bestand)bestand.);
}

de laaste lijn voeg het bestand gewoon toe in een arraylist, en hier zit
het probleem

Het probleem is, dat uiteindelijk in mijn arraylist, alle items
verwijzingen naar het laatste bestand dat ik heb toegevoegd.
new Bestand reserveert geen nieuwe geheugenruimte, maar overschrijft de
ruimte voorzien voor het eerste object, waardoor ze uiteindelijk
allemaal dezelfde waarde bevatten
ik veronderstel dat het probleem ligt aan shallow copy vs deep copy, en
naar ik al gevonden heb op google, heb ik een .clone() nodig.
Maar wat moet er in die functie clone() gebeuren? ik heb ook al zoveel
verschillende mogelijke implementaties gezien (met een copy, met een
serializer, ...) dat ik niet kan achterhalen welke manier ik nodig heb

hoop dat je mij een beetje op weg kan helpen, en bedankt op voorhand

thx

EDIT1: Hij voegt alles correct toe aan de array, maar iedere keer dat ik een volgende file neem overschrijft hij de geheugenruimte van de eerst array. Dit terwijl de verwijzing in de arraylist goed blijft.

EDIT2: public void addBestand(Bestand newBestand)
{
bestanden.Add(newBestand);
}

EDIT3: dit staat bovenaan: static ArrayList bestanden = new ArrayList();

[ Voor 12% gewijzigd door Verwijderd op 22-04-2009 12:02 ]


Acties:
  • 0 Henk 'm!

  • Grijze Vos
  • Registratie: December 2002
  • Laatst online: 28-02 22:17
Laat de functie addBestand() eens zien. (En dit is geen C lijkt me, is het C#?)

[ Voor 33% gewijzigd door Grijze Vos op 22-04-2009 11:52 ]

Op zoek naar een nieuwe collega, .NET webdev, voornamelijk productontwikkeling. DM voor meer info


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:30

Haan

dotnetter

Het ziet er inderdaad uit als C#, is nogal een verschil tov C ;)

Vertel ook eens wat je precies wilt bereiken, want dat is me ook niet helemaal duidelijk.

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 22 april 2009 @ 11:40:
hi

ik ben met een projectje bezig in C,
ik denk dat je wel direct zal zien wat het probleem is, maar aan de hand
van online tutorials raak ik er niet uit hoe het dan wel moet gebeuren
Ik vraag me inderdaad ook sterk af of het wel over C gaat en niet over bijvoorbeeld C#.
code:
...
zou je dit in code tags willen zetten, dan is het wat leesbaarder ( Hoe post je code? / Hoe gebruik je de code tag? )
de laaste lijn voeg het bestand gewoon toe in een arraylist, en hier zit
het probleem

Het probleem is, dat uiteindelijk in mijn arraylist, alle items
verwijzingen naar het laatste bestand dat ik heb toegevoegd.
new Bestand reserveert geen nieuwe geheugenruimte, maar overschrijft de
ruimte voorzien voor het eerste object, waardoor ze uiteindelijk
allemaal dezelfde waarde bevatten
new Bestand() reserveert wel degelijk nieuwe ruimte. Ik denk dat je bedoeld dat je werkfiches[i] meegeeft, en dat die niet gekopieerd worden? Wil je een kopie van werkfiches maken?

Er is natuurlijk ook een groot verschil tussen een Array en een ArrayList. Een array is een lijst van objecten die later niet meer van grote veranderd kan worden. Een ArrayList is een lijst van objecten die dynamisch van grote is ( Al word intern gewoon een array gebruikt, die als dat nodig is vervangen word door een grotere array )

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Ja idd het is in C#

En voor een windows mobile standard phone. Dus CF.net

Het is natuurlijk een arraylist sorry voor de missers

Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Anders ga je ook even in op de andere opmerkingen/vragen die er in het topic gemaakt worden.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

kzou misschien beter zelf reageren aangezien ik degene ben die het programma aan het maken ben...

ben dus een programmatje aan het maken voor nen maat die tuinonderhoudbedrijf heeft, dat ie werkfiches kan aanmaken op zijn pc (reeds gebeurd), en dat deze automatisch gesyncroniseerd wordt met hun pda.

aangezien visual basic mobile geen late binding ondersteunt, ben ik wel genoodzaakt om C (of C# - i don't know) te gebruiken; ben van opleiding programmeur maar voornamelijk java en VB

nu, het programma start op, opent de map met werkfiches, en haalt voor iedere werkfiche de bestandsnaam op, en maakt een nieuw object "bestand" aan, waarin de filename opgesplits wordt in aparte onderdelen (naam, datum, locatie, ...) en voegt dit object toe aan een arraylist

probleem is dat uiteindelijk alle items in de arraylist, dezelfde waarde bevatten (de waarde van de laatst geopende file)

na een tijdje op google te zoeken ben ik er achter gekomen dat ik hoogstwaarschijnlijk eerst een deep copy (=.clone()?) moet maken (zodat gegevens naar nieuwe geheugenlocatie gekopieerd worden) alsvorens het toe te voegen aan de arraylist.

maar het is mij totaal niet duidelijk hoe ik die .clone() moet implementeren. heb al voorbeelden gevonden met .copy(), al voorbeelden waar ze een serializer gebruiken, ...ik loop hier een beetje verloren

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 22 april 2009 @ 13:01:
aangezien visual basic mobile geen late binding ondersteunt, ben ik wel genoodzaakt om C (of C# - i don't know) te gebruiken; ben van opleiding programmeur maar voornamelijk java en VB
Euh; da's nogal een verschil. C of C# :X
En als je thuis bent in Java dan moet C# toch een peuleschil zijn; ze zijn behoorlijk gelijkend... En VB (uitgaande van VB.Net) is al helemaal zo goed als identiek op de syntax na. Of je stamt nog uit het VB6 of eerder tijdperk; in which case wat bijscholing geen kwaad kan ;)

Als je arraylist allemaal dezelfde waardes bevat doe je toch echt iets fout; als je nou eens gewoon de relevante(!!!!) code toont waar je die arraylist vult; dan kunnen we meer dan alleen gissen ;)

[ Voor 30% gewijzigd door RobIII op 22-04-2009 13:09 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Volgens mij heb je nog niet echt een goed idee waar je mee bezig bent.

de new operator reserveert gewoon een stukje geheugen voor een (in dit geval)Bestand instance en roept daarbij de constructor aan om de instance te initializeren. Hier heb je dus nog niks met Clone o.i.d. te maken. Zeker aangezien je met strings werkt ( die Imutable zijn ), lijkt het me in dit geval niet relevant. Maar aan je summiere voorbeeld kunnen we nog niet zo veel zien.

De volgende code maakt bijvoorbeeld een List met Bestanden aan de hand van de files in een directory
C#:
1
2
3
4
5
List<Bestand> myList = new List<Bestand>();
foreach (string path in Directory.GetFiles(myPath))
{
    myList.Add( new Bestand(path));
}

Waar bestand als volgt gedefineerd is.
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Bestand
{
    private readonly string dirName;
    private readonly string fileName;

    public Bestand(string path)
    {
        dirName = Path.GetDirectoryName(path);
        fileName = Path.GetFileName(path);
    }

    public string DirName
    {
        get { return dirName; }
    }

    public string FileName
    {
        get { return fileName; }
    }
}

Je zult dus wat specifieker in je vraag moeten zijn. Ik snap namenlijk niet precies waar je de mist in gaat.

[ Voor 13% gewijzigd door Woy op 22-04-2009 13:11 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

code nog eens posten:

eerst de functie die de files inleest
private void vulNamen()
{
String[] werkfiches = Directory.GetFiles("\\My Documents\\Tuinen Goemaere\\Werkfiches\\");

for (int i = 0; i < werkfiches.Count(); i++)
{
Bestand bestand = new Bestand(werkfiches[i]);
if (cbxNamen.Items.Contains(bestand.getPloegleider()))
{ }
else
{
cbxNamen.Items.Add(bestand.getPloegleider());
}
tuinenGoemaere.addBestand(bestand);
}
cbxNamen.SelectedValueChanged += new EventHandler(cbxNamen_SelectedValueChanged);
}
constructor van klasse bestand
public Bestand(String newBestand)
{
bestand = newBestand;
int slashes = bestand.LastIndexOf("\\");
slashes += 1;
int eindindex = bestand.Length - slashes;
bestandsnaam = bestand.Substring(slashes, eindindex);
bestandsString = bestandsnaam.Split();
}
bestanden toevoegen aan arraylist
eerst arraylist aanmaken
static ArrayList bestanden = new ArrayList();
functie om toe te voegen
public void addBestand(Bestand newBestand)
{
bestanden.Add(newBestand);
}

[ Voor 74% gewijzigd door Verwijderd op 22-04-2009 13:19 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Ook voor jou geld de opmerking: Hoe post je code? / Hoe gebruik je de code tag?

Verder is er niks in het stukje code wat ervoor zorgt dat je allemaal dezelfde instances in je ArrayList krijgt. Misschien dat je een denkfout maakt met het feit dat je ArrayList als static gedefineerd is en je AddBestand aanroept op een instance van een object.

Het is misschien ook een idee om eens te kijken naar: Debuggen: Hoe doe ik dat?

Als je gewoon een breakpoint zet in je AddBestand method kun je gewoon achterhalen hoe het komt dat die blijkbaar telkens met dezelfde instance aangeroepen word.

[ Voor 70% gewijzigd door Woy op 22-04-2009 13:22 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 22:43
Ik zit ook nog even te kijken naar de aanroep van je functie:

C#:
1
tuinenGoemaere.addBestand((Bestand)bestand.)

Hier in zet je voor de variabele bestand nog eens een typecast naar het type Bestand, echter is de variabele bestand al van het type Bestand en is de typecast overbodig (maar zal wel werken en is niet de oorzaak van je probleem in dit geval).

Edit: die punt die achter bestand staat hoort daar ook niet lijkt mij. Maar daar zal het ook niet mee compileren (heb ik even snel getest).

[ Voor 16% gewijzigd door Invisible_man op 22-04-2009 13:22 ]


Acties:
  • 0 Henk 'm!

  • Haan
  • Registratie: Februari 2004
  • Laatst online: 19:30

Haan

dotnetter

Overigens lijkt het er erg op dat je met de Bestand klasse, het wiel opnieuw aan het uitvinden bent.. Tip: kijk eens naar de File class uit het .Net framework ;) (of is die er niet in het compact framework?)

Kater? Eerst water, de rest komt later


Acties:
  • 0 Henk 'm!

Verwijderd

^heb al beetje zitten prutsen in de code, en had al functie clone() toegevoegd, en als ik tuinengoemaere.addbestand(bestand.clone()) deed, maakte hij van zijn oren dat hij type casting nodig had
daarmee dat die er nog bij staat, dat punt staat er inderdaad ook nog overbodig

about debuggen
heb ik al gedaan, eerste file werkt perfect, voeg een tweede toe, en opeens heeft de eerste dezelfde waardes als de 2e...


en kan wel zijn dat ik het wiel opnieuw aan het uitvinden ben, maar als ik voor alles moet opzoek of het toevallig nog niet bestaat, duurt het langer dan gewoon zelf te schrijven

[ Voor 21% gewijzigd door Verwijderd op 22-04-2009 13:29 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 22 april 2009 @ 13:27:
about debuggen
heb ik al gedaan, eerste file werkt perfect, voeg een tweede toe, en opeens heeft de eerste dezelfde waardes als de 2e...
Dan moet je toch iets verder debuggen, want dingen gebeuren niet "opeens".

Als ik je code nog eens nakijk, denk ik dat je Bestand class ongeveer hetvolgende hebt staan
C#:
1
2
3
private static string bestand;
private static string bestandsnaam;
private static string bestandsString;

Als dat het geval is zul je eens goed op moeten zoeken wat static betekend.

offtopic:
PS: [quote] is niet hetzelfde als [code]

[ Voor 35% gewijzigd door Woy op 22-04-2009 13:35 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 22:43
Heb je de inhoud van:

C#:
1
werkfiches[]


wel eens gedebugged? Als het daar namelijk al fouten in zitten zal de rest ook niet goed gaan lijkt mij.

Maar kan je de klasse Bestand eens in zijn geheel posten (mits deze niet al te groot is natuurlijk en met gebruik makend van de code tags)?

[ Voor 30% gewijzigd door Invisible_man op 22-04-2009 13:35 ]


Acties:
  • 0 Henk 'm!

Verwijderd

ok....

kan het dan zijn dat er hier fout in zit (wat mij eigenlijk zou verbazen)
private void cbxNamen_SelectedValueChanged(object sender, System.EventArgs e)
{
for (int i = 0; i < tuinenGoemaere.getAantalBestanden(); i++)
{
String ploegleider = tuinenGoemaere.getPloegleider(i);
if (ploegleider.Equals((String)cbxNamen.Text))
{
cbxWerkfiches.Items.Add(tuinenGoemaere.getKlantNaam(i));
}
}
}
het is hier dat ik telkens de waardes van het laatste bestand weerkrijg...

[ Voor 6% gewijzigd door Verwijderd op 22-04-2009 13:37 ]


Acties:
  • 0 Henk 'm!

Verwijderd

klasse bestand
using System;
using System.Linq;
using System.Collections.Generic;
using System.Text;

namespace TuinenGoemaere_PDA
{
class Bestand : ICloneable
{
static String bestand;
static String bestandsnaam;
static String[] bestandsString;

public Bestand(String newBestand)
{
bestand = newBestand;
int slashes = bestand.LastIndexOf("\\");
slashes += 1;
int eindindex = bestand.Length - slashes;
bestandsnaam = bestand.Substring(slashes, eindindex);
bestandsString = bestandsnaam.Split();
}

public String getPloegleider()
{
return bestandsString[0];
}

public String getKlantNaam()
{
String naam = bestandsString[2];
Boolean found = false;
for (int i = 3; i < bestandsString.Length; i++)
if (bestandsString[i] != "-" && found == false)
naam = naam + " " + bestandsString[i];
else
found = true;


return naam;
}

}
}
deze wordt wel nog uitgebreid naarmate ik meer functionaliteiten nodig zal hebben als het programma vordert...

(man...replies komen hier wel snel, zelf geen tijd om mijn post aan te passen...Tnx!)

[ Voor 6% gewijzigd door Verwijderd op 22-04-2009 13:40 ]


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 22:43
Verwijderd schreef op woensdag 22 april 2009 @ 13:36:
ok....

kan het dan zijn dat er hier fout in zit (wat mij eigenlijk zou verbazen)

[...]


het is hier dat ik telkens de waardes van het laatste bestand weerkrijg...
Dat is niet de klasse Bestand, dat is één of andere eventhandler.

Edit, nu staat hij er wel.

Edit2, zoals Woy al vermoede, maak je gebuik van static, haal die eens weg (en zoek eens uit wat dat inhoud) en probeer het nog eens.

[ Voor 19% gewijzigd door Invisible_man op 22-04-2009 13:41 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Zoals ik dacht moet je inderdaad eens opzoeken wat static members zijn.
[google=static keyword c#]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

Verwijderd

Woy schreef op woensdag 22 april 2009 @ 13:39:
Zoals ik dacht moet je inderdaad eens opzoeken wat static members zijn.
[google=static keyword c#]
static = only accessible from whitin the class? ie can't be accessed by another class?

zoals private in vb?

als ik thuis ben ga ik zeker eens proberen zonder static, maar ben nu op werk en mijnen baas zou het ni echt wijs vinden moestek hier mee bezig zijn

tnx for the help!

[ Voor 24% gewijzigd door Verwijderd op 22-04-2009 13:44 ]


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op woensdag 22 april 2009 @ 13:41:
[...]
static = only accessible from whitin the class? ie can't be accessed by another class?
Nee dat is ook in C# gewoon private ( en er zijn nog meer [google=access modifiers] )

[ Voor 15% gewijzigd door Woy op 22-04-2009 13:43 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 22:43
Verwijderd schreef op woensdag 22 april 2009 @ 13:41:
[...]


static = only accessible from whitin the class? ie can't be accessed by another class?
Nee, dat is private. Static is heel wat anders.

[ Voor 12% gewijzigd door Invisible_man op 22-04-2009 13:42 ]


Acties:
  • 0 Henk 'm!

Verwijderd

nu dak hier toch al nen topic hebben, kan der mij eigenlijk iemand het grote verschil uitleggen tussen C++ en C#? waarom hebben ze er 2 ontwikkeld?

[ Voor 13% gewijzigd door Verwijderd op 22-04-2009 14:06 ]


Acties:
  • 0 Henk 'm!

  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 22:43
Verwijderd schreef op woensdag 22 april 2009 @ 14:06:
nu dak hier toch al nen topic hebben, kan der mij eigenlijk iemand het grote verschil uitleggen tussen C++ en C#? waarom hebben ze er 2 ontwikkeld?
Kijk hier eens: http://nl.wikipedia.org/wiki/C_sharp

Acties:
  • 0 Henk 'm!

  • RobIII
  • Registratie: December 2001
  • Niet online

RobIII

Admin Devschuur®

^ Romeinse Ⅲ ja!

(overleden)
Verwijderd schreef op woensdag 22 april 2009 @ 14:06:
nu dak hier toch al nen topic hebben, kan der mij eigenlijk iemand het grote verschil uitleggen tussen C++ en C#? waarom hebben ze er 2 ontwikkeld?
Komaan... Dat zoek je maar mooi zelf uit. GoT is geen "hou mijn handje eens vast"-forum. Ik vind het to be honest wel grappig dat je jezelf programmeur noemt maar de verschillen noch de bestaansrechten van beiden niet kunt uitvogelen. "Ze" hebben er geen "2 ontwikkeld"...

En probeer eens een beetje ABN te schrijven; wat je nu doet leest nogal vervelend...

[ Voor 23% gewijzigd door RobIII op 22-04-2009 14:16 ]

There are only two hard problems in distributed systems: 2. Exactly-once delivery 1. Guaranteed order of messages 2. Exactly-once delivery.

Je eigen tweaker.me redirect

Over mij


Acties:
  • 0 Henk 'm!

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
C# en C++ zijn 2 totaal verschillende talen ( die qua syntax wel een hoop overeenkomsten hebben ). Het is niet doenlijk om hier uit te gaan leggen wat de verschillen allemaal zijn. En vragen waarom 'ze' er 2 ontwikkeld hebben is ook een beetje een vreemde vraag. Dat is hetzelfde als vragen waarom er zowel VB als PHP ontwikkeld is.

Als je wilt weten wat het verschil is dan zul je toch zelf wat meer onderzoek op internet moeten doen.

Wat RobIII dus ook zegt.

[ Voor 3% gewijzigd door Woy op 22-04-2009 14:17 ]

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”

Pagina: 1

Dit topic is gesloten.