Toon posts:

[c#] Array van 1 column van een multidimensional array

Pagina: 1
Acties:

Verwijderd

Topicstarter
Ik heb een multidimensional array van 7 bij (bordArray)

Nou wil ik alle columns van deze array aflopen met een indexOf. Maar ik kan echt nergens vinden hoe ik een array kan maken van 1 colum...

Ik wou dit proberen:
code:
1
yCoor = indexOf(bordArray[,count])


waar count een int is die telkens wordt opgehoogd om zo alle 7 colums door te lopen.

  • whoami
  • Registratie: December 2000
  • Laatst online: 23:28
Je wil, als ik het goed heb, gewoon doorheen je hele array lopen ?

https://fgheysels.github.io/


Verwijderd

Topicstarter
jah...

even grafisch:

0 0 0 0 0 0 0
1 0 2 2 0 1 1
1 1 2 2 1 2 1
2 3 2 2 1 2 1
2 1 1 1 1 2 1
1 1 1 2 2 2 1

ik wil dus elke Column individueel bekijken... Dus eerst:
0
1
1
2
2
1

daar een indexOf op loslaten, en dan de volgende...

Is dat duidelijk zo?? :?

  • riezebosch
  • Registratie: Oktober 2001
  • Laatst online: 23-04 14:31
Ik weet niet wat je met "indexOf" wilt doen, maar als je er doorheen loopt weet je toch ook al op welke index je zit (mits je het met een for-loopje doet)?

Canon EOS 400D + 18-55mm F3.5-5.6 + 50mm F1.8 II + 24-105 F4L + 430EX Speedlite + Crumpler Pretty Boy Back Pack


Verwijderd

Topicstarter
Het doel is de 'coordinaten' te krijgen in het rooster van de laatste instance of "0".

Het is namenlijk 4 op een rij, en de nullen zijn de plekken waar geen steen ligt, dan is het wat makkelijker voor te stellen.

Hier mijn huidige (lelijke) oplossing, misschien wordt het dan duidelijk wat ik wil doen....

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
        for (int i = 0;i < 7; i++)
            {
                for (int q = 0;q < 7; q++)
                {
                    tempCoor[q] = bordArray[q,i];
                }
                yCoor = Array.LastIndexOf(tempCoor,0);
                avCoords[i] = yCoor;
            }
            
        count = 0;  
        foreach (int num in avCoords)
            {
                System.Console.WriteLine(num.ToString()+"x"+count.ToString());
                count++;
            }

[ Voor 13% gewijzigd door Verwijderd op 11-08-2005 18:25 ]


  • EfBe
  • Registratie: Januari 2000
  • Niet online
Je kunt beter een array van een array van ints maken, dan kun je de column ophalen op pos X en dan direct daarop indexof op loslaten. Deze arrays heten 'Jagged arrays':
C#:
1
2
3
4
5
int[][] coords = new int[numberOfCols][];
for(int i=0;i<numberOfCols;i++)
{
    coords[i] = new int[numberOfRows];
}

en dan kun je doen:
int lastIndex = Array.LastIndexOf(coords[columnIndex], 0)

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


Verwijderd

Topicstarter
Ja dat had ik ook bedacht...
Maar dat wou ik liever niet doen, want uiteindelijk was het doel om dit op de RCX van lego mindstorms uit te voeren, en dan is het beter om zo min mogelijk variabelen te hebben...

Maar misschien dat ik het toch maar zo doe idd, want dat scheelt wel wat code...

  • EfBe
  • Registratie: Januari 2000
  • Niet online
waarom zou een jagged array meer variabelen opleveren? :?

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
je kan toch makkelijk zelf een functie maken die dat doet? LastIndexOf loopt ook gewoon de hele array van achter tot voren langs lijkt mij. dus dan kan je gewoon zoiets doen

C#:
1
2
3
4
5
6
7
8
9
public int LastIndexOf( object[,] array, int col, object val )
{
    for( int i = array.GetUpperBound( 1 ) ; i >=0; i-- )
    {
        if( array[ col, i ].Equals( val ) )
            return i;
    }
    return -1;
}

“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.”


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
EfBe schreef op vrijdag 12 augustus 2005 @ 09:05:
waarom zou een jagged array meer variabelen opleveren? :?
Intern zullen er waarschijnlijk wel meer refferences zijn aangezien een Multidimensionale array gewoon als een normale array geimplementeerd kan worden en bij een Jagged array krijg je allemaal losse arraytjes. Maar denk dat het niet zoveel uithaalt voor de performance

“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.”


  • EfBe
  • Registratie: Januari 2000
  • Niet online
rwb schreef op vrijdag 12 augustus 2005 @ 09:14:
[...]

Intern zullen er waarschijnlijk wel meer refferences zijn aangezien een Multidimensionale array gewoon als een normale array geimplementeerd kan worden en bij een Jagged array krijg je allemaal losse arraytjes. Maar denk dat het niet zoveel uithaalt voor de performance
Dat is natuurlijk puur giswerk, aangezien een Array in de CLR een internal object oplevert, als in: niet een .NET object, en het dus geen moer uitmaakt waar je het op draait. (wat heeft lego mindstorms dan voor limiet op variables? Je praat toch tegen de CLR aan!)

[ Voor 13% gewijzigd door EfBe op 12-08-2005 11:43 ]

Creator of: LLBLGen Pro | Camera mods for games
Photography portfolio: https://fransbouma.com


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Dat bedoel ik ook niet. Ik heb geen flauw benul wat lego mindstorms voor limieten heeft. Heb het nog nooit gezien dus weet ik verder ook niks vanaf.

Ging er alleen vanuit dat hij zegt dat hij zo min mogenlijk "Variables" wil hebben voor de performance. Een Multi dimensionale array levert een object op en een Jagged Array levert meer objecten op aangezien je een Array met Array objecten hebt.
Ik zeg er meteen ook al bij dat dat waarschijnlijk helemaal niet zoveel uit zal maken. Maar nogmaals ik heb totaal geen kennis van lego mindstorms.

“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.”


Verwijderd

Topicstarter
He bedankt voor alle replies...

Lego mindstorms heeft, afhankelijk van de firmware, een maximum aantal variablen van rond de 30 a 40 ofzo dacht ik. ben zelf ook geen expert. Het plan is om deze code in een andere taal te schrijven (mind storms ondersteund geen c#), maar dit is dus gewoon om de opbouw van de code te hebben, dan is het alleen een kwestie van een beetje aanpassen. En het is / was een oefening voor mij om een beetje met c# te spelen.
waarom zou een jagged array meer variabelen opleveren? :?
Ik bedacht me net dus ook dat een jagged array in principe ook maar 1 array is, maar er werd dus net gezegd:
Intern zullen er waarschijnlijk wel meer refferences zijn aangezien een Multidimensionale array gewoon als een normale array geimplementeerd kan worden en bij een Jagged array krijg je allemaal losse arraytjes. Maar denk dat het niet zoveel uithaalt voor de performance
Dus dat brengt me weer aan het twijfelen.

Ik heb dus zelf al een functie gemaakt die de hele array colum voor colum doorloopt, maar dat is natuurlijk een beetje zonde. De vraag was dus ook eigenlijk of je niet direct die column uit die mutidem array kan halen, maar ik krijg het gevoel dat dat niet kan....

Hoe dan ook, ik ben het er mee eens dat het in c# handiger is om een jagged array te gebruiken, dus dat ga ik dan denk ik ook doen, en dan kan ik die andere functie eens op mindstorms proberen, kijken of ik verschil merk...

  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Verwijderd schreef op vrijdag 12 augustus 2005 @ 14:51:
Lego mindstorms heeft, afhankelijk van de firmware, een maximum aantal variablen van rond de 30 a 40 ofzo dacht ik.
Hoe bedoel je variabelen? een variabele is niet meer als een labeltje waarmee je een object aan kan spreken. Is het niet gewoon zo dat je alleen een beperkt geheugen beschikbaar hebt? en dat je dus afhankelijk van hoe groot je objecten zijn er maar een klein aantal kwijt kunt?
Het plan is om deze code in een andere taal te schrijven (mind storms ondersteund geen c#), maar dit is dus gewoon om de opbouw van de code te hebben, dan is het alleen een kwestie van een beetje aanpassen. En het is / was een oefening voor mij om een beetje met c# te spelen.
dan heeft het al helemaal geen zin om moeilijk te gaan doen want een andere taal gaat mischien weer anders met arrays.
Ik bedacht me net dus ook dat een jagged array in principe ook maar 1 array is, maar er werd dus net gezegd:
Nee een Jagged array is een Array van Array's dus het is niet een array. Maar ik zie daarin geen reden om dit niet te gebruiken. Want je hebt maar een variabele die naar je Jagged Array wijst
Ik heb dus zelf al een functie gemaakt die de hele array colum voor colum doorloopt, maar dat is natuurlijk een beetje zonde. De vraag was dus ook eigenlijk of je niet direct die column uit die mutidem array kan halen, maar ik krijg het gevoel dat dat niet kan....
waarom zou je er een Column uit willen halen bij vier op een rij?
als je de functie die ik hierboven als voorbeeld geef bijvoorbeeld als static in een Class MyArray deffineert kan je het op de volgende manieren doen ( Met jagged en multi dimensionale array )
C#:
1
2
3
4
5
6
int[][] jagged; // en natuurlijk even aanmaken
int[,] multi; // deze ook
int index1, index2;

index1 = Array.LastIndexOf( jagged[ x /* column */ ], 0 );
index2 = MyArray.LastIndexOf( multi, x /* column */, 0 );

zoals je ziet zit er niet echt verschil in de werkwijzen. De Array.LastIndexOf zal tenslotte ook gewoon van achter in de array de array door moeten lopen om te kijken wat de laatste index met die waarde is.

Als je liever een Jagged Array wilt gebruiken moet je dat zeker niet laten hoor want slechter is het zeker niet. Maar met je huidige oplossing is het zeker ook wel op eenzelfde manier te berijken. Je hoeft niet perse een column eruit the halen.

“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.”


Verwijderd

Topicstarter
jah dat klopt wel eigenlijk, het maakt dus eigenlijk niks uit of ik nou jagged of multidem geruik of zie ik dat verkeerd

De manier die jij voorstelt is eigenlijk hetzelfde als wat ik hier liet zien:
C#:
1
2
3
4
5
6
7
8
9
  for (int i = 0;i < 7; i++)
            {
                for (int q = 0;q < 7; q++)
                {
                    tempCoor[q] = bordArray[q,i];
                }
                yCoor = Array.LastIndexOf(tempCoor,0);
                avCoords[i] = yCoor;
            }


alleen dan wat mooier :P, en wat dynamischer...

Maar jouw code moet dan ook nog een keer door een for lus, om alle columns door te lopen, dus niet echt een verbetering denk ik, of zie ik iets over het hoofd?

[ Voor 71% gewijzigd door Verwijderd op 12-08-2005 16:00 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
nee want jij kopieert hier gewoon eerst een hele set over naar een andere array en dan doe je LastIndexOf ( Die nogmaals door de array heen moet lopen ). Dus er moet voor elke column 2 keer door alle rows heen lopen op mijn manier hoef je dat maar een keer en dat is dus net zoveel als met de Jagged array Even 2 completere voorbeeldjes

Jagged:
C#:
1
2
3
4
5
6
int[][] array = CreateJagged();
for( int i = 0; i < numColumns; i++ )
{
    int lastIndex = Array.LastIndexOf( array[ i ], 0 );
    //Do something with lastIndex
}

Multi
C#:
1
2
3
4
5
6
int[,] array = CreateMulti();
for( int i = 0; i < numColumns; i++ )
{
    int lastIndex = MyArray.LastIndexOf( array, i, 0 );
    //Do something with lastIndex
}

beide code doet precies hetzelfde en loopt dus alle collumns langs en zoekt daar de lastindex van 0 op.

Het kopieren naar een TempArray wat jij doet is totaal overbodig en neemt alleen maar extra resources in beslag.

[ Voor 10% gewijzigd door Woy op 12-08-2005 16:10 ]

“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.”


Verwijderd

Topicstarter
OOhhja tuurlijk, |:( ik d8 al dat ik wat over het hoofd zag. Bedankt!
Maar wat moet myarray nou voorstellen? Dat zie ik even niet... beetje slaapgebrek opgelopen

Trouwens.... met upperbound bepaal je gewoon hoeveel items er in en dimensie van een array zitten he?

[ Voor 21% gewijzigd door Verwijderd op 12-08-2005 16:31 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Gets the upper bound of the specified dimension in the Array.
dus ja volgens de msdn

“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.”


Verwijderd

Topicstarter
Krijg het niet aan de praat zo, en ben nog te noob om precies te snappen wat er nou mis is:

Argument '1': cannot convert from 'int[*,*]' to 'object[*,*]'

The best overloaded method match for 'MyArray.LastIndexOf(object[*,*], int, object)' has some invalid arguments

Het probleem zit em toch in het feit dat bordArray geen 'object' is, maar wat moet ik daar aan doen dan?

[ Voor 187% gewijzigd door Verwijderd op 12-08-2005 17:03 ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Het type int[,] is geen subtype van object[,]. Dus voor dit geval zou je het type in int[,] of Array moeten veranderen

[ Voor 3% gewijzigd door Woy op 12-08-2005 17:51 ]

“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