Autor Wątek: Długość tablicy intów w c++  (Przeczytany 5686 razy)

Offline amd

  • Użytkownik

# Październik 04, 2010, 10:56:39
Witam
mam problem z wyznaczeniem długości tablicy w c++
mam taki kod
załóżmy że ktoś gdzieś w kodzie deklaruje i definiuje tablice o losowej ilości elementów
int *t = new int[rand()%100];
//skąd mam wiedzieć jaka jest długość tej tablicy
moim zadaniem jest zsumowac te elementy
tylko jak to zrobić nie wiedząc jaka była długość tablicy przy deklaracji


znalazłem coś takiego (szukałem informacji skąd delete[] wie ile ma usuwać)
http://www.parashift.com/c++-faq-lite/compiler-dependencies.html
case'y 38.7,38.8

jednak w realnym programie w żaden spoób nie mogę czegoś takiego uzyć


Mod.
Bład w składni poprawiony:)

« Ostatnia zmiana: Październik 04, 2010, 11:32:32 wysłana przez amd »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Avaj

  • Użytkownik

# Październik 04, 2010, 11:10:27
co to za składnia? :D

tak się nie deklaruje tablic dynamicznych. Można albo tak:

Kod: (cpp) [Zaznacz]
int* t = new int[rand()%100];

albo

Kod: (cpp) [Zaznacz]
std::vector<int> t(rand()%100);

w tym drugim przypadku wystarczy użyć funkcji t.size(), w tym pierwszym przypadku trzeba pamiętać rozmiar :)

Offline amd

  • Użytkownik

# Październik 04, 2010, 11:19:22
Faktycznie mój bład(już poprawiony)

Co do rozwiązania to nie mogę korzystać z  żadnych dodatkowych struktur ani zmiennych.
Więc uzycie vectora odpada.Odpada tez dodatkwoa zmienna zapamiętująca długośc.


to co narazie wymyśliłem jednak wszystkie te rozwiązania sa rozwiązaniami nie spełniającymi założen lub rozwiązaniami na siłe
1)użycie vectora lub innej przez siebie stworzonej struktury
2)dodatkwoy parametr z długością
3)tablica dłuższa o 1 i na pierwszym miejscu podana jej długość
4)skorzystanie z wyjatków(sumuje i licze sobie długośc tablicy i zmieniam wartość tablicy aż nie wywali mi błędu pamięci(tego w sumie nie sprawdzałem))

Ma ktoś może jeszcze jakieś pomysły



Offline raver

  • Użytkownik
    • Moja strona domowa.

# Październik 04, 2010, 11:21:32
#define sizeof_array(a) ((sizeof a)/(sizeof a[0]))
?

Edit: Racja, nie działa do dynamicznych.
« Ostatnia zmiana: Październik 04, 2010, 11:33:10 wysłana przez raver »

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Październik 04, 2010, 11:25:41
Użycie sizeof(t)/sizeof(int) powinno (ale nie musi) podać ilość elementów lub użyj po prostu:
Kod: (cpp) [Zaznacz]
int i= rand()%100;
int* t = new int[i];
« Ostatnia zmiana: Październik 04, 2010, 11:32:38 wysłana przez Adam7 »

Offline spax

  • Użytkownik

# Październik 04, 2010, 11:28:42
Co za brednie. sizeof(t)/sizeof(int) zostanie rozwinięte do 4 / 4.
Tą metode można wykorzystywać tylko do tablic statycznych alokowanych na stosie.

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Październik 04, 2010, 11:31:57
Co za brednie. sizeof(t)/sizeof(int) zostanie rozwinięte do 4 / 4.
Tą metode można wykorzystywać tylko do tablic statycznych alokowanych na stosie.
Dlatego podałem też 2 rozwiązanie, gdyby pierwsze nie pomogło :)

[EDIT]
Ten drugi też odpada.
Co do rozwiązania to nie mogę korzystać z  żadnych dodatkowych struktur ani zmiennych.
« Ostatnia zmiana: Październik 04, 2010, 11:35:46 wysłana przez Adam7 »

Offline amd

  • Użytkownik

# Październik 04, 2010, 11:35:07
Kod: (cpp) [Zaznacz]
int i= rand()%100;
int* t = new int[i];

to rozwiązanie mnie nie satysfakcjonuje
w moim rozwiązaniu nie mogę użyć dodatkowych zmiennych

#define sizeof_array(a) ((sizeof a)/(sizeof a[0]))
to oczywiście nie jest poprawne

Offline Adam7

  • Użytkownik
    • warsztat.gd

# Październik 04, 2010, 11:43:32
Wpadłem na pomysł (być może coś takiego nie jest możliwe ale i tak to napiszę :) ):
Kod: (cpp) [Zaznacz]
int suma= 0;
while(*t)
{
    suma+= *t;
    *t++;
}
Coś w tym stylu :)

Offline amd

  • Użytkownik

# Październik 04, 2010, 11:53:15
Wpadłem na pomysł (być może coś takiego nie jest możliwe ale i tak to napiszę :) ):
Kod: (cpp) [Zaznacz]
int suma= 0;
while(*t)
{
    suma+= *t;
    *t++;
}
Coś w tym stylu :)

załozyłeś że kolejny element po końcu tablicy ma wartość 0 a to błędne założenie

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Październik 04, 2010, 12:01:01
int * t = new int[rand() % 100];
__asm {
   mov eax, [esp - 4]
}
Możesz nie wierzyć, ale w eax wyląduje rozmiar tablicy w bajtach. Podziel go przez 4 i dostaniesz liczbę elementów tablicy.

Offline Paweł

  • Użytkownik

# Październik 04, 2010, 12:05:05
srand(1);
int *t = new int[rand()%100];
srand(1);
rozmiar = rand()%100;
Tylko losowość żadna...

Offline Karol

  • Użytkownik

# Październik 04, 2010, 12:05:39
Poważnie w C++ nie ma czegoś takiego jak Length? ???

Offline Mormegil

  • Użytkownik
    • Moj dev blog

# Październik 04, 2010, 12:07:55
Jest, nazywa się std::vector<>::size(), ale autor wyraźnie napisał, że nie wolno mu z tego korzystać.

Offline amd

  • Użytkownik

# Październik 04, 2010, 12:27:01
int * t = new int[rand() % 100];
__asm {
   mov eax, [esp - 4]
}
Możesz nie wierzyć, ale w eax wyląduje rozmiar tablicy w bajtach. Podziel go przez 4 i dostaniesz liczbę elementów tablicy.

a mógłbyś mi pomóc
i powiedzieć w jaki sposób skompilowac to pod g++
bo mi w żaden sposób nie chce się to skompilować