Witam wszystkich. Mam pytanie odnośnie funkcji malloc w języku C.
Tworze tablice dynamiczną za pomocą malloca np z kilkoma liczbami.
Jak mogę wyznaczyć w prosty sposób ostatni element tej tablicy ??
Próbuje cały czas jednak za nic nie mogę dojść do sensownego rozwiązania
Potrzebuje to np do takiego zadania które miało by zamienić kolejność elementów (zamiast 1,2,3,4,5 miało by być 5,4,3,2,1). Nie chodzi o sortowanie! Tylko o sam fakt wyznaczenia wielkości tablicy.
Nie możesz. Musisz znać wielkość zaalokowanego obszaru pamięci. Jednym z możliwych rozwiązań jest trzymanie magicznej wartości w ostatnim polu. Jeśli nie chcesz trzymać tego osobno i używasz MSVC, możesz użyć takiej konstrukcji:
#include
#include
typedef struct _MOJE_INTY {
size_t RozmiarTablicy;
int Dane[0];
} MOJE_INTY, *PMOJE_INTY;
int main()
{
// potrzebuje 123 elementow
PMOJE_INTY mi = (PMOJE_INTY)malloc(123 * sizeof(int) + sizeof(MOJE_INTY));
mi->RozmiarTablicy = 123;
// teraz mozesz sie odwolywac do mi->Dane[0] ... mi->Dane[122]
for (int i = 0; i < mi->RozmiarTablicy; ++i)
mi->Dane[i] = i * i;
wprintf(L"%d\n", mi->Dane[7]);
free(mi);
return 0;
}
Hmm pod parłem się waszą wiedzą i troszkę jeszcze doczytałem sobie i mniej więcej rozumiem o co chodzi Teraz troszkę praktyki i będzie jeszcze lepiej. Jednak powiedzcie mi jeśli możecie…
Chciałem napisać program, na razie na sztywno, który miałby wypisywać po kolei elementy tablicy (na sztywno wpisaną) do puki nie trafi na liczbę “3”. Napisałem coś takiego
#include
int main()
{
int i;
int tab[5] = {1,2,3,4,5};
for (i=0; tab[i]=2; i++)
{
printf("Wartosc: %d \n", tab[i]);
}
system("PAUSE");
return 0;
}
Jednak nie działa mi teoretycznie mi się wydaje że jest okej jednak zawsze popełniam błąd którego bez pomocy nie potrafię znaleźć Jeśli możecie podpowiedzcie troszkę
Faktycznie… pomyliłem się i dałem jedno = za mało Jednak dalej nie działa.
Sprawdziłem opcję @[alex] i działa Szczerze mówiąc nie wpadł bym na to Próbowałem dużo razy ale na to bym nie wpadł Dzięki wielkie
A powiedzcie czy mogę w ten sam sposób sprawdzać tablice znaków ?? np char tab[15]=“ala ma kota”; i by przerwało pętlę po napotkaniu np pustego znaku np spację??
Hmm wiem już jak przeanalizować całą tablicę typy char i tablicę typu int. Wszystko jest podobne. Tylko, że zawsze moje zadanie opierają się na tym by np. przeanalizować tablicę typu char ale za alokowaną dynamicznie.
Mam np. coś takiego:
#include
int main()
{
int i, n;
int pause = 0;
int znak = 0;
char * tab1;
tab1 = (char *) malloc (n*sizeof(char));
printf("Podaj wielkosc tablicy: ");
scanf("%d", &n);
printf("Zawartosc tablicy: ");
scanf("c%", &tab1);
printf("\nWielkosc tablicy: %d \n", n);
printf("Zawartosc tablicy: %c \n", tab1);
/*
char tab[15] = "ala ma kotka.";
for (i=0; tab[i]!='.' ; i++)
{
if (tab[i]!='\n' && tab[i]!=' ' && tab[i]!='\t')
{
znak++;
}
else
{
pause++;
}
printf("Wartosc: %c , to jest %d znak, przerwa %d \n", tab[i], znak, pause);
//printf("Znaki %d \n", znak);
//printf("Przerwy %d \n", pause);
}
*/
system("PAUSE");
return 0;
}
Czytanie całej tablicy ? Nie ma problemu jak widać. Tylko mam problem z wpisaniem wartości np. “ala ma kota.” do tej dynamicznie utworzonej tablicy. Wiem, że tablicę dynamiczną można używać jak zwykłej. Jednak mi to nie wychodzi. Podpowiedzcie mi jakiś sposób jednak z wersji prostych, albo pokażcie gdzie mam błąd w moim rozumowaniu
tab1 = (char *) malloc (n*sizeof(char)); // n - nie zainicjalizowano zawiera śmiecie nie wiadomo ile się przydzieliscanf("%d", n); // dopiero teraz określasz n ?scanf("c%", tab1); // wczytujesz znak w młodszą część adresu - jakieś totalne bzdury.for (i=0; tab[i]!='.' ; i++) // nie musisz dawać specjalnego znaku taki już istnieje, lepiej używać ++i niż i++: for(i=0;tab[i];++i) // tak najlepiejif (tab[i]!='\n' tab[i]!=' ' tab[i]!='\t') // znak nie może być jednocześnie spacja i tabulacją użyj || lub zamiast tego lepiej:if(strchr(" \n\t",tab[i]))[/code]
[code=php]printf("Podaj wielkosc tablicy: ");scanf("%d",n)==1)(n0)) // jeżeli nie to znaczy że użyszkodnik wpisał literki zamiast liczby albo ujemną {tab1=(char*)malloc(n+1); // nie trzeba mnożyć przez sizeof(char) ponieważ zawsze jest 1, +1 na znak końcaprintf("Zawartosc tablicy: ");fgets(tab1,n+1,stdin); // uwaga zawiera '\n' na końcu, jeżeli nie to użyszkodnik wpisał zbyt dużo znakówchar *enter=strchr(tab1,'\n'); // szukamy znak '\n';if(enter) *enter=0; // zamieniamy '\n' na koniec napisuelse printf("podano zbyt duzo znakow\n");