Skopiowanie elementów jednej tablicy do drugiej

0

Próbuję rozwiązać zadanie polegające na przekopiowaniu do drugiej tablicy elementów większych od zera. mam problem przy Array.Copy. Czy ktoś mógłby pomóc to wytłumaczyć? Przeważnie wpadam w nieskończoną pętlę lub dostaję wyniki niezgodne z oczekiwaniami.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace kopiowanie_tablic
{
    class Program
    {
        static void Main(string[] args)
        {
            int[] tabJeden = new int [10] { 2, -1, 0, 8, 12, -5, 3, 26, -9, -7 };
            int[] tabDwa = new int[10];

           
            for (int i=0; i<9 ; i++)
            {
                while (tabJeden[i]>0)
                { 
                Array.Copy(tabJeden, tabDwa, ??);
                foreach (int x in tabDwa)
                 
                    Console.Write("{0} ", x);
                }
                
            }

            Console.ReadKey();
          
        }
    }
}
0
int j=0;
for(int i=0;i<tablicaDlugosc;i++)
    if(tab1[i]>0)
          tab2[j++]=tab[i];
   

Jeżeli dobrze zrozumiałem Twoje intencje to przekombinowałeś bardziej niż bardzo. Uzywasz 3 petli do tego ta while nigdy sie nie skoczy bo non stop bedzie zaczynało z wartoscia i=0;

0

jako trzeci parametr musisz podac albo funkcje ktora bedzie tym warunkiem albo napisz sobie lamde tam
https://msdn.microsoft.com/en-us/library/bb397687.aspx
na zasadzie takiej

(int x) => x > 0
1
var tabDwa = tabJeden.Where(x => x > 0).ToArray(); 
0

skytrack
Jeśli dobrze zrozumiałem to j zlicza liczbę elementów dodatnich tablicy. Problem w tym, że ja chcę wyświetlić zawartość tabDwa, a nie je policzyć.

0

Dziękuję wszystkim za pomoc. W sumie ciekawe bo to ma być proste zadanie dla początkujących... :)

0

Okazało się, że przekombinowałem i Array.Copy nie trzeba było użyć w ogóle. No i faktycznie zadanie jest dla początkujących... :)
BTW. Napisałem je od zera, dlatego założenia początkowe trochę się różnią

 
 class Program
    {
        static void Main(string[] args)
        {
            //Deklaracja tablic
            int[] tab1 = new int[10] {2, -1, 4, -2, 6, -3, 8, -4, 0, 1};
            
            int[] tab2 = new int[10] { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};

            Console.WriteLine("Elementy tablicy tab2");
            for (int i =0; i < 10; i++ )
            {
                if (tab1[i] > 0)
                {
                    tab2[i] = tab1[i];
                    
                    
                }
                Console.Write(tab2[i] + ", ");
            }
            Console.WriteLine();
            Console.WriteLine();
            Console.WriteLine("Nacisnij ENTER zeby zakonczyc...");
            Console.Read();

        }
    }
3

Nie pisz tak: for (int i =0; i < 10; i++ ), bo to proszenie się o kłopoty, na dodatek niewydajne. Operuj na właściwościach tablicy, którą przetwarzasz, czyli tak: for (int i =0; i < tab2.Length; i++ )

7

Jakby się ktoś zastanawiał o co chodziło somekindowi to podpowiem: forma for (int i = 0; i < arr.Length; i++) podpowiada optymalizatorowi, że chcemy po prostu przeiterować po wszystkich elementach i wyeliminuje tutaj ewentualne sprawdzenie czy arr[i] może wskazywać na nieistniejący element tablicy (tzw. ABC elimination). Oczywiście wielkość tablicy zostanie pobrana tylko raz pomimo tego, że według kodu C# powinna być sprawdzona przy każdej iteracji (tzw. hoisting).

Dowód z dezasemblera:

            for(int i = 0; i < arr.Length; i++)
00262DC6  xor         esi,esi  
00262DC8  mov         edi,dword ptr [ebx+4]  
00262DCB  test        edi,edi  
00262DCD  jle         00262DDD
00262DCF  mov         ecx,dword ptr [ebx+esi*4+8]
            Console.WriteLine(arr[i]);
00262DD3  call        70528058  
00262DD8  inc         esi  
00262DD9  cmp         edi,esi  
00262DDB  jg          00262DCF  

Dowód z kodu źródłowego optymalizatora:
https://github.com/dotnet/coreclr/blob/master/src/jit/optimizer.cpp#L7600 (plus/minus 1000 linii w górę/dół ;)).

0

somekind

Większość podręczników dla początkujących używa n < 0, a nie tablica.Lenght < 0. Jednak rozumiem o co chodzi i dzięki za zwrócenie uwagi.

`dodanie znaczników ``` - @furious programming

1 użytkowników online, w tym zalogowanych: 0, gości: 1