[C#] String array uit object halen

Pagina: 1
Acties:
  • 1.255 views sinds 30-01-2008
  • Reageer

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Ik ben bezig met C# te laten communiceren met een PLC via OPCServer. Hier zijn COM objecten voor.

Nu heb ik een functie die alle geinstalleerde servers/drivers (om met de PLC te communiceren) op de computer vindt.

C#:
1
2
object oTmpServer;
oTmpServer = this._OPCServer.GetOPCServers("");


Dit werkt, ook heb ik het in VB al werkend gehad, maar dan door het resultaat in een variant te stoppen. De watch op het object geeft ook netjes aan dat er 7 indexes zijn:

code:
1
2
3
4
Watch:
oTmpServer[1] = "servernaam]" string
oTmpServer[2] = "servernaam]" string
oTmpServer[3] = "servernaam]" string


Ik krijg alleen deze strings niet uit het object!
Ik kan de data niet in een string array proppen, omdat ie een object retourneert. Dus ik dacht een string object proberen, maar dat pakt ie ook niet.

Met Convert.[functie] kom ik ook niet verder.

Ook
C#:
1
2
string[] strServers;
strServers = oTmpServer as string[];


bied geen soelaas. Ik kan het niet verder bedenken, wie weet uitkomst?

"Chaos kan niet uit de hand lopen"


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 15:44
Dus als ik je goed begrijp (niet dat je uitleg nou zo onduidelijk is hoor), wil je van het typeloze object een string-array maken? Moet je dan niet gewoon het volgende doe (typecasten)?

C#:
1
2
string[] strServers; 
strServers = (string[])oTmpServer;

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Vergeten te vermelden dat ik die ook al had geprobeerd.

Er treedt dan de volgende fout op:

code:
1
Unable to cast object of type 'System.String[*]' to type 'System.String[]'.

"Chaos kan niet uit de hand lopen"


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Wat returned die method die je aanroept ? Gewoon een object ? :?
Of een object array ?

[ Voor 83% gewijzigd door whoami op 17-01-2007 12:26 ]

https://fgheysels.github.io/


  • Invisible_man
  • Registratie: Juni 2006
  • Laatst online: 15:44
Haal je niet toevallig een pointer op naar het begin van de string-array? Alleen is het werken met pointers in C# nog niet zo makkelijk, .net zet zelf een array niet op achteréén volgende geheugenplaatsen, dus moet je met zogeheten "unsafe" code werken.

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Wat returned die method die je aanroept ? Gewoon een object ?
Of een object array ?
In de watch heeft het object het volgende type: object{ string[] }

"Chaos kan niet uit de hand lopen"


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
C#:
1
2
3
4
5
6
7
8
9
10
11
12
13
string[] strServers;

unsafe
{
string[*] strServersUnsave = this._OPCServer.GetOPCServers("") as string[*];
strServers = new string[strServersUnsave.Length];

for (int i=0; i<strServersUnsave.Length; i++)
{
     strServers[i] = (string)strServersUnsave[i];
}

}

[ Voor 13% gewijzigd door Mastermind op 17-01-2007 12:49 ]


  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
@Mastermind

Helaas, ook dit werkt niet :'(. Het zag er veelbelovend uit.
Ten eerste het sterretje pakt ie niet, zonder sterretje wordt de strServersUnsave array niet gevuld. Ik heb gecontrolleerd of de GetOPCServers("") functie wel iets retourneerde, dit bleek het geval.

Vervolgens loopt de code spaak op .Length, omdat de array leeg is waarschijnlijk.

"Chaos kan niet uit de hand lopen"


  • Mastermind
  • Registratie: Februari 2000
  • Laatst online: 29-11 15:35
Hmm mja heb er zelf niet op die manier mee gewerkt. Misschien staat hier de oplossing:
http://www.codersource.net/csharp_unsafe_code.html

  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Yess!!!

Ik heb het eindelijk voor elkaar :)

C#:
1
2
3
4
5
6
7
8
9
10
11
Array arrServers = this._OPCServer.GetOPCServers(strMachineName) as Array;

string[] strServers = new string[arrServers.Length];
int iIndexCounter = 0;
for (int iCount = arrServers.GetLowerBound(0); iCount <= arrServers.GetUpperBound(0); iCount++)
 {
strServers[iIndexCounter] = arrServers.GetValue(iCount).ToString();
iIndexCounter++;
}

return strServers;


Ik kon hem blijkbaar wel converteren naar een Array-object.

Iedereen thnx!

[ Voor 9% gewijzigd door storeman op 17-01-2007 13:49 . Reden: Spaties verwijderd ]

"Chaos kan niet uit de hand lopen"


  • whoami
  • Registratie: December 2000
  • Laatst online: 00:54
Als je 'm kunt converten naar een Array object, dan kan je denk ik beter de CopyTo method van dat array class gebruiken om 'm in een andere array (string array) te plaatsen ipv er zelf over te gaan loopen.
code:
1
2
3
4
Array arrServers = ....GetOPCServers();
string[] strServers = new string[arrServers.Length];

arrServers.CopyTo (strServers, 0);

https://fgheysels.github.io/


  • storeman
  • Registratie: April 2004
  • Laatst online: 01-12 09:22
Dat zal wel weer een lichte performancewinst opleveren :) en het werkt ook nog!

Ben blij dat het werkt

[ Voor 11% gewijzigd door storeman op 17-01-2007 14:01 ]

"Chaos kan niet uit de hand lopen"

Pagina: 1