tworzenie dynamicznej tablicy wskaźników

tworzenie dynamicznej tablicy wskaźników
robcio
  • Rejestracja:prawie 13 lat
  • Ostatnio:ponad 10 lat
  • Lokalizacja:Opole
  • Postów:533
0

Otóż mam dwa zapisy:

Kopiuj
	char * fun[] = new char*[100];
	char ** fun2 = new char*[100];
 

Ten pierwszy jest niepoprawny a ten drugi poprawny. Moje pytanie dlaczego?
Przecież zapis char * nazwa[] i char **nazwa niczym się nie różni od siebie. W obu przypadkach mamy do czynienia z tablicą wskaźników o nieokreślonej liczbie elementów.
Oba zapisy:

Kopiuj
 
int main(int argc, char * argv[])
int main(int argc, char ** argv)

są przecież poprawne. Tzn jednoznaczne.


Nie odpowiadam na PW z prośbą o pomoc programistyczną.
MA
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 10 lat
0

main.cpp|26|error: initializer fails to determine size of 'fun'|


Zero litości dla nieróbstwa.
Endrju
  • Rejestracja:około 22 lata
  • Ostatnio:ponad rok
1

To nie jest to samo. Podczas przekazywania tablicy do funkcji jest ona redukowana do wskaźnika na pierwszy element, dlatego to, że użyjesz tam zapisu [] niczego nie zmienia - tablica zostanie zredukowana i jest to to samo co **. Podczas definicji rozmiar tablicy musi być znany a Ty go nie podajesz. Tablica to nie jest wskaźnik.

Kopiuj
cdecl> explain char * fun[]
declare fun as array of pointer to char
cdecl> explain char ** fun2
declare fun2 as pointer to pointer to char

Widzisz różnicę? Kompilator też ją widzi. Z tym, że array of pointer to char nie może mieć nieznanego rozmiaru.


"(...) otherwise, the behavior is undefined".
edytowany 1x, ostatnio: Endrju
02
  • Rejestracja:ponad 13 lat
  • Ostatnio:około 8 lat
  • Postów:1176
1

Skladnia do tworzenia zainicjowanej statycznej tablicy 2D:

Kopiuj
int tab[][4] = {{1, 2, 3, 4}, {5, 6, 7, 8}}
int *tab[4] = {{a1, a2, a3, a4}, {a5, a6, a7, a8}};

Te dwa przypadki nie sa sobie rownowazne - w pierwszym przypadku mamy wskaznik do tablicy 2D w drugim przypadku mamy wskaznik do tablicy wskaznikow, ktore moga wskazywac na wiersze.

Do tworzenia niezaincjowanej statycznej tablicy 2D mozesz uzyc:

Kopiuj
int tab[2][4];
int *tab[4];

Te dwa przypadki takze nie sa sobie rownowazne (z takiego samego powodu jak poprzednio). Roznia sie od poprzedniego przykladu tym, ze trzeba podac wszystkie wymiary (w pierwszym przykladzie trzeba podac tylko najbardziej "prawy" wymiar i musi byc on staly).

Do tworzenia niezainicjowanej dynamicznej tablicy 2D mozna uzyc:

Kopiuj
int (*tab)[4] = new int[n][4]; //Tutaj najbardziej prawy wymiar tez musi byc staly
int **tab = new int*[n];

Te dwa przypadki nie sa sobie rownowazne. W pierszwym mamy wskaznik na dynamiczna tablice 2D w drugim mamy wskaznik do dynamicznej tablicy wskaznikow.

Teraz jak przekazujemy tablice do funkcji:
Takie zapisy:

Kopiuj
void fun(int** tab)
void fun(int* tab[])
void fun(int* tab[4]) //4 moze byc dowolna inna liczba

dla odmiany sa sobie rownowazne. Do tych funkcji mozesz przekazac tablice wskaznikow. Natomiast taki zapis:

Kopiuj
void fun(int tab[][4]) //trzeba podac najbardziej prawy wymiar

juz nie jest rownowazny poprzednim i oczekuje przekazania tablicy 2D zamiast tablicy wskaznikow.

Podsumowujac tablice dwuwymiarowa i tablica wskaznikow to dwie rozne rzeczy chociaz moga sluzyc do implementacji funkcjonalnie takiego samego kodu. Te rozroznienie musisz uwzgledniac podczas przekazywania obydwu typow tablic do funkcji.

edytowany 1x, ostatnio: 0x200x20
Kliknij, aby dodać treść...

Pomoc 1.18.8

Typografia

Edytor obsługuje składnie Markdown, w której pojedynczy akcent *kursywa* oraz _kursywa_ to pochylenie. Z kolei podwójny akcent **pogrubienie** oraz __pogrubienie__ to pogrubienie. Dodanie znaczników ~~strike~~ to przekreślenie.

Możesz dodać formatowanie komendami , , oraz .

Ponieważ dekoracja podkreślenia jest przeznaczona na linki, markdown nie zawiera specjalnej składni dla podkreślenia. Dlatego by dodać podkreślenie, użyj <u>underline</u>.

Komendy formatujące reagują na skróty klawiszowe: Ctrl+B, Ctrl+I, Ctrl+U oraz Ctrl+S.

Linki

By dodać link w edytorze użyj komendy lub użyj składni [title](link). URL umieszczony w linku lub nawet URL umieszczony bezpośrednio w tekście będzie aktywny i klikalny.

Jeżeli chcesz, możesz samodzielnie dodać link: <a href="link">title</a>.

Wewnętrzne odnośniki

Możesz umieścić odnośnik do wewnętrznej podstrony, używając następującej składni: [[Delphi/Kompendium]] lub [[Delphi/Kompendium|kliknij, aby przejść do kompendium]]. Odnośniki mogą prowadzić do Forum 4programmers.net lub np. do Kompendium.

