C# Array

thysol

BIOS-Overclocker(in)
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.;)
 
Zuletzt bearbeitet:
Code:
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.
 
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?
 
Casten. Entweder "hart" mittels
Code:
float b = (float) 1.0; // 1.0 ohne alles ist Double
oder schöner mittels Convert:
Code:
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.
 
Zuletzt bearbeitet:
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.:daumen:
 
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.
 
Zurück