Błąd przy tworzeniu funkcji

0

Witam. Mam zamiar napisać dzielenie na tablicach, coś ala dzielenie pisemne. Najpierw natomiast chcę napisać sobie dodawanie. Pojawił się problem w napisaniu tej o to funkcji, nie wiem czym spowodowany. O to kod:

#include <iostream>

using namespace std;

void wypisz(int arg[], int length)
{
     for (int i = 1; i<= length; i++)
    {
        cout<<arg[i];
    }
}

void wczytaj (int length, int arg[])
{
    for (int i=1; i<=length; i++)
    {
        cout << "Podaj kolejna cyfre: ";
        cin >> arg[i];
    }
}

void dodaj (int length1, int length2, int arg1[], int arg2[])
{
    int diff = length1 - length2;
    if (length1 > length2)
    {
        int temp[length1];

        //wyrownanie ilosci cyfr zerami
        for (int i=1; i<=diff; i++)
        {
            temp[i] = 0;
        }

        for (int i=1; i<=length2; i++)
        {
            temp[i+diff] = length2[i]; //tutaj wyrzuca błąd
        }
        wypisz(temp, length1);

    }
}

int main()
{
    int maxw1, maxw2;

    cout << "Cyfry wprowadzaj od najwiekszych az do cyfr jednosci."<<endl;
    cout << "Wprowadz dzielna: "<<endl;
    cout << "Ilosc cyfr: ";
    cin >> maxw1;
    int tab1[maxw1];
    wczytaj(maxw1, tab1);

    cout << "Wprowadz dzielnik: " << endl;
    cout << "Ilosc cyfr: ";
    cin >> maxw2;
    int tab2[maxw2];
    wczytaj(maxw2, tab2);



    cout<<"Dzielna: " << endl;
    wypisz(tab1, maxw1);

    cout<< endl << "Dzielnik: " << endl;
    wypisz(tab2, maxw2);

    dodaj(maxw1, maxw2, tab1, tab2);
    return 0;
}
 

Tutaj jest treść błędu. Proszę Was o pomoc.

D:\Projekty C++\Hello World\Dzielenie\main.cpp||In function 'void dodaj(int, int, int*, int*)':|
D:\Projekty C++\Hello World\Dzielenie\main.cpp|37|error: invalid types 'int[int]' for array subscript|
||=== Build finished: 1 errors, 0 warnings ===|

0
int temp[length1];

Tak bedzie mozna deklarowac tablice w c++ 0X, a poki co zrob to za pomoca new i delete.

0

Ok spróbuję. Mam jeszcze coś:

W jaki sposób przekazać tablice poprzez referencję? Gdy robię to tak:

 void dodaj (int length1, int length2, int &arg1[], int &arg2[])

Otrzymuję taki błąd:

D:\Projekty C++\Hello World\Dzielenie\main.cpp|22|error: declaration of 'arg1' as array of references|
D:\Projekty C++\Hello World\Dzielenie\main.cpp|22|error: expected ')' before ',' token|
D:\Projekty C++\Hello World\Dzielenie\main.cpp|22|error: expected unqualified-id before 'int'|
||=== Build finished: 3 errors, 0 warnings ===|

Dodam jeszcze że jestem dosyć początkujący jeśli chodzi o cpp dlatego proszę o wyrozumiałość.

@Edit
Poprawiłem i dalej wyskakuje ten sam błąd w tym samym miejscu. Domyślam się, że jest to błąd w samej deklaracji funkcji.

void dodaj (int length1, int length2, int arg1[], int arg2[])
{
    int diff = length1 - length2;
    if (length1 > length2)
    {
        int *temp = new int[length1];

        //wyrownanie ilosci cyfr zerami
        for (int i=1; i<=diff; i++)
        {
            temp[i] = 0;
        }

        for (int i=1; i<=length2; i++)
        {
            temp[i+diff] = length2[i];
        }
        wypisz(temp, length1);

    }
}
0

Endrju Ci napisał "length2[i] to nie jest tablica"

0

W programie głównym tablice tab1 i tab2 utwórz dokładnie tak samo jak zrobiłeś z tablicą temp. Za pomocą wskaźnika i operatora new. Następnie przekazuj do funkcji wskaźniki do tablic, zamiast referencji do tablić jak próbujesz robić. Kolejną rzeczą jest nieprawidłowe indeksowanie tablic. Liczymy od zera... Tak więc zamiast pisać:
for (i = 1; i <= dlugosc; i++)
pisz:
for(i = 0; i < dlugosc; i++)

0

Co do indeksowania tablic, tak wiem o tym. Mam przyzwyczajenie z innego języka programowania, gdzie indeksowało się od 1, 0 było zarezerwowane dla ilości elementów w tablicy. Musze się jeszcze przyzwyczaić do tego. Co do tematu, to problem rozwiązany, również udało mi się zauważyć, że length2 to nie tablica ;]

0

@ winterfresh, być może. Nie czytałem dokumentacji, ani nie pisałem w c++11, informację wziąłem z wikipedi.

0

W ang. wersji też piszą, że takie deklaracje są dozwolone...

0

To C++11 już jest czy go nie ma?:D Dużo się o tym mówi a to pierwszy standard który wyjdzie od kiedy bawię się w programowanie i jestem ciekaw czy w jakikolwiek sposób odczuje że on jest? Jak to wygląda?
Wyjdzie któregoś dnia nowy standard.. kilka dni potem pojawią się nowe kompilatory i zaczyna się kodować w nowym standardzie ?

0
mto9 napisał(a)

To C++11 już jest czy go nie ma?:D Dużo się o tym mówi a to pierwszy standard który wyjdzie od kiedy bawię się w programowanie i jestem ciekaw czy w jakikolwiek sposób odczuje że on jest? Jak to wygląda?
Wyjdzie któregoś dnia nowy standard.. kilka dni potem pojawią się nowe kompilatory i zaczyna się kodować w nowym standardzie ?

Nowy standard jest już od sierpnia tego roku. Kompilatory (które od dłuższego czasu pozwalają na stosowanie C++0x) się powoli przystosowują do nowego standardu np. GCC http://gcc.gnu.org/projects/cxx0x.html a w CL nie wiem jak to wygląda, ale można bez jakichkolwiek przełączników stosować C++11 (a przynajmniej niektóre jego części). Nic się nie dzieje z dnia na dzień, zobacz jak to jest z HTML5, który już jest stosowany a ostateczna wersja standardu pojawi się pewnie w 2015-2020 roku.

0
Generalized constant expressions
C++ has always had the concept of constant expressions. These are expressions such as 3+4 that will always yield the same results, at compile time and at run time. Constant expressions are optimization opportunities for compilers, and compilers frequently execute them at compile time and hardcode the results in the program. Also, there are a number of places where the C++ specification requires the use of constant expressions. Defining an array requires a constant expression, and enumerator values must be constant expressions.
However, constant expressions have always ended whenever a function call or object constructor was encountered. So a piece of code as simple as this is illegal:
int get_five() {return 5;}
 
int some_value[get_five() + 7]; // Create an array of 12 integers. Ill-formed C++
This is not legal C++, because get_five() + 7 is not a constant expression. The compiler has no way of knowing if get_five() actually is constant at runtime. In theory, this function could affect a global variable, call other non-runtime constant functions, etc.
C++11 introduced the keyword constexpr, which allows the user to guarantee that a function or object constructor is a compile-time constant. The above example can be rewritten as follows:
constexpr int get_five() {return 5;}
 
int some_value[get_five() + 7]; // Create an array of 12 integers. Legal C++11

Zwracam honor, tu chodzi uogólnione wyrażenia stałe.

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