Wspomnienia użytkowników

By wspomnieć użytkownika forum, wpisz w formularzu znak @. Zobaczysz okienko samouzupełniające nazwy użytkowników. Samouzupełnienie dobierze odpowiedni format wspomnienia, zależnie od tego czy w nazwie użytkownika znajduje się spacja.

Znaczniki HTML

Dozwolone jest używanie niektórych znaczników HTML: <a>, <b>, <i>, <kbd>, <del>, <strong>, <dfn>, <pre>, <blockquote>, <hr/>, <sub>, <sup> oraz <img/>.

Skróty klawiszowe

Dodaj kombinację klawiszy komendą notacji klawiszy lub skrótem klawiszowym Alt+K.

Reprezentuj kombinacje klawiszowe używając taga <kbd>. Oddziel od siebie klawisze znakiem plus, np <kbd>Alt+Tab</kbd>.

Indeks górny oraz dolny

Przykład: wpisując H<sub>2</sub>O i m<sup>2</sup> otrzymasz: H2O i m2.

Składnia Tex

By precyzyjnie wyrazić działanie matematyczne, użyj składni Tex.

<tex>arcctg(x) = argtan(\frac{1}{x}) = arcsin(\frac{1}{\sqrt{1+x^2}})</tex>

Kod źródłowy

Krótkie fragmenty kodu

Wszelkie jednolinijkowe instrukcje języka programowania powinny być zawarte pomiędzy obróconymi apostrofami: `kod instrukcji` lub ``console.log(`string`);``.

Kod wielolinijkowy

Dodaj fragment kodu komendą . Fragmenty kodu zajmujące całą lub więcej linijek powinny być umieszczone w wielolinijkowym fragmencie kodu. Znaczniki ``` lub ~~~ umożliwiają kolorowanie różnych języków programowania. Możemy nadać nazwę języka programowania używając auto-uzupełnienia, kod został pokolorowany używając konkretnych ustawień kolorowania składni:

```javascript
document.write('Hello World');
```

Możesz zaznaczyć również już wklejony kod w edytorze, i użyć komendy  by zamienić go w kod. Użyj kombinacji Ctrl+`, by dodać fragment kodu bez oznaczników języka.

Tabelki

Dodaj przykładową tabelkę używając komendy . Przykładowa tabelka składa się z dwóch kolumn, nagłówka i jednego wiersza.

Wygeneruj tabelkę na podstawie szablonu. Oddziel komórki separatorem ; lub |, a następnie zaznacz szablonu.

nazwisko;dziedzina;odkrycie
Pitagoras;mathematics;Pythagorean Theorem
Albert Einstein;physics;General Relativity
Marie Curie, Pierre Curie;chemistry;Radium, Polonium

Użyj komendy by zamienić zaznaczony szablon na tabelkę Markdown.

Lista uporządkowana i nieuporządkowana

Możliwe jest tworzenie listy numerowanych oraz wypunktowanych. Wystarczy, że pierwszym znakiem linii będzie * lub - dla listy nieuporządkowanej oraz 1. dla listy uporządkowanej.

Użyj komendy by dodać listę uporządkowaną.

1. Lista numerowana
2. Lista numerowana

Użyj komendy by dodać listę nieuporządkowaną.

* Lista wypunktowana
* Lista wypunktowana
** Lista wypunktowana (drugi poziom)

Składnia Markdown

Edytor obsługuje składnię Markdown, która składa się ze znaków specjalnych. Dostępne komendy, jak formatowanie , dodanie tabelki lub fragmentu kodu są w pewnym sensie świadome otaczającej jej składni, i postarają się unikać uszkodzenia jej.

Dla przykładu, używając tylko dostępnych komend, nie możemy dodać formatowania pogrubienia do kodu wielolinijkowego, albo dodać listy do tabelki - mogłoby to doprowadzić do uszkodzenia składni.

W pewnych odosobnionych przypadkach brak nowej linii przed elementami markdown również mógłby uszkodzić składnie, dlatego edytor dodaje brakujące nowe linie. Dla przykładu, dodanie formatowania pochylenia zaraz po tabelce, mogłoby zostać błędne zinterpretowane, więc edytor doda oddzielającą nową linię pomiędzy tabelką, a pochyleniem.

Skróty klawiszowe

Skróty formatujące, kiedy w edytorze znajduje się pojedynczy kursor, wstawiają sformatowany tekst przykładowy. Jeśli w edytorze znajduje się zaznaczenie (słowo, linijka, paragraf), wtedy zaznaczenie zostaje sformatowane.

  • Ctrl+B - dodaj pogrubienie lub pogrub zaznaczenie
  • Ctrl+I - dodaj pochylenie lub pochyl zaznaczenie
  • Ctrl+U - dodaj podkreślenie lub podkreśl zaznaczenie
  • Ctrl+S - dodaj przekreślenie lub przekreśl zaznaczenie

Notacja Klawiszy

  • Alt+K - dodaj notację klawiszy

Fragment kodu bez oznacznika

  • Alt+C - dodaj pusty fragment kodu

Skróty operujące na kodzie i linijkach:

  • Alt+L - zaznaczenie całej linii
  • Alt+, Alt+ - przeniesienie linijki w której znajduje się kursor w górę/dół.
  • Tab/⌘+] - dodaj wcięcie (wcięcie w prawo)
  • Shit+Tab/⌘+[ - usunięcie wcięcia (wycięcie w lewo)

Dodawanie postów:

  • Ctrl+Enter - dodaj post
  • ⌘+Enter - dodaj post (MacOS)