# C# Array



## thysol (28. Oktober 2010)

Hallo,
Ich habe ein array dass 10000 verschiedene Zahlen enthaelt. Ich wuerde gerne nochmal 10000 arrays erstellen (fuer jede Zahl in dem vorherigen array nochmals ein array). Jedes von den neuen arrays soll exakt  die anzahl an Zahlen enthalten wie die Zahl in dem vorherigen array. Also wenn array1[27] = 17658 ist soll array27 17658 Zahlen enthalten. Weiss einer von euch wie mann dass in einer schleife einfach machen kann?

Ich habe das so versucht aber dann kommen Compiler errors:

int n = 10000;
float k = 0;

while (k < n)
{
        v[k] = new float[v8[k]];
        k++;
}

v8 ist uebrigens dass array mit 10000 Zahlen.


----------



## bingo88 (28. Oktober 2010)

```
int[] zahlen = new int[10000];
int[][] array2 = new int[10000][];

for (int i = 0; i < zahlen.Length; ++i)
{
    zahlen[i] = i + 1;
}

for (int i = 0; i < zahlen.Length; ++i)
{
    array2[i] = new int[zahlen[i]];
}
```
Das klappt bei mir so.


----------



## thysol (28. Oktober 2010)

Hat geklappt. Danke bingo88.


----------



## bingo88 (28. Oktober 2010)

thysol schrieb:


> Hat geklappt. Danke bingo88.


Kein Ding


----------



## thysol (29. Oktober 2010)

So sieht mein Code jetzt aus:

float[][] v9 = new float[n][];

            for (int i = 0; i < v8.Length; i++)
            {
                v9_ = new float[(int)v8];

            }
            for (int i = 0; i < v8.Length; i++)
            {
                    v9 = Math.Pow(((1 - ((i * i) / (v6 * v6))) * v8 * v8), 0.5);
                    }

Allerdings wenn ich kompilieren will kommt dieser Error:

Cannot implicitly convert type double to float[]. Was muss ich da machen?_


----------



## bingo88 (29. Oktober 2010)

Casten.  Entweder "hart" mittels

```
float b = (float) 1.0; // 1.0 ohne alles ist Double
```
oder schöner mittels Convert:

```
float b = Convert.ToSingle(1.0);
```
Convert hat den Vorteil, dass es Bereichsprüfungen durchführen kann (wenn man dies aktiviert). Dann gibt's eine System.OverflowException sobald der geparste Wert größer dem Zieldatentyp ist.

Edit: Argh, hab deinen Code nicht richtig gelesen ^^
Math.pow liefert *einen* einzigen Wert, v9 erwartet aber ein  Array an der Stelle. Du musst also einen zweiten Index angeben.


----------



## thysol (29. Oktober 2010)

Langsam bin ich verwirrt ob ich dass richtig mache. Hier zeig dir mal den gesamten Code und sage dir genau was er machen soll:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using System.Diagnostics;
using Cloo;
using OpenTK;
using OpenTK.Graphics.OpenGL;
using System.Math;

namespace OpenCL___OpenGL_Orbit_Simulation
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void button1_Click(object sender, EventArgs e)
        {
            Random RandomClass = new Random();

            string vecSum = @"
                     __kernel void
                    floatVectorSum(__global       float * v1,
                                   __global       float * v2,
                                   __global       float * v3,
                                   __global       float * v4,
                                   __global       float * v5,
                                   __global       float * v6,
                                   __global       float * v7,
                                   __global       float * v8)
                    {
                        int i = get_global_id(0);
                        v4_ = v3 / (2 * 398600500000000 / (v3 *  (v1 * v1)) - 1);
                        v5 = v3 * (v1 * v1) / 398600500000000 - 1;
                        v6 = v4 / (1 + v5);
                        v7 = v5 * v6;
                        v8 = v6 - v7;
                        v8 = sqrt( v8 );
                    }";



            OpenCLTemplate.CLCalc.InitCL();

            OpenCLTemplate.CLCalc.Program.Compile(new string[] { vecSum });

             OpenCLTemplate.CLCalc.Program.Kernel VectorSum = new OpenCLTemplate.CLCalc.Program.Kernel("floatVectorSum");

             int n = 10000;

            float[] v1 = new float[n], v2 = new float[n], v3 = new float[n], v4 = new float[n], v5 = new float[n], v6 = new float[n], v7 = new float[n], v8 = new float[n];

            for (int i = 0; i < n; i++)
            {
                v1 = RandomClass.Next(1000, 100000);
                v2 = RandomClass.Next(200000, 10000000);
                v3 = 6378140 + v2;
            }

            OpenCLTemplate.CLCalc.Program.Variable varV1 = new OpenCLTemplate.CLCalc.Program.Variable(v1);
            OpenCLTemplate.CLCalc.Program.Variable varV2 = new OpenCLTemplate.CLCalc.Program.Variable(v2);
            OpenCLTemplate.CLCalc.Program.Variable varV3 = new OpenCLTemplate.CLCalc.Program.Variable(v3);
            OpenCLTemplate.CLCalc.Program.Variable varV4 = new OpenCLTemplate.CLCalc.Program.Variable(v4);
            OpenCLTemplate.CLCalc.Program.Variable varV5 = new OpenCLTemplate.CLCalc.Program.Variable(v5);
            OpenCLTemplate.CLCalc.Program.Variable varV6 = new OpenCLTemplate.CLCalc.Program.Variable(v6);
            OpenCLTemplate.CLCalc.Program.Variable varV7 = new OpenCLTemplate.CLCalc.Program.Variable(v7);
            OpenCLTemplate.CLCalc.Program.Variable varV8 = new OpenCLTemplate.CLCalc.Program.Variable(v8);

            OpenCLTemplate.CLCalc.Program.Variable[] args = new OpenCLTemplate.CLCalc.Program.Variable[] { varV1, varV2, varV3, varV4, varV5, varV6, varV7, varV8 };

            int[] workers = new int[1] { n };

            VectorSum.Execute(args, workers);

            varV4.ReadFromDeviceTo(v4);
            varV5.ReadFromDeviceTo(v5);
            varV6.ReadFromDeviceTo(v6);
            varV7.ReadFromDeviceTo(v7);
            varV8.ReadFromDeviceTo(v8);


            label1.Text = v8[5689].ToString();
            label2.Text = v6[5689].ToString();
        }


        private void Form1_Load(object sender, EventArgs e)
        {

        }
    }
}

v8 und v6 enthalten die teile einer elliptischen Formel. Also:

(x^2 / v6^2) + (y^2 / v8^2) = 1.
Wenn also x = 1, 2, 3 usw. ist kann ich die dazugehoerige y Koordinate finden. v9 soll diese y Koordinaten enthalten pro v8.

Wenn v6 10000 Zahlen enthaelt soll es 10000 weitere arrays geben. Ausserdem soll wenn v6[345] = 567 dass 345te array genau 567 Zahlen enthalten. Wie kann ich das machen?

Ich bedanke mich schon mal im Vorraus fuer eure Hilfe._


----------



## bingo88 (29. Oktober 2010)

Wenn die Länge der Elemente von v9 unbekannt ist, musst du über eine dynamische Struktur (hier z. B. ein Array von Listen) gehen. Da kannst du dann neue Elemente einfach anhängen. Daraus kannst du dann in der Regel ein Array fester Länge erzeugen bzw. abrufen.


----------



## thysol (30. Oktober 2010)

Ok. Nochmals Danke fuer die Hilfe.


----------

